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

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

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

Сейчас протестировал скрипт, у меня он пропускает текст с неразрывным интервалом ... просто копирую из блокнота этот символ в чат или пм

я запутался.. what1.gif

Автор: 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, большое спасибо surrender.gif

Автор: 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

Да знаю я, как эти символы набрать на клавиатуре..