Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Скрипты с MySQL [PtokaX] _ ChatHistorySQL

Автор: alex82 25.7.2010, 13:51

ChatHistorySQL

Версия скрипта: 1.00
Версия API: API2 (PtokaX 0.4.0/0.4.1, LUA 5.1)
Автор: alex82

Описание:
Скрипт предназначен для сохранения истории сообщений главного чата в базе данных MySQL, и последующего вывода ее при подключении к хабу, либо по запросу. Имеется возможность поиска сообщений по нику, IP-адресу, или тексту. Также имеется возможность создания резервной копии базы данных скрипта непосредственно с помощью меню хаба, либо команды в главном чате. Скрипт умеет самостоятельно восстанавливать соединение с сервером MySQL.

ВНИМАНИЕ!
Для работы скрипта требуется http://mydc.ru/topic1508.html.
Перед запуском скрипта необходимо создать базу данных MySQL.

 ChatHistorySQL_1.00.rar ( 6.69 килобайт ) : 254


Конвертер базы данных ChatLogsMySQL --> ChatHistorySQL
 chatlog_converter.rar ( 1.35 килобайт ) : 66

Автор: alex82 15.8.2010, 18:48

Добавлен конвертер БД ChatLogsMySQL --> ChatHistorySQL

Автор: sergius 27.8.2010, 21:20

Спасибо, работает.

Автор: kc_duke 1.9.2010, 3:50

А вход\выход пользователей он не логирует, не подскажете?

Автор: Nickolya 1.9.2010, 22:07

kc_duke, нет, такого функционала в этом скрипте нету.

Автор: intlive 3.10.2010, 17:36

Приведите пожалуйста пример функции преобразования даты и времени сообщения, записанного в базу скриптом на php, или как записывать в "человекообразном" виде данные из скрипта в бд?

Автор: Nickolya 3.10.2010, 17:48

Код
date ("H:i:s Y-m-d", $row['time'])

Автор: Kingston 10.10.2010, 8:58

проблема возникла. раньше была на подобном скрипте. суть такова: при использовании встроенной команды меню пр кн мыши по юзеру в списке - Выкинуть юзера, в чат отсылается сообщение <Nick_1> is kicking Nick_2 because: и после чего скрипт не выводит сообщения непоследственно в чат, не могу разобраться никак.
Вот команда:


Автор: alex82 10.10.2010, 22:29

Решение проблемы: заменяем 125 строку на эту:

Код
            if me or not data:find("^["..SetMan.GetString(29):gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%1").."]"..tCfg.CmdPattern) and not data:find("^%s*is%s+kicking%s+%S+%s+because:") then


Автор: DEN 007 7.1.2011, 7:45

а я не понял что скрипт с utf8 не работает?

Автор: Kingston 7.1.2011, 9:53

DEN 007 кодировку базы надо указать в конфиге, все работает как с cp1251 так и с utf8

Автор: DEN 007 7.1.2011, 10:05

пардон не заметил настройки...

Автор: DEN 007 20.2.2011, 3:27

Я вот тока не понял а как по дате искать сообщений к примеру?
Ведь время записано в юних формате?

Автор: DEN 007 6.3.2011, 22:49

И так родилась мысль добавить в базу еще одну строку, суть просто, иногда в чат проходит спам или что то подобное, что юзер видеть в истории не должен, по сути это строчка переменная "0" или "1" и в зависимости от нее выводим данное сообщение или нет, то есть сообщение продолжает хранится в базе но оно не показывается юзеру.

Автор: Donki 20.7.2011, 19:58

PtokaX 4.0.0. Стоит написать в чате кириллицей, как в окошке скрипта появляется сообщение об ошибке, и текст в базу не попадает.
[19:34] Синтаксис ChatHistorySQL.lua:127: LuaSQL: Error executing query. MySQL: Incorrect string value: '\xF2\xE5\xEA\xF1\xF2' for column 'message' at row 1
На латиницу ошибок не выдаёт и текст появляется в базе.

Автор: DEN 007 20.7.2011, 21:10

Donki,
установи кодировку cp1251 и соединение тоже в этой кодировке.

Автор: Donki 20.7.2011, 22:03

