Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
4.10.2010, 9:07
Сообщение
#721
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Быстрый ответ.. СПС
"Таймер на 1 секунду" посмотрим разберёмся. "В дистрибутиве птоки есть файл scripting-interface.txt, в котором подробно описаны ВСЕ функции API2" Про это знаю. Тут тоже тема есть описание функций с переводом Но тут ведь главное их правильно использовать... "Получение случайного ника" Набираю код: Код function OnStartup () users = Core.GetOnlineUsers() name = users[math.random(1,#users)].sNick Core.SendToAll("<"..name.."> выбран случайным образом!") end Получаю это Код <Случайный ник> выбран случайным образом! Всё работает отлично... теперь только к БОТу прикреплю и всё... СПС Вот ещё такой вопрос возникает.. есть таблица: Код local TableN = {"Ник1","Ник2","Ник3",} Нужно сравнить полученное значение name (см. выше код) со всеми значениями в таблице, и выполнить действие в зависимости от результатов сравнения (я понял что это к командам LUA относится...), но если можно напишите как. |
|
|
4.10.2010, 9:13
Сообщение
#722
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код for i,v in ipairs(TableN) do if v == name then // ... end end Однако лучше сделать другую структуру таблицы: Код local TableN = { в этом случае не нужен будет цикл:["Ник1"] = true, ["Ник2"] = true, ["Ник3"] = true, } Код if TableN[name] then
// ... end |
|
|
4.10.2010, 10:15
Сообщение
#723
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Вот пробовал таймер:
Код function OnStartup () n = 3 function Func() Core.SendToAll(""..n.." секунды прошли!") end TmrMan.AddTimer(n*1000,"Func") end Работает, НО... не останавливается. Каждые n секунд выдаётся сообщение.. как его остановьть, после выполнения команды? |
|
|
4.10.2010, 10:21
Сообщение
#724
|
|
Site Reliability Engineer Группа: Модераторы Сообщений: 1 772 Регистрация: 27.6.2009 Из: Чувашия, г. Чебоксары Пользователь №: 3 719 Спасибо сказали: 479 раз |
а TmrMan.RemoveTimer(Id) удаляет таймер. АПИ....
|
|
|
4.10.2010, 10:37
Сообщение
#725
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
И как его в вышеупомянутом коде использовать? (команду я знаю, использовать не умею...)
|
|
|
4.10.2010, 10:55
Сообщение
#726
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Код function OnStartup () n = 3 function Func() Core.SendToAll(""..n.." секунды прошли!") TmrMan.RemoveTimer(id) end id = TmrMan.AddTimer(n*1000,"Func") end AirKobra45, необходимо думать над документацией, там все вполне четко написано! |
|
|
4.10.2010, 14:34
Сообщение
#727
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
|
|
|
4.10.2010, 15:38
Сообщение
#728
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Цитата Это над той что вместе с PtokaX идёт? Не только. ЭТО тоже нужно изучать не менее внимательно: |
|
|
4.10.2010, 16:12
Сообщение
#729
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Видел, но ещё не всё смотрел.. а хочится уже хоть что-то и чтоб работало!
Вот по мере и вопрос образовался. Задача: Послать сообщение от любого ника (случайного из списка пользователей) выбранному пользователю, при этом (то что не могу сделать, весь день и while и for мучал циклы но ничего нормального не придумал) ник от которого отправляется сообщение не должен быть в таблице исключений (это есть) и не должен быть ником получателя сообщения (toWho) если если это не так, то выбираем снова случайный ник и проверяем... Вот код: Код MyCmd = ( "!mes" or "!мес" ) -- команда Mess = "Внимание!! .... " -- сообщение (допустим реклама) TableN = { ["Ник1"] = true, ["Ник2"] = true, ["Ник3"] = true,} -- таблица ников исключений function ChatArrival(user,data) data = string.sub(data,1,-2) cmd,toWho = string.match(data, "%b<>%s+(%S*)%s*(%S*)") if (cmd == "!mes" or cmd == "!мес") then if not ( toWho == "") then if Core.GetUser(toWho,true) == nil then Core.SendToNick(user.sNick," Пользователя нет в сети, попробуйте позднее...") else toWho = Core.GetUser(toWho,true) ----Выбор случайного ника из списка юзеров: users = Core.GetOnlineUsers() name = users[math.random(1,#users)].sNick while TableN[name] do users = Core.GetOnlineUsers() name = users[math.random(1,#users)].sNick end if name ~= toWho then Core.SendToAll("<"..name.."> "..toWho.sNick..": "..Mess.."") end end else Core.SendToNick(user.sNick,"Вы не ввели имя пользователя!") end return true end end Как бы зациклить это чудо? (Вообще запутался...) while TableN[name] do users = Core.GetOnlineUsers() name = users[math.random(1,#users)].sNick end if name ~= toWho then Core.SendToAll("<"..name.."> "..toWho.sNick..": "..Mess.."") end |
|
|
4.10.2010, 21:30
Сообщение
#730
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Наверное так:
Код TableN = { ["Ник1"] = true, ["Ник2"] = true, ["Ник3"] = true,} Если ники всех юзеров, сидящих на хабе, есть в таблице исключений, будет уходить в бесконечный цикл и вешать хаб
users = Core.GetOnlineUsers() repeat rand = math.random(1,#users) name1 = users[rand].sNick until TableN[name1] table.remove(users,rand) repeat name2 = users[math.random(1,#users)].sNick until TableN[name2] |
|
|
5.10.2010, 4:32
Сообщение
#731
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Я вообще запутался.. или не так вопрос поставил.
Нужно проверить 2 условия: чтобы случайного ника не было в таблице или/и (т.е либо одно из условий либо оба) случайный ник не был равен toWho? в иных случаях заного запрвшиваем name (случайно). Или я как то задачу не так поставил, потому как я сам не могу понять под какие циклы "это" загнать! |
|
|
5.10.2010, 7:47
Сообщение
#732
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Код MyCmd = ( "!mes" or "!мес" ) -- команда
Mess = "Внимание!! .... " -- сообщение (допустим реклама) TableN = { ["Ник1"] = true, ["Ник2"] = true, ["Ник3"] = true,} -- таблица ников исключений function ChatArrival(user,data) -- data = string.sub(data,1,-2) data = data:sub(1,-2) -- Лучше использовать методы! -- cmd,toWho = string.match(data, "%b<>%s+(%S*)%s*(%S*)") local cmd,toWho = data:match("^%b<>%s+(%S*)%s*(%S*)") -- Переменные надо объявлять локальными! if (cmd == "!mes" or cmd == "!мес") then -- if not ( toWho == "") then if toWho ~= "" then -- Так же наглядней и проще, чем выше!? local toWho = Core.GetUser(toWho,true) -- Чтобы несколько раз не вызывать функцию - выносим ее результат в локальную переменную -- if Core.GetUser(toWho,true) == nil then if not toWho then -- Вот так тоже короче и понятнее: отрицание равнозначно проверке на равенство nil или false Core.SendToNick(user.sNick," Пользователя нет в сети, попробуйте позднее...") else -- toWho = Core.GetUser(toWho,true) -- Это нам уже не надо ----Выбор случайного ника из списка юзеров: -- users = Core.GetOnlineUsers() local users = Core.GetOnlineUsers() -- опять же, зачем гадить в глобальное окружение? -- name = users[math.random(1,#users)].sNick local name = users[math.random(1,#users)].sNick -- тут аналогично -- while TableN[name] do local i = 0 -- Для нашей безопасности устанавливаем некоторый счетчик, когда он зашкалит - выходим из цикла чтобы не попасть в бесконечность while (TableN[name] or name == toWho) do -- Сюда же можно задать второе условие неравности toWho -- users = Core.GetOnlineUsers() -- Непонятно, зачем тебе заново эта таблица, выполнять какие-то функции в цикле вообще нежелательно! name = users[math.random(1,#users)].sNick i = i+1 if i == 10 then -- Счетчик зашаклил... break end end if i ~= 10 then -- Это своеобразная проверка, вышли мы по зашкаленному счетчику или нет, можно сделать и по-другому, но и так пойдет Core.SendToAll("<"..name.."> "..toWho.sNick..": "..Mess.."") else Core.SendToNick(user.sNick,"Не удалось создать случайный ник!") -- Иначе говорим что ничего не вышло end end else Core.SendToNick(user.sNick,"Вы не ввели имя пользователя!") end return true end end |
|
|
5.10.2010, 8:55
Сообщение
#733
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
А вот ранее у меня это:
Код while (TableN[name] or name == toWho) do ну никак не работало! и получалось сам себе некий ник слал сообщение! А сейчас и не знаю даже, тк теперь новое выдаёт: Код data = data:sub(1,-2) -- Лучше использовать методы! --Вот что пишет в ответ на эту строку: attempt to index global 'data' (a nil value)--- Вот думаю почему пустое значение.. смотрю а data то не запросил! Код function ChatArrival(user,data) надо же! такое пропустил...(оно там где надо.. но только переносом сработало а не на Enter, его как коммент определяло) |
|
|
5.10.2010, 9:00
Сообщение
#734
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
мда... сразу видно "страшно далёк от программирования"...
Код function ChatArrival(user, data) data = data:sub(1, -2) ... end или Код function ChatArrival(tUser, sData) sData = sData:sub(1, -2) ... end Так понятно? |
|
|
5.10.2010, 9:32
Сообщение
#735
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
мда... сразу видно "страшно далёк от программирования"... Мне небо ближе... И все мы учимся, всю жизнь, а те кто нет... мне их просто жаль! мда... сразу видно "страшно далёк от программирования"... А по поводу: Код function ChatArrival(tUser, sData) sData = sData:sub(1, -2) ...end Как взял кусочек для изучения разобрался, так и оставил (понятно что надо красиво (эффективно, коротко и ясно), но пока так... исправлюсь!) Код while (TableN[name] or name == toWho) do -- Сюда же можно задать второе условие неравности toWho end Вот что получается: есть в таблице - циклим, совпадает с toWho - циклим, оба - циклим, если нет совпадений - выйдем. (это не считая счётчика) Вот тут кроется ошибка (имхо): Код toWho подумаю... Цикл работает всё сравнивает, НО вот саму toWho почему то пропускает! и что с ней делать?! Авсё так просто !!! перед циклом всего то надо было поставить: toWho = toWho.sNick Я так понял что мы данные юзера получили... а сам ник из них не вытащили... вот и не получалось у меня.. но теперь работает!!! Всегда рад выслушать поправки пояснения. |
|
|
5.10.2010, 12:30
Сообщение
#736
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Авсё так просто !!! перед циклом всего то надо было поставить: toWho = toWho.sNick Я так понял что мы данные юзера получили... а сам ник из них не вытащили... вот и не получалось у меня.. но теперь работает!!! Всегда рад выслушать поправки пояснения. Извиняюсь, мой косяк, хотя по-идее должна была вылететь ошибка в духе "вы пытаетесь сравнить строку и таблицу". Надеюсь по всем комментариям, что я тебе оставил выше, ты разобрался! Спрашивай, если сам зашел в тупик, всегда помогут любители своего дела |
|
|
5.10.2010, 13:08
Сообщение
#737
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Вот ещё такой вопрос:
Мой БОТ отправляет следующие данные о себе Код ["Аллачка"] = { ["sDescription"] = "[14]", ["sNeedClient"] = "pl++v5.95", ["sNeedVersion"] = "1.00", ["sNeedConnection"] = "100", ["sNeedHubs"] = "0/0/1", ["sIP"] = "10.222.22.78", ["sMode"] = "A", ["sEmail"] = "Allachka@yandex.ru", ["iShare"] = 268781204480, какие ещё данные можно отправить? и что самое главное есть ли такие параметры, ориентируясь на которые ДЦ клиент показывает значки например звёздочку в списке.. (от БОТа можно такое отправить чтоб разнообразие было?) |
|
|
5.10.2010, 13:21
Сообщение
#738
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
AirKobra45, тебе сюда: $MyINFO
|
|
|
5.10.2010, 16:02
Сообщение
#739
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Вот всё сделал прикрепил файлик. может кому ещё надо файлик ряд Фибоначчи смотрите что не так.. буду рад выслушать замечания (а вот в цикле ряда Фибоначчи не понял как образуются первые 0 и 1 в чат..) и вот не понятно почему число с чата (это всё в файлике ряд ) необходимо использовать tonumber???
1. Сообщение 2. Ряд Фибоначчи
Прикрепленные файлы
_________.lua ( 1.55 килобайт )
Кол-во скачиваний: 10
_________.lua ( 1.25 килобайт ) Кол-во скачиваний: 9 |
|
|
5.10.2010, 16:18
Сообщение
#740
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
1. При вводе данных через команду скрипт их получает в виде строчных символов, а для математической обработки их надо перевести в числа, для этого и существует
Код tonumber(N) . Для обратного перевода (например, для выдачи в чат полученного результата), используется команда Код tostring(N) 2. Привыкайте скрипты обзывать латинскими символами! Иначе получится не название, а тупая линия. |
|
|
Похожие темы
|
Сейчас: 26.11.2024, 22:14 |