Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
1.1.2011, 14:49
Сообщение
#781
|
|
Продвинутый участник Группа: Пользователи Сообщений: 104 Регистрация: 1.4.2009 Из: Россия Пользователь №: 2 871 Спасибо сказали: 42 раза |
Поздравляю всех с Новым 2011 годом! Здоровья всем вам, счастья, удачи, финансовой стабильности и благополучия.
По просьбе друга, я начал перевод скрипта для PtokaX 0.4.1.2 LUA 5.1.4 API 2, автором которого является Saymon (сам > скрипт < создан для проекта RusHub) Я было тут начал делать перевод, да слег в больницу... Скрипт работает. Но есть пару "но" - в выводимом общем списке скриптов если скрипт отключен - отображается (якобы) занятый им объем памяти. Боюсь что и у запущенного скрипта память отображается не точно. - в выводимом в чат сообщении о информации скрипта (по его имени) или через меню некорректно отображается как его статус, так и память используемая скриптом. Кто может помочь - буду признателен. Инет в больнице "дороговат"
Прикрепленные файлы
|
|
|
4.1.2011, 16:44
Сообщение
#782
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Sekretchik, поправил описанные тобой ошибки, держи.
Прикрепленные файлы
|
|
|
4.1.2011, 19:37
Сообщение
#783
|
|
Продвинутый участник Группа: Пользователи Сообщений: 104 Регистрация: 1.4.2009 Из: Россия Пользователь №: 2 871 Спасибо сказали: 42 раза |
Спасибо Вам - Nickolya!
Большое человеческое - Спасибо. Моих познаний в LUA пока маловато. Я лишь предполагал такие варианты: Код (Scripts.iMemUsage or 0) Код for _, t in ipairs(tS) do if t.sName == bPrm then Но не был в них на 100% уверен. Интересно. Очень. Ученье - свет, а не ученье - чуть свет и на работу |
|
|
9.1.2011, 1:16
Сообщение
#784
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Всем привет!
Появился такой вопрос: есть БД телефонного справочника XML Код <?xml version="1.0" encoding="utf-8" standalone="no"?> <root totalElementsCount="тут число"> <g1 name="Экстренные телефоны"> <g2 elementsCount="22" name="Экстренные телефоны"> <e address="пр.Геологов 4/2" c1="" c2="" c3="" city="г...." name="ГИБДД" t1="4-...-..." t2=" " t3=" "/> ... тут продолжение ... </g2> </g1> </root> собственно вопрос в том чтобы в меню хаба вывести заголовки "Экстренные телефоны" а под ними г. такой то адрес: пр.Геологов 4/2 организация: ГИБДД телефон: 4-00-00 телефон:(заместо телефон вставить значения из С1 С2 и С3 соответственно если телефона нет то не выводить ) ************************** вот примерно так, но я не знаю возможно ли это... да и как сделать в скрипте под птоку.. |
|
|
9.1.2011, 1:31
Сообщение
#785
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
AirKobra45, телефоны вроде в t1,t2,t3
И как ты это предлагаешь сделать в меню? опиши подробнее Потом, не проще ли 1 раз забить руками нужное тебе меню и выводить его юзеру, зачем парсить каждый раз XML скриптом, или у вас справочник ежедневно обновляется? Или стоит задача именно решить задачу средствами программирования? |
|
|
9.1.2011, 1:53
Сообщение
#786
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
AirKobra45, телефоны вроде в t1,t2,t3 И как ты это предлагаешь сделать в меню? опиши подробнее Потом, не проще ли 1 раз забить руками нужное тебе меню и выводить его юзеру, зачем парсить каждый раз XML скриптом, или у вас справочник ежедневно обновляется? Или стоит задача именно решить задачу средствами программирования? в меню выведутся только заголовки.. вывод я сделать смогу.. мне как их из xml вытащить..."<g1 name="Экстренные телефоны">" точнее так, что в меню будут только заголовки а юзеру уж посылается всё что относится к заголовку.. Нр такси и различные фирмы и их телефоны уж отдельно "изъять" из БД и направить юзеру |
|
|
9.1.2011, 2:24
Сообщение
#787
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Вот тогда примерный код, сделай его под себя...
Код tSpravochnik = {} for g1, data1 in sData:gmatch"<g1 name=\"(.-)\">(.-)</g1>" do tSpravochnik[g1] = {} for count1, g2, data2 in data1:gmatch"<g2 elementsCount=\"(%d-)\" name=\"(.-)\">(.-)</g2>" do tSpravochnik[g1][g2] = {} for address, c1, c2, c3, name, t1, t2, t3 in data2:gmatch"<e address=\"(.-)\" c1=\"(.-)\" c2=\"(.-)\" c3=\"(.-)\" city=\"(.-)\" name=\"(.-)\" t1=\"(.-)\" t2=\"(.-)\" t3=\"(.-)\"/>" do table.insert(tSpravochnik[g1][g2],{ address = address, c1 = c1, c2 = c2, c3 = c3, name = name, t1 = t1, t2 = t2, t3 = t3 }) end end end На выходе получаем вот такое: Код tSpravochnik = {
["Экстренные телефоны"] = { ["Экстренные телефоны"] = { [1] = { ["t2"] = "4-...-...", ["t3"] = " ", ["name"] = "г....", ["address"] = "пр.Геологов 4/2", ["c1"] = "", ["t1"] = "ГИБДД", ["c3"] = "", ["c2"] = "", }, }, }, } |
|
|
9.1.2011, 14:28
Сообщение
#788
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Вот тогда примерный код, сделай его под себя... Спасибо позже буду разбираться.. Спасибо позже буду разбираться.. Пока ничего не получается.. видимо подзабыл всё.. так всёж ещё впереди.. сейчас повторю пойму и ... Сразу вопрос Код for g1, data1 in sData:gmatch"<g1 name=\"(.-)\">(.-)</g1>" do вот эти зачем значки \ зачем? и как строка именно работает.. я вот это понимаю.. Код cmd, toWho = data:match("%b<>%s+(%S*)%s*(%S*)") а вот строку выше не понял.И разве скобки не нужны? Код for g1, data1 in sData:gmatch("<g1 name=\"(.-)\">(.-)</g1>") do и здесь ни равно нет.. как в выражении выше .. "я вот не понял как это работает" в справочнике LUA почему то в скобках, но скрипт без них работает. |
|
|
9.1.2011, 14:32
Сообщение
#789
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
\" - экранирование кавычек, в противном случае нельзя различить кавычки, которыми ограничивается строка, и кавычки внутри строки.
|
|
|
9.1.2011, 17:35
Сообщение
#790
|
|
Продвинутый участник Группа: Пользователи Сообщений: 104 Регистрация: 1.4.2009 Из: Россия Пользователь №: 2 871 Спасибо сказали: 42 раза |
Здравствуйте все!
Прошу помощи. Начал писать скрипт для RusHub - messennger.lua - все вроде бы хорошо получается. Но не могу пока реализовать функцию отправки сообщения пользователю по нику от имени бота. Голова пошла кругом. Идею отправки сообщений взял с PtokaX. Setuper или Nickolya помогите. Если что-то в тексте скрипта не так, буду рад если отредактируете.
Прикрепленные файлы
|
|
|
9.1.2011, 17:57
Сообщение
#791
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Лучше не вызывать функцию Core.SendToUser несколько раз, а сформировать строку полностью (разделяя команды знаком | ) и вызвать её 1 раз.
Код function OnUserEnter(UID) if tAccess[UID.iProfile] == 1 then Core.SendToUser(UID, "$UserCommand 1 1 "..sMenu..UID.sNick.." • :::\\::: Сообщения • "..sHubName.." • :::\\::: Для Администрации :::$<%[mynick]> "..sPreff.."opmess %[line:Введите текст сообщения]||".. "$UserCommand 1 1 "..sMenu..UID.sNick.." • :::\\::: Сообщения • "..sHubName.." • :::\\::: Для Всех Юзеров :::$<%[mynick]> "..sPreff.."massmes %[line:Введите текст сообщения]|") --Core.SendToUser(UID,"$UserCommand 1 2 "..sMenu..UID.sNick.." • :::\\::: Сообщение от имени бота :::$<%[mynick]> "..sPreff.."frombot %[nick] %[line:Введите текст сообщения]|") end end Смысл конструкции ("%s"):format(sMsg) не понятен. А вот это: Код local _,_, sCmd = sData:find"^%b<>%s+%p(%S+)" -- ищем команду можно объединить в одну конструкцию.local _,_, sMsg = sData:find"%b<>%s+%S+%s+(.+)" Возвращаемым значением return true лучше тоже не загромождать код, а написать его в конце логического выражения. В итоге получаем: Код function OnChat(UID, sData) -- сообщение в чат
local sCmd, sMsg = sData:match"^%b<>%s+%p(%S+)%s*(.*)" -- ищем команду if sCmd then if sCmd == "massmes" then if tAccess[UID.iProfile] == 1 then if #sMsg == 0 then Core.SendToUser(UID, "*** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot) else Core.SendToProfile({0, 1, 2, 3, -1}, "\r\n\r\n\t *** СООБЩЕНИЕ ДЛЯ ВСЕХ ***\r\n\r\n\t • "..sMsg.." •\r\n", sBot, sBot) Core.SendToUser(UID, "*** Ваше сообщение • ДЛЯ ВСЕХ • успешно отправлено.", sBot) end else Core.SendToUser(UID, " *** У вас недостаточно прав для выполнения этой команды!", sBot) end return true elseif sCmd == "opmess" then if tAccess[UID.iProfile] == 1 then if #sMsg == 0 then Core.SendToUser(UID, "*** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot) else Core.SendToProfile({0,1}, "\r\n\r\n\t *** СООБЩЕНИЕ ДЛЯ АДМИНИСТРАЦИИ ***\r\n\r\n\t • "..sMsg.." •\r\n", sBot, sBot) Core.SendToUser(UID, "*** Ваше сообщение • ДЛЯ АДМИНИСТРАЦИИ • успешно отправлено.", sBot) end else Core.SendToUser(UID, "*** У вас недостаточно прав для выполнения этой команды!", sBot) end return true end end end |
|
|
10.1.2011, 1:16
Сообщение
#792
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Как я понял это мы заносим в таблицу значение
Код tSpravochnik[g1] = {} и не получается его вывести Код Core.SendToAll(" \n "..tSpravochnik[g1][g2].." \n ") или что то я делаю не так?
да и так Core.SendToAll(" \n "..tSpravochnik[g1].." \n ") |
|
|
10.1.2011, 13:50
Сообщение
#793
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
AirKobra45
Второй вариант точно не катит - Core.SendToAll не принимает таблицу в качестве аргумента. А насчет первого - не забывай что все современные клиенты пихают сообщения без ников в статусную строку, а поскольку твое сообщение начинается и заканчивается пустой строкой, его не видно и там. |
|
|
10.1.2011, 14:08
Сообщение
#794
|
|
Продвинутый участник Группа: Пользователи Сообщений: 104 Регистрация: 1.4.2009 Из: Россия Пользователь №: 2 871 Спасибо сказали: 42 раза |
Setuper - у меня нет слов, чтобы выразить своё восхищение. Жаль, что нельзя нажать - - 1000 раз
У меня остался вопрос: - а как в скрипте, о котором шла речь, грамотно реализовать отправку сообщения конкретному юзеру (по нику) от имени бота (естественно, что отправка сообщения будет осуществлена кем-то из администрации) Смысл конструкции ("%s"):format(sMsg) не понятен. Тренировался, проверял, что да как. |
|
|
10.1.2011, 18:38
Сообщение
#795
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код local sBot = Config.sHubBot
local sNick = "ник" Core.SendToUser(sNick, "Привет", sBot) |
|
|
10.1.2011, 18:57
Сообщение
#796
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
И разве скобки не нужны? Код for g1, data1 in sData:gmatch("<g1 name=\"(.-)\">(.-)</g1>") do и здесь ни равно нет.. как в выражении выше .. "я вот не понял как это работает" в справочнике LUA почему то в скобках, но скрипт без них работает. При одном строчном аргументе скобки можно опустить, т.е. print"Q" будет эквивалентно print("Q") В справочнике тебе надо найти справку по конструкции for ... do с вариантом функции-интератора, тогда поймешь почему тут нет равно. Чтобы вывести данные из таблицы воспользуйся банальным циклом Код for key, value in pairs(tSpravochnik) do -- key тут как раз и будет тем, что ты хочешь вывести, а value - таблица по этому ключу в таблице tSpravochnik, т.е. value = tSpravochnik[key] end Можно конечно по-другому занести данные в таблицу, но всё равно работа с таблицей в цикле - правильный путь, так что осваивай. И спрашивай что сильно не ясно, мы стараемся отвечать на все вопросы |
|
|
10.1.2011, 19:13
Сообщение
#797
|
|
Продвинутый участник Группа: Пользователи Сообщений: 104 Регистрация: 1.4.2009 Из: Россия Пользователь №: 2 871 Спасибо сказали: 42 раза |
Код local sBot = Config.sHubBot local sNick = "ник" Core.SendToUser(sNick, "Привет", sBot) я имел в виду - реализовать отправку сообщения конкретному юзеру по нику - в рассмотренном чуть выше скрипте. P.S. Илья, 100 раз тебе - Посмотри пожалуйста своим опытным глазом мою 'реализацию' отправки сообщения по нику от бота. Буду рад услышать все ваши замечания. Я могу ошибиться, но мне показалось, что меню на YnHub - составляется по подобию предложенного вами варианта. Это очень удобно. Опять же, вы сами рекомендуете это, во избежании 'многократных' вызовов - Core.SendToUser.
Прикрепленные файлы
|
|
|
11.1.2011, 10:24
Сообщение
#798
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ещё один момент. Чтобы каждый раз не формировать строку с командами, лучше вынести её за предел функции:
Код local sUserCommand = "$UserCommand 1 1 "..sMenu..UID.sNick.." • :::\\::: Сообщения • "..sHubName.." • :::\\::: Для Администрации :::$<%[mynick]> +opmess %[line:Введите текст сообщения]||".. "$UserCommand 1 1 "..sMenu..UID.sNick.." • :::\\::: Сообщения • "..sHubName.." • :::\\::: Для Всех Юзеров :::$<%[mynick]> +massmes %[line:Введите текст сообщения]||".. "$UserCommand 1 1 "..sMenu..UID.sNick.." • :::\\::: Сообщения • "..sHubName.." • :::\\::: Для Юзера от Бота :::$<%[mynick]> +frombot %[line:Ник] %[line:Введите текст сообщения]||".. "$UserCommand 1 2 "..sMenu..UID.sNick.." • :::\\::: Сообщить этому Юзеру :::$<%[mynick]> +frombot %[nick] %[line:Введите текст сообщения]|" function OnUserEnter(UID) if tAccess[UID.iProfile] == 1 then Core.SendToUser(UID, sUserCommand) end end А функция OnChat опять написана плохо. Зачем опять второе регулярное выражение? Код local fbm = sData:match"^%b<>%s+%p%S+%s+(.+)" Да и первое регулярное выражение немного по-другому должны быть написано: Код function OnChat(UID, sData)
local sCmd, sArg = sData:match"^%b<> [%+!/](%S+)%s*(.*)$" if sCmd then if sCmd == "massmes" then if tAccess[UID.iProfile] == 1 then if #sArg == 0 then Core.SendToUser(UID, " *** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot) else Core.SendToProfile({0, 1, 2, 3, -1}, "\r\n\r\n\t *** СООБЩЕНИЕ ДЛЯ ВСЕХ ***\r\n\r\n\t • "..sArg.." •\r\n", sBot, sBot) Core.SendToUser(UID, " *** Ваше сообщение • ДЛЯ ВСЕХ • успешно отправлено.", sBot) end else Core.SendToUser(UID, " *** У вас недостаточно прав для выполнения этой команды!", sBot) end return true elseif sCmd == "opmess" then if tAccess[UID.iProfile] == 1 then if #sArg == 0 then Core.SendToUser(UID, " *** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot) else Core.SendToProfile({0,1}, "\r\n\r\n\t *** СООБЩЕНИЕ ДЛЯ АДМИНИСТРАЦИИ ***\r\n\r\n\t • "..sArg.." •\r\n", sBot, sBot) Core.SendToUser(UID, " *** Ваше сообщение • ДЛЯ АДМИНИСТРАЦИИ • успешно отправлено.", sBot) end else Core.SendToUser(UID, " *** У вас недостаточно прав для выполнения этой команды!", sBot) end return true elseif sCmd == "frombot" then if tAccess[UID.iProfile] == 1 then local sNick, sMsg = sArg:match"^(%S+)%s*(.*)" if sNick then if #sMsg ~= 0 then local tUser = Core.GetUser(sNick) if tUser then Core.SendToUser(tUser, "\r\n\r\n\t *** ВАМ ПЕРСОНАЛЬНОЕ СООБЩЕНИЕ ***\r\n\r\n\t • "..sMsg.." •\r\n", sBot, sBot) Core.SendToUser(UID, " *** Ваше сообщение для • "..sNick.." • от имени • "..sBot.." • успешно отправлено.", sBot ) else Core.SendToUser(UID, " *** Ошибка: Юзер • "..sNick.." • на хабе не найден!", sBot) end else Core.SendToUser(UID, " *** Извините, пустые сообщения не отправляю. Попробуйте ещё раз.", sBot) end else Core.SendToUser(UID, " *** Не введён ник. Попробуйте ещё раз.", sBot) end else Core.SendToUser(UID, " *** У вас недостаточно прав для выполнения этой команды!", sBot) end return true end end end |
|
|
11.1.2011, 11:00
Сообщение
#799
|
|
Продвинутый участник Группа: Пользователи Сообщений: 104 Регистрация: 1.4.2009 Из: Россия Пользователь №: 2 871 Спасибо сказали: 42 раза |
Я пытался сделать что-то сам. Вот и учусь. Спасибо за советы и уроки. Хорошо когда есть человек, который может вот так учить.
Простите. У вас в тексте была 'оЧепятка' Код if #sMsg != 0 then а может быть надо Код if #sMsg == 0 then Но в таком случае, отправляется 'пустое сообщение' юзеру. Ник вписываем, и если не заполнить поле для ввода текста сообщения, то сообщение уходит 'пустым' P.S. Разобрался. |
|
|
11.1.2011, 15:51
Сообщение
#800
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
У меня всё правильно написано. Если
Код if #sMsg != 0 then то отправляй, иначе пиши, что "не отправляю пустые сообщения"
|
|
|
Похожие темы
|
Сейчас: 23.11.2024, 1:29 |