Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
21.11.2008, 10:45
Сообщение
#121
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Быстрота выполнения в обоих вариантах одинакова, однако, первый вариант (с тремя функциями) лучше с точки зрения хорошего стиля программирования. Если есть отдельное действие, то лучше это действие выделять в отдельную функцию.
По поводу второго вопроса. Да, так можно сделать, но только в данном языке это будут глобальные переменные а не макросы. Макросов в языке lua нет, они есть в языке с/с++. Макросы работают как инструкции препроцессора и встраиваются прямо в код. В отличии от макросов языка с/с++, глобальные переменные языка LUA не обладают таким замечательным свойством, как встраиваемость в код, и поэтому несут некоторую нагрузку. Поэтому программисты lua в целях оптимизации стараются по возможности избегать использование глобальных переменных, в отличии от программистов c/с++, которые для оптимизации всегда используют макросы. |
|
|
21.11.2008, 12:30
Сообщение
#122
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Цитата однако, первый вариант (с тремя функциями) лучше с точки зрения хорошего стиля программирования. Йес! Не зря не спим две недели, кое-что, значит, получается :dance: Цитата В отличии от макросов языка с/с++, глобальные переменные языка LUA не обладают таким замечательным свойством, как встраиваемость в код, и поэтому несут некоторую нагрузку. Поэтому программисты lua в целях оптимизации стараются по возможности избегать использование глобальных переменных, Примерно так и думал, чисто интуитивно )) Уф.. опять вопрос назрел. Понимаю, что по-хорошему надо бы освоить все стринг.файнды, но слишком обширная тема, с наскоку не разберешься. Вот есть таблица Код tFbdClient = { "XZDC++", -- тип клиента } есть например функция Код function MyINFOArrival(user,data) for i,v in ipairs(tFbdClient) do if (string.find(user.sMyInfoString:lower(),v,1,true)) then client = string.find(???) msg = "*** Вы пользуетесь типом клиента, запрещенным на этом хабе.\r\n Ваш клиент: "..client.." ... Что нужно указать в Код string.find(???) , чтобы в сообщении было не UNKNOWN TAG, а тот самый XZDC++ ? Или как-то по другому поступить нужно?
|
|
|
21.11.2008, 13:28
Сообщение
#123
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Во-первых, зачем приводить MyINFO строку к нижнему регистру? user.sMyInfoString:lower() - этого делать не надо.
Во-вторых, по поводу захватов и регулярных выражений можешь почитать тут: http://mydc.ru/topic266.html В-третьих, никаких string.find-ов тут не нужно, а код будет таким: Код function MyINFOArrival(tUser)
for i,v in ipairs(tFbdClient) do if v==tUser.sClient then msg = "*** Вы пользуетесь типом клиента, запрещенным на этом хабе.\r\n Ваш клиент: "..v.." break --для оптимизации end end ... |
|
|
21.11.2008, 16:05
Сообщение
#124
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Окей, оно и правильно что вопросы сюда перенесены.
Но приведенный код - без захвата - вообще не работает, хоть sClient, хоть sClientVersion. |
|
|
21.11.2008, 16:20
Сообщение
#125
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Просто поле sClient берёт названия клиентов из файла cfg/ClientTags.xml и если в этом файле тега нет, то клиент помечается как неизвестный)))
С захватами не разобрался? Может сам напишешь? |
|
|
21.11.2008, 19:40
Сообщение
#126
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Разберусь и напишу обязательно.
Что sClient актуально только тогда, когда тэг учтен в клиент ClientTags, еще вчера понял )) Там просто хитрая конструкция хочу сделать, запрещенными могут быть не только клиенты, но и их отдельные версии (ну какому амину что от сердца дальше), из майинфо стринга вытаскиваться должны и клиент, и версия, если таковые есть в запретном списке. ..а пока провел небольшой эксперимент. сама функция MyInfoArrival отдает, как выяснилось, SClient , но не sClientVersion Код Bot = frmHub:GetHubBotName() - работаетfunction MyINFOArrival(user,data) nick = "(ник админа)" rpt = ""..user.sName.." "..user.sClient.."" SendPmToNick(nick, Bot, rpt) end Код Bot = frmHub:GetHubBotName() - attempt to call field 'sClientVersion' (a string value)function MyINFOArrival(user,data) nick = "(ник админа)" rpt = ""..user.sName.." "..user.sClient.." "..user.sClientVersion.."" SendPmToNick(nick, Bot, rpt) end а вот NewUserConnected отдает и версию тоже Код Bot = frmHub:GetHubBotName()
function NewUserConnected(user) nick = "[INT]district" rpt = ""..user.sName.." "..user.sClient..""..user.sClientVersion.."" SendPmToNick(nick, Bot, rpt) end |
|
|
21.11.2008, 20:05
Сообщение
#127
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Это всё верно, он только зачем пустые строки вставляешь?
Код rpt = ""..user.sName.." "..user.sClient..""..user.sClientVersion.."" не проще ли написать так:Код rpt = user.sName.." "..user.sClient..user.sClientVersion Лишняя конкатенация ни к чему.И ещё второй раз уже пишу, что для того чтобы не забивать стек лучше не писать неиспользуемые параметры в функции. То есть вместо: Код function MyINFOArrival(user,data) лучше писатьКод function MyINFOArrival(user) И ещё совет: писать переменные в венгерской нотации, так намного понятнее становится что содержит та или иная переменная (какого она типа), да и разработчики PtokaX в функциях апи также используют венгерскую нотацию (sClient, sClientVersion) Поэтому вместо user советую писать tUser |
|
|
21.11.2008, 23:01
Сообщение
#128
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Setuper Будь друг, погоди с нюансами, "нотациями" Ну зевнул я data, ну user а не tUser (к слову, лично у меня t ассоциируется с таблицами). Дойдем и до этого, сейчас вопросы посерьезнее на повестке дня.
Решить задачку с вычленением имени клиента и версии клиента хоть из какого угодно тега (в т ч не прописанного в ClientTags) пока удалось в два этапа, на более хитрое тяму пока не хватает. Код Bot = frmHub:GetHubBotName() function MyINFOArrival(user) nick = "[INT]district" local _,_,xTag=string.find(user.sMyInfoString,"(%b<>)") local_,_,cln,ver=string.find(xTag,"%S(%S+)%s(%S+),M") rpt = "Клиент: "..cln..", Версия: "..ver.."" SendPmToNick(nick, Bot, rpt) end Замечена отдна странность: отсечь лишний "хвост", там где M:A.. и т д просто запятой или %p - не получается. (Это самостоятельный тестовый ботик под АПИ1) |
|
|
21.11.2008, 23:34
Сообщение
#129
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
|
|
|
22.11.2008, 0:13
Сообщение
#130
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код local sBot = frmHub:GetHubBotName()
function MyINFOArrival(tUser) local _,_,sClient,sClientVersion=tUser.sMyInfoString:find("<(.-)%sV?:?(%S+),") local sNick,sMsg="[INT]district","Клиент: "..sClient..", Версия: "..sClientVersion SendPmToNick(sNick,sBot,sMsg) end |
|
|
22.11.2008, 0:44
Сообщение
#131
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Цитата Ваш клиент: XZDC++, Версия: 1.1.0,M:A,H:1/0/0 Я же говорю, простой запятой лишний хвост "M:A,H:1/0/0" не отсекается. (Почему?) А какой смысл тут в знаках "?" ? То, что это "магический символ", понятно, а подробнее? В обзоре захватов по ссылке про то не написано. Цитата Магические символы: ( ) . % + - * ? [ ] ^ $ Перед всеми магическими символами нужно ставить % и вот с этим как-то не клеится. (?) |
|
|
22.11.2008, 0:54
Сообщение
#132
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Цитата %s? - 0 или 1 символ пробела я правильно понял?;) PS прошу прощения что я всё время влезаю просто пытаюсь учится вместе с вами |
|
|
22.11.2008, 0:56
Сообщение
#133
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Да уж... немного неправильно написал... Вот так:
Код local sBot = frmHub:GetHubBotName() function MyINFOArrival(tUser) local _,_,sClient,sClientVersion=tUser.sMyInfoString:find("<(.-)%sV?:?(.-),") local sNick,sMsg="[INT]district","Клиент: "..sClient..", Версия: "..sClientVersion SendPmToNick(sNick,sBot,sMsg) end По поводу вопросика: там в мануале надо смотреть не магические символы, а следующее: Цитата %s - 1 символ пробела %s+ - 1 или более символов пробела %s- - 0 или более символов пробела %s* - 0 или более символов пробела %s? - 0 или 1 символ пробела Соответственно: V? - 0 или 1 символ V, :? - 0 или 1 символ : Из-за чего я именно так сделал? Потому что существуют "левые клиенты", у которых отсутствует спецификатор V:, например, <AvaLink 1.3,M:A,H:0/2/0,S:8> |
|
|
22.11.2008, 3:41
Сообщение
#134
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Имея в виду как раз тот пресловутый АваЛинк, попробовал соорудить доп.проверку для случая, когда в Птоке выбрано "Принимать клиентов без действительного тэга", и когда заходят на том же АваЛинке и им по боку например правило MaxHubs.
Где-то накосячил.. код то пачками шлет лички, то вылетает. Прошу за мелочи не пенять, сейчас главное усвоить как правильно тут должен выглядеть стринг, и почему вылетает суммирование a+b+c и как это искоренить. ( Цитата attempt to perform arithmetic on local 'a' (a nil value) )Код sBot = frmHub:GetHubBotName() function MyINFOArrival(user) local nick = "[INT]district" local _,_,a,b,c,slots,share=user.sMyInfoString:find("H:(%d*)/(%d*)/(%d*)%S+S:(%d*)>%$%s%$.-%$%$(%d*)") hubs = a+b+c rpt = "Юзер: "..user.sName.." Хабы: "..hubs..", Слоты: "..slots.." Шара: "..share.."" SendPmToNick(nick,sBot,rpt) end Иногда эта зараза все-таки работает: Цитата [06:29:37] <БотПрощайМолодость> Юзер: Audion Хабы: 30, Слоты: 30 Шара: 2302216999857 [06:29:37] <БотПрощайМолодость> Юзер: BiNet Хабы: 40, Слоты: 15 Шара: 90021819095 [06:29:44] <БотПрощайМолодость> Юзер: Vetalmax Хабы: 22, Слоты: 15 Шара: 167860596055 [06:29:52] <БотПрощайМолодость> Юзер: [dn+]_karkysha17 Хабы: 22, Слоты: 44 Шара: 23508549985 [06:30:02] <БотПрощайМолодость> Юзер: Marry_Hacker Хабы: 15, Слоты: 10 Шара: 46313775246 [06:31:29] <БотПрощайМолодость> Юзер: Preta Хабы: 22, Слоты: 66 Шара: 158188566610 [06:31:34] <БотПрощайМолодость> Юзер: Vetalmax Хабы: 21, Слоты: 15 Шара: 167860596055 [06:31:39] <БотПрощайМолодость> Юзер: BiNet Хабы: 39, Слоты: 15 Шара: 90021819095 |
|
|
22.11.2008, 5:51
Сообщение
#135
|
|
Освоившийся участник Группа: Пользователи Сообщений: 307 Регистрация: 11.7.2008 Пользователь №: 173 Спасибо сказали: 31 раз |
ммм...а зачем мучать sMyInfoString, если шара, слоты - всё это есть в tUser?>,..,<
P.S. Цитата("district") Шара: 90021819095 http://mydc.ru/topic334.html?view=findpost&p=2490
|
|
|
22.11.2008, 10:34
Сообщение
#136
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Sephiroth_Lukaw
Да не обращай внимания, это просто обычная админская паранойя Кстати! Кто такой tUser?? Сколько раз ко мне нах хаб заходил? Сколько правил нарушил??? Под какими никами?? С каких IP?? С какой шарой? Какие читы использовал, подлец??? ПОЧЕМУ Я НЕ В КУРСЕ????? За ссылку по форматированию шары спасибо, на будущее учту. Только в данном конкретном случае, думаю, вряд ли пригодится: идея была в простом сравнении с frmHub:GetMinShare() Причем - с точностью до байта! Чтоб не фулюганили ...))) А то знаю я этих tUserов, кот за дверь - мыши в пляс, глаз да глаз нужен Setuper А это вот для тебя персонально, вот так работает инспектор логов, который ты написал по моей просьбе. Цитата [2008-11-21 17:49] 172.17.137.174:Локалка <-_-> pt [2008-11-21 17:49] 172.17.137.174:Локалка <-_-> :-O [2008-11-21 17:52] :?? <БотПрощайМолодость> *** Юзер -_- был отключен. Отключил: Master [INT]district. [2008-11-21 17:52] :?? *** Ушёл: -_- [2008-11-21 17:52] :?? <Таможня> *** Пресечена попытка входа на хаб юзеру с запрещенными символами либо буквосочетаниями в нике. Юзер: -_-, IP: [ 172.17.137.174 ]. [2008-11-21 17:53] :?? *** Пришёл: }I{bI}I{A [2008-11-21 17:55] 172.17.137.174:Локалка <}I{bI}I{A> пт [2008-11-21 17:55] 172.17.137.174:Локалка <}I{bI}I{A> не понялза что кикнули с хаба -_- [2008-11-21 17:56] 80.64.95.38:Новотелеком Нск <[INT]district> }I{bI}I{A: ты что, меня тренируешь? [2008-11-21 17:56] 172.17.137.174:Локалка <}I{bI}I{A> [INT]district: ? [2008-11-21 17:56] 80.64.95.38:Новотелеком Нск <[INT]district> посмотри какие у нормальных людей нормальные ники [2008-11-21 17:56] 80.64.95.38:Новотелеком Нск <[INT]district> а с такими - пожалуйста, на иной хаб [2008-11-21 17:56] 172.17.137.174:Локалка <}I{bI}I{A> я не могу придумать еще... фантазии мало [2008-11-21 17:56] 172.17.137.174:Локалка <}I{bI}I{A> тем более мата нет в нике [2008-11-21 17:57] 80.64.95.38:Новотелеком Нск <[INT]district> тогда сделай либо префикс нанки [2008-11-21 17:58] 172.17.137.174:Локалка <}I{bI}I{A> я не разбираюст в нумерах нанок ваще:'-( [2008-11-21 17:58] 80.64.95.38:Новотелеком Нск <[INT]district> либо я за себя не отвечаю ]:-> [2008-11-21 17:58] 172.17.137.174:Локалка <}I{bI}I{A> ок [2008-11-21 17:59] :?? *** Ушёл: }I{bI}I{A [2008-11-21 17:59] :?? *** Пришёл: [313]_WOWIR_500 [2008-11-21 17:59] 172.17.137.174:Локалка <[313]_WOWIR_500> сменил опять [2008-11-21 17:59] :?? *** Пришёл: ConnectionsInspector [2008-11-21 17:59] :?? <ConnectionsInspector> *** Ники, под которыми входил пользователь с IP адресом 172.17.137.174 -_- - 1 раз(а) с этого IP }I{bI}I{A - 1 раз(а) с этого IP [131]L1nk - 1 раз(а) с этого IP [313]_WOWIR_500 - 1 раз(а) с этого IP [2008-11-21 18:00] 80.64.95.38:Новотелеком Нск <[INT]district> [313]_WOWIR_500: [131]L1nk твой ник и хватит придуриваться (ТУТ НЕМАЯ ПАУЗА ) [2008-11-21 18:00] 172.17.137.174:Локалка <[313]_WOWIR_500> [INT]district: а как ты узнаёшь ники, которые были на других хабах и давным давно? а вот вопрос про a+b+c по-прежнему животрепещущ.. Добавив пять строчек в код Код function MyINFOArrival(user) local nick = "[INT]district" local _,_,a,b,c,slots,share=user.sMyInfoString:find(".-H:(%d*)/(%d*)/(%d*)%S+S:(%d*).-%$%$(%d*)") a = a or 0 b = b or 0 c = c or 0 slots = slots or 0 share = share or 0 iHubs = a+b+c rpt = "Юзер: "..user.sName.." Хабы: "..iHubs..", Слоты: "..slots.." Шара: "..share.."" SendPmToNick(nick,sBot,rpt) end получил такую картину: Цитата [15:11:32] <БотПрощайМолодость> Юзер: Gsera(INT) Хабы: 54, Слоты: 54 Шара: 20748169326 [15:11:32] <БотПрощайМолодость> Юзер: KOMMUNIST Хабы: 0, Слоты: 0 Шара: 0 [15:11:34] <БотПрощайМолодость> Юзер: Vetalmax Хабы: 22, Слоты: 15 Шара: 173292041223 Тут юзер KOMMUNIST вполне добропорядочный, но параметры не извлекаются. Это как следует понимать? Что string.find попросту отрабатывать не успевает, или в другом причина? |
|
|
22.11.2008, 13:04
Сообщение
#137
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код local _,_,a,b,c,iSlots,iShareSize=tUser.sMyInfoString:find("H:(%d+)/(%d+)/(%d+),S:(%d+).-%$%$(%d+)")
a,b,c,iSlots,iShareSize=a or 0,b or 0,c or 0,iSlots or 0,iShareSize or 0 local iHubs=a+b+c |
|
|
22.11.2008, 14:39
Сообщение
#138
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Может вот этот скрипт чем-то поможет, поковыряйте...
Прикрепленные файлы
|
|
|
22.11.2008, 16:26
Сообщение
#139
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Setuper По поводу последнего кода: разница я понял только в плюсиках вместо звездочек? В таком варианте - то же самое, порядочных юзеров код принимает за халявщиков.
И еще одна проблема. Хвосты толком не отрабатываются и в такой вот конструкции: Цитата local _,_,a,b,c,d=user.sName:find(".*+?(%S)(%S)(%S)(%S)???") if a and b and c and d then a,b,c,d = a or 0,b or 0,c or 0, d or 0 if a==b and a==c and a==d then Задача - определить наличие в нике четырех и более одинаковых символов подряд. Если ник ass1111 или asss0000 - все нормально. Если допустим asss1111s - все, перестает работать. Если приписать в конце стринга только %S - отрабатывает, но только при наличии ОДНОГО символа в нике после вычленяемых четырех. Если будет asss1111sss - не работает, даже если приписать %S+, %S+? (практически все перепробовал). Как тут быть? Nickolya Спасибо, посмотрим чем там можно поживиться) |
|
|
22.11.2008, 16:44
Сообщение
#140
|
|
Освоившийся участник Группа: Пользователи Сообщений: 307 Регистрация: 11.7.2008 Пользователь №: 173 Спасибо сказали: 31 раз |
Цитата(" district ") четырех и более одинаковых символов подряд. Код (.)%1%1%1 как-то так.
|
|
|
Похожие темы
|
Сейчас: 27.11.2024, 5:38 |