жалобная книга + MySQL, Юзеры могут пожаловаться на админов =) |
Здравствуйте, гость ( Вход | Регистрация )
жалобная книга + MySQL, Юзеры могут пожаловаться на админов =) |
6.7.2009, 12:35
Сообщение
#1
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
Собственно сабж.
Помогите, пожалуйста, сам несмог.. Можно много незаморачиваться, а сделать по команде, скажем, !report <ник_на_кого_жалоба> <сообщение> - хотя менюшку желательно. Если жалуются не на админа, то: КорСендТуЮзер "*** оператора с ником ..блабла.. несуществует". При этом <сообщение> записывается в базу: _таблица_с_ником_админа (или некий ID админа)::: порядковый номер; дата; время; ник; сообщение. Доступ к команде и менюшке только у профилей 3 и 2 - нефиг опам друг на друга стучать (опционально) Антифлуд - неболее 1 жалобы 1 ника/ip в час (опционально). Интересно, а антимат возможен? Что с базой делать - каждый сам решит, я вот на страницу выведу. Ну и жалобы через веб выведу - для забаненых. ;) Хотя можно Мастеру дать возможность просматривать последние жалобы на хабе. В идеале потом можно будет проводить конкурсы "Самый строгий админ" и "Самый добрый админ" Пытался сам переделать из ChatLogsMySQL by Wariner, но, как обычно ничего невышло. |
|
|
6.7.2009, 13:18
Сообщение
#2
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
ты думаешь будет так много жалоб? почету то я сомневаюсь...
|
|
|
6.7.2009, 13:30
Сообщение
#3
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
О, уверен, что жалоб будет много.
И даже знаю на кого больше всех - не менее 10-30 в сутки. А жалобная книга - мальчик для битья, написал (дал затрещину) и успокоился. И ругани меньше будет, а то вечный флейм. |
|
|
6.7.2009, 15:11
Сообщение
#4
|
|
мяу =^.^= Группа: Пользователи Сообщений: 414 Регистрация: 20.5.2008 Пользователь №: 6 Спасибо сказали: 14 раз |
что ж за админы такие страшные)
|
|
|
6.7.2009, 15:19
Сообщение
#5
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
Да есть парочка - любители эпатажа, но не все это понимают (эпатаж), потому мыло мне уже заспамили.
По большому счету у меня неполучается только перехватить сообщение из: Код sMsg = "$UserCommand 1 3 "..sMenu.."$<%[mynick]> !report %[line:Введите ник админа] %[line:Введите текст жалобы]&*#*124;|".. и записать его в базу по принципу : [line:Введите ник админа] - это уже существующие таблицы report_НИК_АДМИНА с полями ID;Date;Time;Nick;Msg [line:Введите текст жалобы] - поле Msg в таблице Ну и остальные поля ID;Date;Time;Nick непонимаю, как заполняются. Уже прочитал все что можно, но чего-то нехватает... Дайте толчек, прочитайте лекцию для новичков, с примерами, плиз. |
|
|
6.7.2009, 18:30
Сообщение
#6
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
итак
1) не надо делать кучу таблиц! сделай одну Код id........Admin.......Date........Time..........Nick............Msg 2) что конкретно не получается с нахождением, как пробуешь?(есть очень хорошая статья на форуме от Setuper`a об этом) 3) id - при создании базы надо указывать что это автозаполняемое поле, при каждой новойзаписи оно будет принимать значение n+1, где n - id последней записи Date и Time получаются из os.date("%d-%m-%Y") и os.date("%H:%M:%S") соответственно и просто вносятся в таблицу если что не понятно спрашивай |
|
|
6.7.2009, 20:06
Сообщение
#7
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
Код ----чудо-юдо -- надо ли local добавлять? local sBot = "бот" local sNameDB = "report" local sUserDB = "report" local sPasswordDB = "******" local sAdressDB = "localhost" local sPortDB = "3306" local sPrefixTable = "report_" local sMenu = "Пожаловаться на админа" local sBeDate = os.date("%d.%m.%Y") local sBeTime = os.date("%H:%M:%S") local sErrAdmNick = "Ошибка. Оператора с таким ником несуществует" tProfiles = { [0] = 1, -- Мастер [1] = 1, -- ОПератор [2] = 1, -- VIP [3] = 1, -- Зарегистрированный пользователь [4] = 1, -- Net [-1] = 0, -- Незарегистрированный юзер } tAdmNick = { -- Список админов ["Admin"] = 1, ["Admin2"] = 1, ["Admin3"] = 1, ["Admin4"] = 1, ["Admin5"] = 1, ["Admin6"] = 1, } require "luasql.mysql" -- подключение библиотеки local env = assert (luasql.mysql()) --- почти понял, вернее понял, но описать немогу грамотно =)) local con = assert (env:connect(sNameDB, sUserDB, sPasswordDB, sAdressDB, sPortDB)) -- подключение к базе function UserConnected(tUser) if tProfiles[tUser.iProfile] == 1 then sMsg = "$UserCommand 1 3 "..sMenu.."$<%[mynick]> !report %[line:Введите ник админа] %[line:Введите текст жалобы]&*#*124;|".. if (not sMsg = tAdmNick[tUser.sNick] ~= 1) then --- нужны ли скобки? И вообще сомневаюсь в правильности. Core.SendToUser(tUser, sErrAdmNick) -- или надо "..sErrAdmNick.."- c точками и в кавычках? -- следующая строка вообще напрягает, INSERT INTO `%sreport` - правильно ли обозначил? local con:execute(("INSERT INTO `%sreport` (`Admin`, `Date`, `Time`,`Nick`,`Msg`) VALUES ('%s','%s','%s','%s','%s')"):dbformat(sPrefixTable, sAdmin, sBeDate, sBeTime, tUser.sNick, sMsg)) Вобщем вот. И половины не написал, а ошибок чую оч много. В комментариях я написал как я понимаю действие или непонимаю его. Там же и вопросы. Непонимаю как мне выловить ник админа из этих лайнов.... Кусками могу почти все, что задумал написать (хоть и неправильно), а собрать из кусков немогу что-то... Плиз, не бейте меня. И можно уже перенести в "Помощь по скриптам" |
|
|
6.7.2009, 20:27
Сообщение
#8
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
local лучше добавлять.
а вот тут ты не понятно что делаешь... Код function UserConnected(tUser) if tProfiles[tUser.iProfile] == 1 then sMsg = "$UserCommand 1 3 "..sMenu.."$<%[mynick]> !report %[line:Введите ник админа] %[line:Введите текст жалобы]&*#*124;|".. if (not sMsg = tAdmNick[tUser.sNick] ~= 1) then --- нужны ли скобки? И вообще сомневаюсь в правильности. Core.SendToUser(tUser, sErrAdmNick) -- или надо "..sErrAdmNick.."- c точками и в кавычках? -- следующая строка вообще напрягает, INSERT INTO `%sreport` - правильно ли обозначил? local con:execute(("INSERT INTO `%sreport` (`Admin`, `Date`, `Time`,`Nick`,`Msg`) VALUES ('%s','%s','%s','%s','%s')"):dbformat(sPrefixTable, sAdmin, sBeDate, sBeTime, tUser.sNick, sMsg)) да сначала ты послал менюшку, причём не совсем правильно. так как менюшка всего одна надо так Код function UserConnected(tUser) if tProfiles[tUser.iProfile] == 1 then Core.SendToUser(tUser, "$UserCommand 1 3 "..sMenu.."$<%[mynick]> !report %[line:Введите ник админа] %[line:Введите текст жалобы]&#*124;") end end вот и вся твоя функция. все остальные действия будут выполнены в функции ChatArrival посмотри как выполнен поиск фразы в других скриптах из line`ов ничего выдерать не надо, ибо это просто меню, после ввода оно преобразуется в строку типа Код !report Admin Да он просто казёл))))
|
|
|
7.7.2009, 1:10
Сообщение
#9
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
Код require "luasql.mysql" -- подключение библиотеки local env = assert (luasql.mysql()) --- почти понял, вернее понял, но описать немогу грамотно =)) local con = assert (env:connect(sNameDB, sUserDB, sPasswordDB, sAdressDB, sPortDB)) -- подключение к базе function UserConnected(tUser) if tProfiles[tUser.iProfile] == 1 then Core.SendToUser(tUser, "$UserCommand 1 3 "..sMenu.."$<%[mynick]> !report %[line:Введите ник админа] %[line:Введите текст жалобы]&#*124;") end end OpConnected = UserConnected RegConnected = UserConnected function ChatArrival(tUser, sData) local sAdmin, sMsg = sData:match"^!report (%S+)%s(.*)" -- уфф.. с этим разобрался, помог Setuper, его статья про регулярные выражения и захваты - 7 раз прочитал (там многое умалчивается, оказывается) , и еще спасибо Alexey за подсказки о том, о чем умалчивалось. =)) if not tAdmNick[sAdmin] or tAdmNick[sAdmin] ~= 1 then -- спасибо, Setuper!!! Core.SendToUser(tUser, sErrAdmNick) -- эт я сам сообразил, благо примеров много. end -- следующая строка вообще напрягает, INSERT INTO `%sreport` - правильно ли обозначил? local con:execute(("INSERT INTO `%sreport` (`Admin`, `Date`, `Time`,`Nick`,`Msg`) VALUES ('%s','%s','%s','%s','%s')"):dbformat(sPrefixTable, sAdmin, sBeDate, sBeTime, tUser.sNick, sMsg)) end Шапка с переменными и таблицами выше - я не трогал. А так пока вроде должно даже работать, .... вроде..., пока непробовал. (застрял при создании таблицы с полем id - разберусь) С мускулом мы хоть и не на "ты", но иногда здороваемся добавлено позже: Ну вот и поздоровались, кавычку пропустил в запросе ))) Как обычно все отметил в коментариях. Благодарности тоже. Однако, даже если код рабочий, буду работать над антифлудом. Пока не определился как, что, почему и каким образом, но мысли есть (например добавить в таблицу поле IP, а в скрипт - таймер). И еще, нет ли возможности вместо вручную забиваемой таблицы tAdmNick использовать *.xml файл птоки? Так и знал, что именно здесь будет косяк :( Код local con:execute(("INSERT INTO `%sreport` (`Admin`, `Date`, `Time`,`Nick`,`Msg`) VALUES ('%s','%s','%s','%s','%s')"):dbformat(sPrefixTable, sAdmin, sBeDate, sBeTime, tUser.sNick, sMsg)) Синтакс new.lua:46: unexpected symbol near ':' я уж и так эти двоеточия и эдак.. хоть удаляю - все равно такую ерру пишет... |
|
|
7.7.2009, 11:14
Сообщение
#10
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
да вроде всё правильно написано....
|
|
|
7.7.2009, 17:49
Сообщение
#11
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
Все равно не работает.
Вроде бы и метод dbformat определен... new.lua ( 1.99 килобайт ) Кол-во скачиваний: 9 |
|
|
7.7.2009, 18:07
Сообщение
#12
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
тут вижу несколько проблем.
1) всё таки лучше если ты сначала будешь находить команду а уже по команде делать какие либо действия(возьми из того же чатлога) 2) лучше если таблица будет создаваться в скрипте |
|
|
7.7.2009, 21:19
Сообщение
#13
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
1) - непонял. Вроде все так как в чатлоге. Можно подробнее чуть-чуть.
2) - это сделал, только она несоздается, потому что ошибка все таже вылезает. -------------------------------------------------------------------------------------------- Закомментировал глючную строчку и скрипт запустился, создал таблицу и даже выводит сообщение ErrAdmNick |
|
|
7.7.2009, 21:43
Сообщение
#14
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
насчёт команд:
Код function ChatArrival(tUser, sData) local sData = sData:sub(1,-2) local sCmd = sData:match"%b<>%s+([!+-/*]%S+)" if sCmd == "!mainlogs" then выложи то что ты уже сделал посмотрю |
|
|
7.7.2009, 22:05
Сообщение
#15
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
Вот.
new.lua ( 2.34 килобайт ) Кол-во скачиваний: 7 Если закомментировать 57 строку, то запускается и создает базу. И все, кроме записи в базу, работает. насчёт команд: Код function ChatArrival(tUser, sData) local sData = sData:sub(1,-2) local sCmd = sData:match"%b<>%s+([!+-/*]%S+)" if sCmd == "!mainlogs" then выложи то что ты уже сделал посмотрю Этот код чет никак не могу сунуть в ChatArrival Чисто даже на логическом уровне неполучается. Если сунуть "как есть"... то получается, что если команда та, что надо, то выполняем Код local sAdmin, sMsg = sData:match"^!report (%S+)%s(.*)" а если нет? то ретурн что? |
|
|
7.7.2009, 22:32
Сообщение
#16
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
ты путаешь менюшки и команды. ща гляну код
весь твой косяк был в том что ты написал local перед con)))) так же поправил некоторые косяки 1) нельзя дату и время выносить как сделал это ты. ибо они примут временное значение включения скрипта! исправил, а так же исправил формат даты! в постах выше писал про удобную для человека дату, а в MySQL свои типы почитать тут 2) забыл убрать звёздочку при создании менюшек 3) добавил нахождение команды 4) чутка преукрасил
Прикрепленные файлы
|
|
|
7.7.2009, 23:15
Сообщение
#17
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
Во, Спасибо!
Работает =) |
|
|
8.7.2009, 15:19
Сообщение
#18
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
Код function ChatArrival(tUser, sData) local sData = sData:sub(1,-2) local sCmd = sData:match"%b<>%s+([!+-/*]%S+)" if sCmd == "!report" then local sAdmin, sMsg = sData:match"%b<>%s+[!+-/*]%S+%s+(%S+)%s+(.*)" if not tAdmNick[sAdmin] then Core.SendToUser(tUser, ("<%s> %s"):format(sBot, sErrAdmNick)) elseif (not sMsg) or (not sMsg:match"%S") then Core.SendToUser(tUser, ("<%s> *** Вы не ввели текст жалобы!"):format(sBot)) else con:execute(("INSERT INTO `%sReport` (`Admin`, `Date`, `Time`,`Nick`,`Msg`) VALUES ('%s','%s','%s','%s','%s')"):dbformat(sPrefixTable, sAdmin, os.date("%Y-%m-%d"),os.date("%H:%M:%S"), tUser.sNick, sMsg)) --вносим жалобу в базу Core.SendToUser(tUser, ("<%s> *** Жалоба отправлена удачно!"):format(sBot)) end return true end end Подскажите, как в эту функцию еще условий добавить? ну допустим Код if tAdmNick[sAdmin] == 0 then Core.SendToUser(tUser, ("<%s> %s"):format(sBot, sMaster)) Вобщем весь код такой: Если в таблице tAdmNick нет такой записи, то отправляем sErrAdmNick а если в таблице есть запись, но она равна 0, то отправляем sMaster Или ткните носом, где про это написано. Смотрел другие скрипты, там прям так и написано, но у меня так неработает. И еще. Что делает этот последний кусок : Код string.dbformat = function(self, ...) local t = {...} for k, v in ipairs(t) do t[k] = tostring(v):gsub("'", "\\'") end return self:format(unpack(t)) end Именно он ругается, если я что-то добавляю. |
|
|
8.7.2009, 15:23
Сообщение
#19
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
метод dbformat экранирует одиночную кавычку для внесения данных в бд.
|
|
|
9.7.2009, 12:38
Сообщение
#20
|
|
МЕДВЕД =) Группа: Пользователи Сообщений: 187 Регистрация: 6.8.2008 Пользователь №: 332 Спасибо сказали: 4 раза |
Со всем предыдущим разобрался, почитав всякие факи.
Сделал таблицу запретных слов в виде: Код tMat = { ["бла"] = 1, ["стер"] = 1 { Однако слово "бла" отлавливается нормально, а "Бла" или "бластер" нет. И еще. tMat получается объемной, подумываю поместить в мускул, но пока об этом рано думать. ================================================ Скрипт получился гибкий, можно использовать как Гостевую книгу, или даже как ПМ Офлайн... |
|
|
Похожие темы
|
Сейчас: 26.11.2024, 22:37 |