--[[ drua-tg A fork of JuanPotato's lua-tg (https://github.com/juanpotato/lua-tg), modified to work more naturally from an API bot. Usage: drua = require('drua-tg') drua.IP = 'localhost' drua.PORT = 4567 drua.message(chat_id, text) ]]-- local SOCKET = require('socket') local comtab = { add = { 'chat_add_user %s %s', 'channel_invite %s %s' }, kick = { 'chat_del_user %s %s', 'channel_kick %s %s' }, rename = { 'rename_chat %s "%s"', 'rename_channel %s "%s"' }, link = { 'export_chat_link %s', 'export_channel_link %s' }, photo_set = { 'chat_set_photo %s %s', 'channel_set_photo %s %s' }, photo_get = { [0] = 'load_user_photo %s', 'load_chat_photo %s', 'load_channel_photo %s' }, info = { [0] = 'user_info %s', 'chat_info %s', 'channel_info %s' } } local format_target = function(target) target = tonumber(target) if target < -1000000000000 then target = 'channel#' .. math.abs(target) - 1000000000000 return target, 2 elseif target < 0 then target = 'chat#' .. math.abs(target) return target, 1 else target = 'user#' .. target return target, 0 end end local escape = function(text) text = text:gsub('\\', '\\\\') text = text:gsub('\n', '\\n') text = text:gsub('\t', '\\t') text = text:gsub('"', '\\"') return text end local drua = { IP = 'localhost', PORT = 4567 } drua.send = function(command, do_receive) command = command .. '\n' local s = SOCKET.connect('localhost', 4567) s:send(command) if do_receive then -- Get the size of the output, and get the output. -- Thanks Juan for making this so easy to read. :^) local output = s:receive(tonumber(string.match(s:receive("*l"), "ANSWER (%d+)"))) s:close() return output:gsub('\n$', '') end s:close() end drua.message = function(target, text) local target = format_target(target) local text = escape(text) local command = 'msg %s "%s"' command = command:format(target, text) return drua.send(command) end drua.send_photo = function(target, photo) local target = format_target(target) local command = 'send_photo %s %s' command = command:format(target, photo) return drua.send(command) end drua.add_user = function(chat, target) local chat,a = format_target(chat) local target = format_target(target) local command = comtab.add[a]:format(chat, target) return drua.send(command) end drua.kick_user = function(chat, target) -- Get the group info so tg will recognize the target. drua.get_info(chat) local chat,a = format_target(chat) local target = format_target(target) local command = comtab.kick[a]:format(chat, target) return drua.send(command) end drua.rename_chat = function(chat, name) local chat,a = format_target(chat) local command = comtab.rename[a]:format(chat, name) return drua.send(command) end drua.export_link = function(chat) local chat,a = format_target(chat) local command = comtab.link[a]:format(chat) return drua.send(command, true) end drua.get_photo = function(chat) local chat,a = format_target(chat) local command = comtab.photo_get[a]:format(chat) local output = drua.send(command, true) if output:match('FAIL') then return false end return output:match('Saved to (.+)') end drua.set_photo = function(chat, photo) local chat,a = format_target(chat) local command = comtab.photo_set[a]:format(chat, photo) return drua.send(command) end drua.get_info = function(target) local target,a = format_target(target) local command = comtab.info[a]:format(target) return drua.send(command, true) end drua.channel_set_admin = function(chat, user, rank) local chat = format_target(chat) local user = format_target(user) local command = 'channel_set_admin %s %s %s' command = command:format(chat, user, rank) return drua.send(command) end drua.channel_set_about = function(chat, text) local chat = format_target(chat) local text = escape(text) local command = 'channel_set_about %s "%s"' command = command:format(chat, text) return drua.send(command) end return drua