require 'luairc'
local inicfg = require "inicfg"
local imgui = require 'imgui'
local newcfg = {
config = {
chanel = '',
name = 'ChatRoom',
ColorName = 'FFFFFF',
ColorText = 'FFFFFF'
}
}
local encoding = require 'encoding' -- Подключаем библиотеку encoding для кодирования строк в UTF-8
encoding.default = 'CP1251'
u8 = encoding.UTF8
local connected = false -- переменная, которую мы будем устанавливать в true, когда мы подключены
mws = imgui.ImBool(false)
sw,sh = getScreenResolution()
function imgui.OnDrawFrame()
if not mws.v then imgui.Process = false end
NameChat = imgui.ImBuffer(u8(mainIni.config.name),64)
ChanelChat = imgui.ImBuffer(u8(mainIni.config.chanel),10)
ColorNameChat = imgui.ImBuffer(u8(mainIni.config.ColorName),7)
ColorTextChat = imgui.ImBuffer(u8(mainIni.config.ColorText),7)
if mws.v then
imgui.SetNextWindowSize(imgui.ImVec2(350, 130), imgui.Cond.FirstUseEver) -- resoluthion window
imgui.SetNextWindowPos(imgui.ImVec2((sw/2),sh/2),imgui.Cond.FirstUseEver,imgui.ImVec2(0.5,0.5)) -- in center monitor
imgui.Begin(u8'Настройки',mws)
imgui.PushItemWidth(125)
if imgui.InputText(u8'Введите название чата (без [])',NameChat) then
mainIni.config.name = u8:decode(NameChat.v)
end
if imgui.InputText(u8'Код чата',ChanelChat) then
mainIni.config.chanel = u8:decode(ChanelChat.v)
end
imgui.SameLine()
if imgui.Button(u8'Прийсоденится') then
s:disconnect()
s = irc.new{nick = MyName} -- создаем новый IRC объект
s:connect("irc.esper.net") -- подключаем наш объект к серверу "irc.example.net"
s:hook("OnDisconnect", onIRCDisconnect)
s:hook("OnChat", onIRCChat)
s:hook("OnJoin", onIRCJoin)
s:join('#'..ip..mainIni.config.chanel)
end
if imgui.InputText(u8'Цвет названия',ColorNameChat) then
mainIni.config.ColorName = u8:decode(ColorNameChat.v)
end
if imgui.InputText(u8'Цвет текста',ColorTextChat) then
mainIni.config.ColorText = u8:decode(ColorTextChat.v)
end
imgui.PopItemWidth()
inicfg.save(mainIni,pathCFG)
imgui.End()
end
end
function main()
if not isSampLoaded() then return end
while not isSampAvailable() do wait(0) end
ip, port = sampGetCurrentServerAddress()
pathCFG = getWorkingDirectory()..'\\ChatRoom.ini'
if doesFileExist(pathCFG) then
mainIni = inicfg.load(nil,pathCFG)
else
file = io.open(pathCFG,'w')
file.close()
inicfg.save(newcfg,pathCFG)
thisScript():reload()
end
_,MyId = sampGetPlayerIdByCharHandle(PLAYER_PED)
MyName = sampGetPlayerNickname(MyId)
FunckCon()
sampAddChatMessage('{FF0000}[ChatRoom]{ffffff}: loaded, отправить сообщение - /kk text, открыть меню - /crmenu. Автор: n1cho',-1)
sampRegisterChatCommand("kk",sendIRC)
sampRegisterChatCommand('crmenu',function()
mws.v = not mws.v
imgui.Process = mws.v
end)
while true do
wait(1500) -- обязательна задержка не менее 500 мс (рекомендация разработчика библиотеки)
if connected then -- Проверяем подключены ли мы, иначе при вызове s:think() скрипт выдаст ошибку
s:think() --[[ функция, которая обрабатывает входящие данные и отвечает на запросы сервера (такие как PING)
Данную функцию стоит вызывать достаточно часто, чтобы не истекло время ожидания сервера]]
end
end
end
function onIRCJoin(user, channel)
ConnectID = sampGetPlayerIdByNickname(user.nick)
if sampIsPlayerConnected(ConnectID) then
sampAddChatMessage(string.format('{%s}[%s] {FFFFFF} %s [%s] прийсоденился к серверу.',mainIni.config.ColorName,mainIni.config.name,user.nick,ConnectID),-1)
end
end
function onIRCChat(user, channel, message) -- Добавляем обработчик событий. Ниже рассмотрим все виды событий.
SendID = sampGetPlayerIdByNickname(user.nick)
if sampIsPlayerConnected(SendID) then
scolor=string.format("%06X", ARGBtoRGB(sampGetPlayerColor(SendID)))
sampAddChatMessage(string.format("{%s}[%s]{%s} %s[%s]{FFFFFF}:{%s} %s",mainIni.config.ColorName, mainIni.config.name, scolor,user.nick,SendID,mainIni.config.ColorText, u8:decode(message)),-1)
else
sampAddChatMessage(string.format("{%s}[%s]{FFFFFF} %s:{%s} %s",mainIni.config.ColorName, mainIni.config.name, user.nick,mainIni.config.ColorText, u8:decode(message)),-1) -- Готовим строку для вывода и выводим ее в лог. Немного ниже поговорим о структуре user
end
end
function onIRCDisconnect(message, error)
if error then
if connected then
connected = false
s:disconnect()
sampAddChatMessage("Вы были отключены от сервера за AFK,переподключаемся",-1)
FunckCon()
end
end
end
function FunckCon()
s = irc.new{nick = MyName} -- создаем новый IRC объект
s:connect("irc.esper.net") -- подключаем наш объект к серверу "irc.example.net"
s:hook("OnDisconnect", onIRCDisconnect)
s:hook("OnChat", onIRCChat)
s:hook("OnJoin", onIRCJoin)
s:join('#'..ip..mainIni.config.chanel) -- Подключаемся к каналу
connected = true -- меняем значение переменной на true
end
function sendIRC(params) -- Для ответа создадим команду /kk
_,MyId = sampGetPlayerIdByCharHandle(PLAYER_PED)
MyName = sampGetPlayerNickname(MyId)
if connected and params ~= nil and params ~= '' then -- Проверим, что мы подключены и ввели аргументы команды
s:sendChat('#'..ip..mainIni.config.chanel, u8(params)) -- отправим сообщение, которое мы ввели в аргументах в канал #example
mcolor=string.format("%06X", ARGBtoRGB(sampGetPlayerColor(MyId)))
sampAddChatMessage(string.format('{%s}[%s]{%s} %s[%s]{FFFFFF}:{%s} %s',mainIni.config.ColorName, mainIni.config.name,mcolor,MyName,MyId,mainIni.config.ColorText,params),-1)
else
sampAddChatMessage('Вы неправильно ввели команду, правильно: /kk text',-1)
end
end
function sampGetPlayerIdByNickname(nick)
local _, myid = sampGetPlayerIdByCharHandle(playerPed)
if tostring(nick) == sampGetPlayerNickname(myid) then return myid end
for i = 0, 1000 do if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) == tostring(nick) then return i end end
end
function getColor(ID)
PlayerColor = sampGetPlayerColor(id)
a, r, g, b = explode_argb(PlayerColor)
return r/255, g/255, b/255, 1
end
function explode_argb(argb)
local a = bit.band(bit.rshift(argb, 24), 0xFF)
local r = bit.band(bit.rshift(argb, 16), 0xFF)
local g = bit.band(bit.rshift(argb, 8), 0xFF)
local b = bit.band(argb, 0xFF)
return a, r, g, b
end
function ARGBtoRGB(color)
local a = bit.band(bit.rshift(color, 24), 0xFF)
local r = bit.band(bit.rshift(color, 16), 0xFF)
local g = bit.band(bit.rshift(color, 8), 0xFF)
local b = bit.band(color, 0xFF)
local rgb = b
rgb = bit.bor(rgb, bit.lshift(g, 8))
rgb = bit.bor(rgb, bit.lshift(r, 16))
return rgb
end