В config.lua и так было настроено Charset = "cp1251". В каком соединении кодировку поменять?

Автор: sergius 24.10.2011, 12:10

Обновил ptokax до 0.4.2.0

Синтаксис error loading module 'luasql.mysql' from file 'ptokax\libs\luasql\mysql.dll':Не найдена указанная процедура.

Точка входа в процедуру @luaI_openlib не найдена в библиотеке DLL PXLUA.DLL


или вот так если mysql_2.1.1
[13:32:30] Синтаксис error loading module 'luasql.mysql' from file 'D:\system\programms\ptokax\libs\luasql\mysql.dll': Не найден указанный модуль.

Автор: mariner 24.10.2011, 15:23

Вы еще не читали релизноутсык новой птоке? Тогда советую прочитать.

В кратце - старые либы, что работали на 0.4.1.1 не катят

Автор: sergius 24.10.2011, 17:05

ждать?

Автор: Артём 24.10.2011, 17:19

sergius, нет, не ждать пока тебе дадут ссылку, а самому взять и в поиске на форуме найти.

Автор: sergius 24.10.2011, 18:43

Цитата(Артём @ 24.10.2011, 17:19) *
sergius, нет, не ждать пока тебе дадут ссылку, а самому взять и в поиске на форуме найти.


Ты нормальный вообще? Речь о библиотеке идёт, а не ссылке...

Автор: Артём 24.10.2011, 18:48

sergius, в полне нормальный, а я о http://mydc.ru/index.html?showtopic=19&view=findpost&p=40183 на http://mydc.ru/index.html?showtopic=19&view=findpost&p=40183 к новой птоке, где скачал птоку там и http://mydc.ru/index.html?showtopic=19&view=findpost&p=40183 бери big_smile.gif

Автор: sergius 24.10.2011, 23:07

Там где скачал птоку, там библиотек нет, а те что здесь пока не удалось запустить.

Автор: mariner 24.10.2011, 23:20

и не удастся. Проси сетапера собрать либу, ибо ППК MySQL, помнится, не собирал.

Автор: Saymon21 28.11.2011, 12:59

Мб кому нужно будет, добавил возможность выбора через меню, получать чат лог при входе на хаб или нет. big_smile.gif
+ багфикс из #9 поста.

 ChatHistorySQL_mod.tar.gz ( 6 килобайт ) : 16
 

Автор: DEN 007 20.8.2012, 23:47

по какой-то магии, работающий энное время скрипт начал выдавать ошибку...

Код
21.08.2012 00:23:03 - /home/SmolHUB/ptokax/scripts/ChatHistorySQL.lua:402: LuaSQL: Error executing query. MySQL: MySQL server has gone away

с завидной периодичностью, мускуль не падал, скрипт должен сам пере подключатся если конекта нет, но он этого не делает, скрипт не вылетает продолжает работать.
402 строчка
Код
    local cur = assert(con:execute("SELECT `time` FROM `"..tDBCfg.Prefix.."correct_time` WHERE `nick`='"..nick:sqlescape().."' LIMIT 1"))

функция целиком
Код
function GetCorrTime(nick)
    local cur = assert(con:execute("SELECT `time` FROM `"..tDBCfg.Prefix.."correct_time` WHERE `nick`='"..nick:sqlescape().."' LIMIT 1"))
    if cur:numrows() > 0 then
        return tonumber(cur:fetch({},"a").time)
    end
    return 0
end

Автор: serxxx 3.10.2015, 13:45

Цитата(DEN 007 @ 21.8.2012, 0:47) *
по какой-то магии, работающий энное время скрипт начал выдавать ошибку...
Код
21.08.2012 00:23:03 - /home/SmolHUB/ptokax/scripts/ChatHistorySQL.lua:402: LuaSQL: Error executing query. MySQL: MySQL server has gone away

с завидной периодичностью, мускуль не падал, скрипт должен сам пере подключатся если конекта нет, но он этого не делает, скрипт не вылетает продолжает работать.
402 строчка
Код
    local cur = assert(con:execute("SELECT `time` FROM `"..tDBCfg.Prefix.."correct_time` WHERE `nick`='"..nick:sqlescape().."' LIMIT 1"))

