Версия для печати темы
MyDC.ru _ Скрипты для RusHub'а _ RusHub: Запрет неразрывного пробела
Автор: ShadoWx 26.1.2012, 16:34
Автор: Setuper
Название: Запрет неразрывного пробела в чате или ПМ.
Описание:
Этот символ не распознается хаб-клиентами и им могут воспользоваться спамеры для рассылки любой рекламы, обхода антимата и пр.
Идею буквально вчера предложил Andrean, когда проверял мои RegEx'ы.
Если не хотите перегружать хаб скриптами, то просто добавьте этот символ в антирекламу.
Символ неразрывного переноса виден в блокноте, просто скопируйте и поставьте этот символ в вашу антирекламу.
Код
local sBot = Config.sHubBot
function OnChat(UID, sData)
if UID.iProfile == -1 or UID.iProfile == 3 then
local sText = sData:sub(#UID.sNick + 4, -1)
if sText:find"\160" then
Core.SendToUser(UID, "*** Использование неразрывного пробела в тексте запрещено!", sBot)
return true
end
end
end
function OnTo(UID, sData)
if UID.iProfile == -1 or UID.iProfile == 3 then
local sTo, sText = sData:match("^%$To:%s+(%S+)%s+From:%s+(.*)")
if sText:find"\160" then
Core.SendToUser(UID, "*** Использование неразрывного пробела в тексте запрещено!", sBot, sTo)
return true
end
end
end
P.S. Надеюсь вместе, мы шаг за шагом увеличим функционал нашего хаб-сервера .. Спасибо Илье за правку черновой копии скрипта.
Автор: Ksan 26.1.2012, 17:21
ShadoWx, разве в АПИ Русхаба нет возможности объединить в одной функции и чат и приват?
Если есть, сделай это, так как код один и тот же, только шапка разная.
При одинаковой функциональности кода будет 2 раза меньше.
И ещё - делай сразу так:
Код
if sData
вместо
Код
if sText
и удали предыдущую строку, где ты получаешь sText.
Для твоего кода совершенно ни к чему захватывать сообщение отдельно.
Автор: Setuper 26.1.2012, 17:31
Ksan,
Код
Core.SendToUser(tUser, "*** Использование неразрывного пробела в тексте запрещено!", sBot)
Код
Core.SendToUser(tUser, "*** Использование неразрывного пробела в тексте запрещено!", sBot, sTo)
чуешь разницу?
Автор: Ksan 26.1.2012, 17:34
Setuper, я это видел. К тому же, там вообще не sTo должно быть, а sFrom, если уж на то пошло.
Но разве ты не делал возможность объединять функции, делая разницу только в аргументах?
Я что-то такое помню из твоих давних разговоров.
Ты вроде говорил, что подставляешь один аргумент - сообщение идёт туда.
Ведь sFrom = tUser.sNick (или как там он у вас в Русхабе пишется)
В соообщении от бота sTo совершенно ни к чему, это же ник того, кому пытался юзер отправить сообщение.
А нужен ли вообще вместо sTo - sFrom, я не могу сказать, ибо в АПИ Русхаба не разбираюсь.
В Птоке точно не нужен, так как направление уже указано через tUser.
Автор: ShadoWx 26.1.2012, 17:56
Сейчас протестировал скрипт, у меня он пропускает текст с неразрывным интервалом ... просто копирую из блокнота этот символ в чат или пм
я запутался..
Автор: Setuper 26.1.2012, 20:28
Ksan, ну если не разбираешься, то зачем советы давать?
В русхабе в функции Core.SendToUser четвёртый аргумент отвечает за личку, то есть команда:
Код
Core.SendToUser(tUser, sMsg, sBot, sTo)
отправит сообщение sMsg в личку между пользователем tUser и ником sTo с именем бота sBot в сообщении.
По NMDC протоколу это будет выглядеть так:
Код
$To: [tUser.sNick] From: [sTo] $<[sBot]> [sMsg]|
Автор: Ksan 26.1.2012, 20:29
Setuper, как у тебя всё запутано!
Извини, даже после твоего пояснения я не понял, то ли ты там описал небрежно, то ли что..Не хочется развивать разбор этих нюансов..
Что до обвинений меня - так помогайте сами, человек уже запарил чат хаба Майдц, мой приват там же, я хоть пытаюсь помочь, а те, кто занимается Русхабом, упорно делают вид, что не замечают его просьбы. И тут ты появился только после того, когда я что-то не так подсказал. Как понимаю, так и подсказываю.
ShadoWx, вот тебе работающий на Птоке код:
Код
function ChatArrival(tUser, sData)
local sMsg = sData:match("^%b<>%s(.-)$")
if sMsg:find"" then
Core.SendToNick("ShadoWx", "Неразрывный перенос")
return true
elseif sMsg:find" " then
Core.SendToNick("ShadoWx", "Неразрывный пробел")
return true
end
end
Попытайся переделать его под себя. Хотя вроде они похожи.
Автор: Setuper 26.1.2012, 20:39
ShadoWx, подправил твой первый пост, теперь должно работать
Автор: ShadoWx 26.1.2012, 21:27
Ksan, Setuper, большое спасибо
Автор: Setuper 26.1.2012, 21:38
Ksan, Ты думаешь я ему ни подсказываю?
Пожалуйста не обижайся на мою критику, я иногда бываю резок, когда дело касается нюансов. Отчасти я так сказал только для того чтобы ты обратил внимание на нюансы, а не пытался заменить код на более простой, но менее функциональный.
Теперь аналог этого кода для птохи, для того чтобы можно было попробовать как это работает:
Код
local sBot = "Bot"
function ChatArrival(tUser, sData)
if tUser.iProfile == -1 or tUser.iProfile == 3 then
local sText = sData:sub(#tUser.sNick + 4, -2)
if sText:find"\160" then
SendToUser(tUser, "*** Использование неразрывного пробела в тексте запрещено!", sBot)
return true
end
end
end
function ToArrival(tUser, sData)
if tUser.iProfile == -1 or tUser.iProfile == 3 then
local sTo, sText = sData:sub(1, -2):match("^%$To:%s+(%S+)%s+From:%s+(.*)")
if sText:find"\160" then
SendToUser(tUser, "*** Использование неразрывного пробела в тексте запрещено!", sBot, sTo)
return true
end
end
end
function SendToUser(tUser, sMsg, sNick, sSender)
if sSender and sNick then
Core.SendToUser(tUser, (("$To: %s From: %s $<%s> %s"):format(tUser.sNick, sSender, sNick, sMsg)))
elseif sNick then
Core.SendToUser(tUser, (("<%s> %s"):format(sNick, sMsg)))
end
end
P.S. Для того чтобы набрать неразрывный пробел нужно включить Num Lock и, удерживая alt, набрать 0160 на расширенной клавиатуре, после этого отпустить alt.
Автор: Enyby 26.1.2012, 21:58
Setuper, можно набрать ALT+255 - эффект будет тот же. Просто в первом случае набор идет через юникод, а во втором через win1251.
Автор: Ksan 26.1.2012, 22:20
Да знаю я, как эти символы набрать на клавиатуре..