Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
22.11.2008, 17:08
Сообщение
#141
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Да.. "как-то так". Но ведь не будешь на все возможные сочетания символов свои захваты городить? Поэтому в примере и используются (%S) - работает, ты ж сам видел. Но вот с окончанием захвата (а может, и с началом?) - проблема.
|
|
|
22.11.2008, 17:22
Сообщение
#142
|
|
Освоившийся участник Группа: Пользователи Сообщений: 307 Регистрация: 11.7.2008 Пользователь №: 173 Спасибо сказали: 31 раз |
Цитата("district") Задача - определить наличие в нике четырех и более одинаковых символов подряд. Код ...
local _,_,Test=string.find("AAAzzzzddd", "(.)%1%1%1") if not Test then SendToAll("Нету") //Ну и ладно.. else SendToAll("Есть - " . Test) //4 одинаковых символа, тут дисконнект юзера, бан, etc. end ... |
|
|
22.11.2008, 18:29
Сообщение
#143
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
хм... странно... а тэги этих самых юзеров можешь написать сюда? Надо разобраться из-за чего не происходит захвата.
по поводу повторений в нике думаю, что можно сделать так: Код function CheckRepeat(sStr)
local sNewChar,sOldChar,iC,iRepeat="","",1,4 for i=1,sStr:len() do sNewChar=sStr:sub(i,i) if sNewChar==sOldChar then iC=iC+1 else iC=1 end if iC>=iRepeat then return true end sOldChar=sNewChar end end function CheckNick(tUser) if CheckRepeat(tUser.sName) then tUser:SendData("Bad Nick.") tUser:Disconnect() end end |
|
|
22.11.2008, 18:39
Сообщение
#144
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Sephiroth_Lukaw
Ну не знаю, что имел в виду уважаемый докладчик.. Или у меня лыжи совсем уже не едут..)) Запустил в таком виде: Код sBot = frmHub:GetHubBotName() function MyINFOArrival(user) local _,_,Test=string.find("AAAzzzzddd", "(.)%1%1%1") if Test then SendPmToNick("[INT]district",sBot, ""..user.sName.."") end end Ну код мне и выдал каждый ник каждого юзера, при каждом входящем майинфо. В чем тут прикол? Что-то не догоняю :( |
|
|
22.11.2008, 18:42
Сообщение
#145
|
|
Освоившийся участник Группа: Пользователи Сообщений: 307 Регистрация: 11.7.2008 Пользователь №: 173 Спасибо сказали: 31 раз |
ну, по идее, регулярки вроде бы всегда медленнее...
P.S. local _,_,Test=string.find(user.sName, "(.)%1%1%1") P.P.S. И вправду, ты всегда, зачем то лишние "" вставляешь ""..user.sName.."" -> user.sName |
|
|
22.11.2008, 18:55
Сообщение
#146
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Действительно, наверное всё же оптимальнее использовать регулярное выражение:
Код (.)%1%1%1 Код function ValidateNickArrival(tUser)
if tUser.sName:find("(.)%1%1%1") then tUser:SendData("Bad nick") tUser:Disconnect() end end |
|
|
22.11.2008, 19:26
Сообщение
#147
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Setuper
Думаешь, дело может быть в тэге? Мы ж не весь майинфо стринг исследуем, а конкретный юзерский объект... Код $MyINFO $ALL asss0000 сотона<StrgDC++ V:2.2,M:A,H:1/0/0,S:3>$ $100$$140742256829$| -есть захват Код $MyINFO $ALL asss00001 сотона<StrgDC++ V:2.2,M:A,H:1/0/0,S:3>$ $100$$140742256829$| нет захвата Кстати, этот захват я попробовал и в ValidateNickArrival, и в NewUserConnected, на всякий случай. Результат тот же. ============================================================== Ай ребята, ну где ж вы раньше были с таким элегантным и эффективным регулярным выражением ))) Целый день убил, пытаясь захват сделать. Работает! Может, еще какие-нибудь хитрые выражения есть? (Хабик небольшой, народу немного, нагрузка на ресурсы не бешеная) |
|
|
22.11.2008, 20:40
Сообщение
#148
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Если имя клиента является неизвестным, то тег клиента приклеивается к описанию!!!
Функция коррекции данных пользователя: Код function GetNormalValue(tUser) if not tUser.sTag then local _,_,sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit=tUser .sDescription:find("(.*)(<(.+)%sV:(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+)>)$") if not sDescription then _,_,sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit= tUser.sDescription:find("(.*)(<(.+)%sV:(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+),L:(%d+)>)$") end if not sDescription then _,_,sDescription,sTag,sClient,sClientVersion,sMode,iNormalHubs,iRegHubs,iOpHubs,iSlots,iLlimit= tUser.sDescription:find("(.*)(<(.+)%sV:(.-),M:(.-),H:(%d+)/(%d+)/(%d+),S:(%d+),B:(%d+)>)$") end tUser.sDescription=sDescription tUser.sTag=sTag tUser.sClient=sClient tUser.sClientVersion=sClientVersion tUser.sMode=sMode tUser.iNormalHubs=iNormalHubs tUser.iRegHubs=iRegHubs tUser.iOpHubs=iOpHubs tUser.iHubs=iNormalHubs+iRegHubs+iOpHubs tUser.iSlots=iSlots tUser.iLlimit=iLlimit end return tUser end Использование коррекции: Код function MyINFOArrival(tUser)
tUser=GetNormalValue(tUser) tUser:SendData("sName = "..tostring(tUser.sName).."\n".. "sClient = "..tostring(tUser.sClient).."\n".. "sClientVersion = "..tostring(tUser.sClientVersion).."\n".. "sMode = "..tostring(tUser.sMode).."\n".. "sMyInfoString = "..tostring(tUser.sMyInfoString:sub(1,-2)).."\n".. "iShareSize = "..tostring(tUser.iShareSize).."\n".. "iHubs = "..tostring(tUser.iHubs).."\n".. "iSlots = "..tostring(tUser.iSlots).."\n".. "sTag = "..tostring(tUser.sTag).."\n".. "sDescription = "..tostring(tUser.sDescription).."\n".. "sConnection = "..tostring(tUser.sConnection).."\n".. "sEmail = "..tostring(tUser.sEmail).."\n".. "iNormalHubs = "..tostring(tUser.iNormalHubs).."\n".. "iRegHubs = "..tostring(tUser.iRegHubs).."\n".. "iOpHubs = "..tostring(tUser.iOpHubs)) end |
|
|
22.11.2008, 22:49
Сообщение
#149
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
А как захватить несколько сообщений юзера? Т.е. если он пишет
Цитата <user>10. <user>2. <user>100. <user>240 его кикало. В моём представлении это можно сделать только конкатацией. Есть ещё какие то варианты и как будет реагировать если между сообщениями этого юзера вклинится сообщения ещё кого то? |
|
|
22.11.2008, 23:06
Сообщение
#150
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Поковыряй люцефера, там есть такая штука. Запоминается N сообщений каждого юзера, база, конечно, получется огромной, тогда надо запоминать еще и время сообщений, чтобы очищать ненужные записи, это хорошая, но довольно затратная и сложная (если сделать всё правильно) функция антирекламы...
|
|
|
23.11.2008, 0:46
Сообщение
#151
|
|
Местная ТехПоддержка Группа: Администраторы Сообщений: 1 875 Регистрация: 18.7.2008 Из: Моск. Обл, г. королев, район Болшево Пользователь №: 221 Спасибо сказали: 220 раз |
Wariner, я вот что посоветую... Ковыряй настройки хаба =) Там есть антифлуд. настрой его как надо и все.
|
|
|
23.11.2008, 1:44
Сообщение
#152
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Ну хватит говорить лишь бы о чем-то! Речь идет о сообщениях не повторяющихся, но в сумме дающих адрес.
Идеальной антирекламы сделать не получится, т.к. не будет конца извращениям, генерируемым мозгом человека... В птоке АНТИФЛУД, а это отностится к антирекламе, которую туда еще не влепили. P.S. удалите сами весь этот "базар" |
|
|
23.11.2008, 6:37
Сообщение
#153
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
В свете промелькнувшего "регулярного выражения" хотелось бы снова поднять эту тему. Может, мой вопрос и не затрагивает те самые регулярки? Попытаюсь изложить предметно.
Пока что, в тестовом варианте, проверка юзера идет на трех этапах: ValidateNickArrival MyInfoArrival NewUserConnected (Насколько я понял, именно в такой последовательности нужно делать, на каждом этапе используя информацию, доступную именно на этом этапе) Вот есть условие: Код if not (user.bOperator or tPNicks[user.sName] or tPIps[user.sIP] or tPProfile[(GetProfileName(GetUserProfile(user.sName)))]) then которое используется как отменяющее проверку (приписано в начале каждой из трех функций) Хотелось бы сделать применение условий более гибким, т е создать локальные группы, а условие, отменяющее проверку и отсылающее к сопоставлению с "членством" в локальной группе, перенести в начало каждой из кучи прикладных функций: NoProxy, OneIP4OneClient, CheckNick, CheckDesc, CheckEmail, и т д, которые, как я где-то писал об этой идее, подключаются по мере необходимости простым раскомментированием имени функции. например как-то так локальная группа А = принадлежность к таблицам х, у и/или профилю такому-то... Что-то мудревато пока получается, в голове не складывается. Может, есть наработки, чтобы не изобретать велосипед? Setuper Почему ж все-таки захваты не работают? Я посмотрел крайний захват МайИнфо, который ты привел. В сравнении с моим первый "блином комом", там нет лишнего %S+ , которое я по ошибке поставил между перечислением хабов и слотами. Но все равно работает от раза к разу, то все выдает, то все по нулям. С чем тут еще может быть связано? Речь-то пока ни о каких не левых юзерах, теги всех присутствующих учтены в ClientTags, хотя, стоит крыжик "Принимать тэг от неизвестного клиента за действительный". Может, это баг Птоки такой, забыть и не мучиться? Птока - 0360 LUA 5.1.2 |
|
|
23.11.2008, 13:21
Сообщение
#154
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ты идёшь по моим стопам. Именно такую фишку я реализовал в моём боте, но немного более сложную чем ты предполагаешь сделать, а именно, в базе данных существует таблица с действиями. Таблица состоит из следующих столбцов (строк может быть любое количество): он_офф, Тип_действия, действие, номер_профиля_s, номер_профиля_e, номер_текущего_профиля_s, номер_текущего_профиля_e, ip_s, ip_e, ник.
В таблице указаны действия и их применимость или не применимость к определённой группе. Например, тип_действия=оповещение, действие=вход_с_запрещённых_ip, номер_профиля_s=5, номер_профиля_e=12, номер_текущего_профиля_s=1, номер_текущего_профиля_e=nil, ip_s=nil, ip_e=nil, ник=nil. Таким образом, оповещение о входе пользователя с запрещённым ip поступит профилям, начиная с номера 5, до номера 12, если текущий профиль меньше пятого, однако, если текущий профиль пользователя больше, либо равен пятому, то параметр номер_текущего_профиля_s говорить сколько надо прибавить к текущему профилю, чтобы отсылать оповещений. В данном случае надо прибавить 1, а так как номер_текущего_профиля_e=nil, то последний профиль не изменяется, таким образом, если текущий профиль меньше пятого, то оповещение отправится всем профилям от 5 до 12, иначе оповещение отправится профилям от (текущий_профиль + 1) до 12. Кроме этого, если параметры ip_s, ip_e и ник не указаны, то оповещение отправляется только профилям, если же, например, ip_s=0, ip_e=167772160, то оповещение прийдёт только тем профилям, которым разрешено плюс ip этих пользователей должны будут лежать в диапазоне 0.0.0.0 (=0) - 10.0.0.0 (=167772160), а если ещё указывается и ник, то оповещение отправляется указанному нику, но при условии, что профилю с этим ником разрешена отсылка, и ip адрес этого ника лежит в разрешённом диапазоне. Конечно это очень сложный механизм со сложной реализацией, который использует хранение в базе данных, но этот механизм очень универсальный. Любой действие или антидействие в нём прописано, от отсылки оповещений и менюшек до собственных параметров каждого пользователя. Что касается захватов, то последняя моя функция коррекции должна работать всегда. Как её использовать я тоже прописал. |
|
|
23.11.2008, 18:15
Сообщение
#155
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Setuper
Ясно.. что ничего не ясно Ну да ладно. Вот есть небольшой вопрос: как организовать разделители в менюшках, если в коде использованы вот такие конструкции? Код tRC = {{"Дать иммунитет", " add %[line:Ник]" }, { "Забрать иммунитет", " remove %[line:Ник]" } } Сверху этого пункта в меню получается еще три, хотелось бы их отделить, по типу $UserCommand 0 3 |
|
|
23.11.2008, 18:19
Сообщение
#156
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
зачем все эти навороты с разделениями, которые потом всё равно собираются в один код отправки, тем более, что эти разделения только для разработчика.
Просто пиши уже готовые коды без разделений |
|
|
23.11.2008, 18:54
Сообщение
#157
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Я вот что имел в виду (на картинке)
Тут приведен пример правда из обычного оформления юзерской команды, через сенд дата. Сверху и снизу меню скрипта погоды обставлено "разделителями" - снизу есть, сверху не получается. (красная линия) Даже в обычном варианте трудности. Как тут быть? И тем более, как быть в первом вопросе?
Прикрепленные файлы
|
|
|
23.11.2008, 19:12
Сообщение
#158
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Разделитель нельзя поставить снизу менюшки со стрелочкой. Если ты немного задумаешься как отправляются менюшки, то думаю, что ты сможешь понять почему.
Например в твоём случае: есть менюшка: Объявления, Релизы, Запросы\\Подменю Если после этой менюшки ставить разделитель, то он появится после "Подменю" а не после "Объявления, Релизы, Запросы", потому что разделитель нельзя вставить между ними, так как они отправляются как единое целое. Надеюсь ясно изложил? |
|
|
23.11.2008, 20:38
Сообщение
#159
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Setuper
Цитата Разделитель нельзя поставить снизу менюшки со стрелочкой. примерно так и думал, спасибо. Насчет разделителей, когда пункты меню создаются как Код tRC = {{"Дать иммунитет", " add %[line:Ник]" }, { "Забрать иммунитет", " remove %[line:Ник]" } } вопрос остался открытым..
|
|
|
23.11.2008, 20:39
Сообщение
#160
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
2Setuper: если не сложно можешь сказать несколько слов о метатаблицах. Я как всегда несколько не понял описания на
|
|
|
Похожие темы
|
Сейчас: 27.11.2024, 4:37 |