функция целиком
Код
function GetCorrTime(nick)
    local cur = assert(con:execute("SELECT `time` FROM `"..tDBCfg.Prefix.."correct_time` WHERE `nick`='"..nick:sqlescape().."' LIMIT 1"))
    if cur:numrows() > 0 then
        return tonumber(cur:fetch({},"a").time)
    end
    return 0
end

Такая же проблема, историю выдает только после запуска скрипта при первом подключении к mysql. Через время подключиться к mysql уже не может

Автор: Saymon21 3.10.2015, 14:22

http://mydc.ru/r/?https://dev.mysql.com/doc/refman/5.0/en/gone-away.html

Автор: serxxx 3.10.2015, 15:27

Saymon21, Это читал, просто я не силен в этом чтоб проанализировать код и понять причину
сначала в коде нашел 2 строчки с закрытием f:close() и cur:close() и удалил их чтоб не закрывали соединение. Не получилось.
добавил в проблемную строчку
cur:close()

Код
function GetCorrTime(nick)
    local cur = assert(con:execute("SELECT `time` FROM `"..tDBCfg.Prefix.."correct_time` WHERE `nick`='"..nick:sqlescape().."' LIMIT 1"))
    if cur:numrows() > 0 then
        return tonumber(cur:fetch({},"a").time)
    end
    cur:close()
    return 0
end

вышла другая ошибка Lost connection to MySQL server during query

Автор: Saymon21 3.10.2015, 16:04

Тогда прочитай ещё раз, пока не поймёшь, что там написано.
Не всегда дело только в скриптах.

Автор: serxxx 3.10.2015, 16:20

Saymon21, ну так там написано:
Если это получено в скрипте, то достаточно просто повторить запрос от клиента, чтобы соединение автоматически восстановилось.
В инструкции прочитал как делать запрос
Метод выполнения SQL запроса к базе данных: conn:execute("запрос")
он в коде есть

Код
function GetCorrTime(nick)
    local cur = assert(con:execute("SELECT `time` FROM `"..tDBCfg.Prefix.."correct_time` WHERE `nick`='"..nick:sqlescape().."' LIMIT 1"))
    if cur:numrows() > 0 then
        return tonumber(cur:fetch({},"a").time)
    end
    cur:close()
    return 0
end

Сам MySQL работает без проблем, помимо хаба на хостинге работает сайт с чатом

Автор: Saymon21 3.10.2015, 16:27

Сайту, особенно если тот на пхп, может быть и пофиг на подобные вещи. Это раз. Два: Сделай условие на Check()

Автор: serxxx 3.10.2015, 16:57

Saymon21, поставил wait_timeout 7200 (2 часа) в MYSQL
Т.е. будет работать если в течении 2-х часов будет запрос на историю
Это конечно не решение, посмотрю на нагрузку. Минут 10 работает без проблем на данный момент

UPD Проблема решена, нагрузка не возросла
Saymon21 спасибо вам

Автор: Tsd 16.10.2017, 19:42

Цитата(serxxx @ 3.10.2015, 15:57) *
Saymon21, поставил wait_timeout 7200 (2 часа) в MYSQL
Т.е. будет работать если в течении 2-х часов будет запрос на историю
Это конечно не решение, посмотрю на нагрузку. Минут 10 работает без проблем на данный момент

UPD Проблема решена, нагрузка не возросла
Saymon21 спасибо вам

Я решил проблему проверкой функции Check() по таймеру (10 минут).


Скрипт безусловно хорош, но я заметил некую странность (может у меня одного лыжи не едут?). При выводе запроса лога `Сообщения за указанную дату` скрипт выдавал лог с произвольного часа этого дня, захватывая следующий день. Решил проблему так:
Заменил строку
Код
t = {year = tonumber(y),month = tonumber(m),day = tonumber(d)}

На
Код
t = {year = tonumber(y),month = tonumber(m),day = tonumber(d),hour = 0,min = 0,sec = 0}

Кстати, на Debian пришлось изменить строку
Код
require "luasql.mysql"

На
Код
local luasql = require "luasql.mysql"

P.S. Спасибо Kinsler за помощь.