Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Kорзина _ Нормальная автозамена

Автор: JlёJluK 7.7.2009, 16:23

Ищу нормальный скрипт автозамены на птоку!
который будет реагировать на все слова в предложении (сообщении) а не заменять только одно слово!

Кому не сложно - напишите под апи2 !

Автор: Serx 7.7.2009, 16:33

что заменять? в каких предложениях? Антимат с Антирекламой есть такие на этом форуме.

Автор: JlёJluK 7.7.2009, 17:10

А если я не хочу антирекламуи автозамену?

заменять все слова, которые булдт в списке!

Автор: степашка 7.7.2009, 17:27

ну так антиреклама и заменяет слова, которые имеются в списке. например, если в автозамене прописаны слова ЗАЯЦ и КАПУСТА, то при попытке ввести в чат или личку фразу ЗАЙЦЫ ЛЮБЯТ КАПУСТУ выведется фраза автозамены. или я не правильно понимаю твою фразу "заменять все слова, которые булдт в списке!"? скажи тогда какую ты цель преследуешь, может станет понятнее

Автор: Wariner 7.7.2009, 17:28

когда просите написать скрипт извольте подробнее излагать идею и цель!

Автор: JlёJluK 7.7.2009, 17:46

чтоб каждое слово заменялось на то слово, которое будет вписано, а не произвольное.

например:

бля=replaceпарам пам пам

=replace - Замена слова

Автор: Wariner 7.7.2009, 18:12

Код
local tGsub = {
       ["один"] = "1",
       ["бабки"] = "деньги",
}

function ChatArrival(tUser, sData)
    sData = sData:sub(1,-2)
    for i,v in pairs(tGsub) do
         sData = sData:gsub(i,v)
    end
    Core.SendToAll(sData)
    return true
end

Автор: JlёJluK 7.7.2009, 20:12

[21:12:08] <keeper> <keeper> 1
[21:12:14] <keeper> <keeper> деньги

Почему ник вылезает?

Автор: Wariner 7.7.2009, 20:29

поправил код

Автор: district 8.7.2009, 0:58

Геноссе Wariner !
Есть один подводный камень в таком простом методе, когда не вычленяется непосредственный текст сообщения, а гсабится ( или "парсится") вся сДата оптом. Был у меня один момент, когда то, зашел юзер с ником "хулиганище" и что-то написал в чате, а скрипт анимата, который тогда стоял, прогсабил вот так : ( была замена "хули" на "почему")

Цитата
<почемуганище> .... бла бла

big_smile1.gif
поэтому по-хорошему надо бы, так сказать, добавить в реализацию толику избирательности.

Автор: Wariner 8.7.2009, 5:53

да я всё надеюсь, что юзера сами хоть что то начнут дописывать....

Автор: district 8.7.2009, 6:13

Ну пофлудю разок, надеюсь не забанят nothing_to_say.gif
Wariner :

Цитата
да я всё надеюсь, что юзера сами хоть что то начнут дописывать....

М.М.Жванецкий :
Цитата
Ты же и придумаешь, ты же и будешь делать, тебя же и накажут, что плохо сделал.

Вот так и живем big_smile1.gif

Автор: Uncle_Dif 8.7.2009, 11:42

Стесняюсь спросить, это самостоятельный готовый к употреблению скрипт? или кусок, который надо куда-то вставить?

Автор: district 8.7.2009, 12:36

Если не ошибаюсь, чтобы отрезать из sData ник юзера с прибамбасами ( скобками < > и пробелом), должно быть как-то так :

Код
sData = sData:sub((tUser.sNick):len()+4,-2)


Uncle_Dif
Этот код может и самостоятельно работать, но зачем создавать на хабе кучу мелких скриптиков в которых постепенно и рогатый ногу сломает?
Вот смотри. ChatArrival это "Event (событие)" API2 и одновременно "функция" скрипта. В одном скрипте, насколько я понимаю, не могут быть две функции с таким названием. Чтобы не городить огород, достаточно подумать и добавить приведенный код в какой-нибудь скрипт схожей тематики. Только надо учесть, что если отрезать ник юзера в самом начале ChatArrival, то все нижеследующие обращения к переменной sData внутри функции будут получать усеченный вариант sData.
А информация по событиям API2 http://mydc.ru/r/?http://wiki.ptokax.ch/doku.php/scriptinghelp/ptokaxapi2,
хотя, может есть и более внятный вариант описания, сам буду рад, если кто подскажет.

Автор: Setuper 8.7.2009, 12:58

http://mydc.ru/topic118.html

Автор: Uncle_Dif 8.7.2009, 13:01

Uncle_Dif
Этот код может и самостоятельно работать, но зачем создавать на хабе кучу мелких скриптиков в которых постепенно и рогатый ногу сломает?

Зачем: мне понравилась идея автозамены слов. Мне, как старорежимному человеку, стремно видеть, например, слово "хай" (напоминает "хайль....") и некоторые другие.
Я бы с удовольствием поимел бы такой скриптик. На форуме есть Антимат-антиреклама, я его установил, но:
1. Там много мне ненужного, придется отрезать.
2. Тестирую его словом "хай"- пропускает без замены, вот теперь чешу репу...
Вот такая малая моя проблемка.

Автор: Wariner 8.7.2009, 21:45

хз что у теяб там не работает, может внёс не правильно?

Автор: Uncle_Dif 8.7.2009, 21:53

Цитата(Wariner @ 8.7.2009, 22:45) *
хз что у теяб там не работает, может внёс не правильно?


Тоже чего-то не пойму. Я скачал и установил анти-мат-рекламу в неизменном виде.
Еще один экземпляр этого антиМР (анти-мат-реклама) переименовал и вставил "хай"- не работает. Я еще поюзаю, может сам пойму где и чего непонимаю..

Автор: serrrios 9.7.2009, 14:34

Цитата(Wariner @ 7.7.2009, 19:12) *
Код
local tGsub = {
       ["один"] = "1",
       ["бабки"] = "деньги",
}

function ChatArrival(tUser, sData)
    sData = sData:sub(1,-2)
    for i,v in pairs(tGsub) do
         sData = sData:gsub(i,v)
    end
    Core.SendToAll(sData)
    return true
end

При включении сей малого кода у меня перестают работать команды (!rules, !nickban и тд)...можно ли поправить?

Автор: Артём 9.7.2009, 15:03

2serrrios
А этот скрипт тебе не подойдёт?
 Антимат_автозамена_мата__newapi.lua ( 4.53 килобайт ) : 30

Автор: district 9.7.2009, 15:13

serrrios

Код
if not sData:find("^%p%S+") then ...

Вот таким условием нужно ограничить срабатывание кода, самое простое что на ум пришло. Иначе он ЛЮБЫЕ данные дискардит, возвращая true и не допуская их к отработке хабом.

В таком варианте нужно отрезать от sData ник юзера с прибамбасами, как я предложил выше.

Код
function ChatArrival(tUser, sData)
   local sData = sData:sub((tUser.sNick):len()+4,-2)
   if not sData:find("^%p%S+") then
        for i,v in pairs(tGsub) do
          sData = sData:gsub(i,v)
       end
       Core.SendToAll(sData)
       return true
    end
end

Автор: Wariner 10.7.2009, 13:24

или просто скрипт поставить в самый конец)))