Merge Upstream
This commit is contained in:
commit
fb00312dd9
35
README.md
35
README.md
@ -16,6 +16,7 @@ Brawlbot v2 ist freie Software; du darfst in modifizieren und weiterverbreiten,
|
||||
|:----------------------------------------------|:------------------------------|
|
||||
| [Setup](#setup) | [Plugins](#plugins) |
|
||||
| [Bot steuern](#bot-steuern) | [Bindings](#bindings) |
|
||||
| | [Datenbank](#datenbank)
|
||||
|
||||
* * *
|
||||
# Für User
|
||||
@ -148,3 +149,37 @@ bindings.sendPhoto(self, { chat_id = 987654321, photo = 'ABCDEFGHIJKLMNOPQRSTUVW
|
||||
```
|
||||
|
||||
Upon success, bindings will return the deserialized result from the API. Upon failure, it will return false and the result. In the case of a connection error, it will return two false values. If an invalid method name is given, bindings will throw an exception. This is to mimic the behavior of more conventional bindings as well as to prevent "silent errors".
|
||||
|
||||
* * *
|
||||
|
||||
## Datenbank
|
||||
Brawlbot benutzt eine interne Datenbank, wie Otouto sie benutzt und Redis. Die "Datenbank" ist eine Tabelle, auf die über die Variable `database` zugegriffen werden kann (normalerweise `self.database`) und die als JSON-encodierte Plaintext-Datei jede Stunde gespeichert wird oder wenn der Bot gestoppt wird (über `/halt`).
|
||||
|
||||
Das ist die Datenbank-Struktur:
|
||||
|
||||
```
|
||||
{
|
||||
users = {
|
||||
["55994550"] = {
|
||||
id = 55994550,
|
||||
first_name = "Drew",
|
||||
username = "topkecleon"
|
||||
}
|
||||
},
|
||||
userdata = {
|
||||
["55994550"] = {
|
||||
nickname = "Best coder ever",
|
||||
lastfm = "topkecleon"
|
||||
}
|
||||
},
|
||||
version = "2.1"
|
||||
}
|
||||
```
|
||||
|
||||
`database.users` speichert User-Informationen, wie Usernamen, IDs, etc., wenn der Bot den User sieht. Jeder Tabellen-Key ist die User-ID als String.
|
||||
|
||||
`database.userdata` speichert Daten von verschiedenen Plugins, hierzu wird aber für Brawlbot-Plugins Redis verwendet.
|
||||
|
||||
`database.version` speichert die Bot-Version.
|
||||
|
||||
* * *
|
35
config.lua
Executable file
35
config.lua
Executable file
@ -0,0 +1,35 @@
|
||||
return {
|
||||
|
||||
-- Your authorization token from the botfather.
|
||||
bot_api_key = '235106290:AAGKZwTJBE1J6MvorodwG1E_0Y86DaIRa-o',
|
||||
-- Your Telegram ID.
|
||||
admin = 36623702,
|
||||
-- Two-letter language code.
|
||||
lang = 'de',
|
||||
-- The channel, group, or user to send error reports to.
|
||||
-- If this is not set, errors will be printed to the console.
|
||||
log_chat = nil,
|
||||
-- The port used to communicate with tg for administration.lua.
|
||||
-- If you change this, make sure you also modify launch-tg.sh.
|
||||
cli_port = 4567,
|
||||
-- The block of text returned by /start.
|
||||
about_text = [[
|
||||
*Willkommen beim Brawlbot!*
|
||||
Sende /hilfe, um zu starten
|
||||
]],
|
||||
-- The symbol that starts a command. Usually noted as '/' in documentation.
|
||||
cmd_pat = '/',
|
||||
|
||||
errors = { -- Generic error messages used in various plugins.
|
||||
generic = 'Ein unbekannter Fehler ist aufgetreten, bitte [melde diesen Bug](https://github.com/Brawl345/Brawlbot-v2/issues).',
|
||||
connection = 'Verbindungsfehler.',
|
||||
quotaexceeded = 'API-Quota aufgebraucht.',
|
||||
results = 'Keine Ergebnisse gefunden.',
|
||||
sudo = 'Du bist kein Superuser. Dieser Vorfall wird gemeldet!',
|
||||
argument = 'Invalides Argument.',
|
||||
syntax = 'Invalide Syntax.',
|
||||
chatter_connection = 'Ich möchte gerade nicht reden',
|
||||
chatter_response = 'Ich weiß nicht, was ich darauf antworten soll.'
|
||||
}
|
||||
|
||||
}
|
@ -151,4 +151,12 @@ drua.channel_set_about = function(chat, text)
|
||||
return drua.send(command)
|
||||
end
|
||||
|
||||
drua.block = function(user)
|
||||
return drua.send('block_user user#' .. user)
|
||||
end
|
||||
|
||||
drua.unblock = function(user)
|
||||
return drua.send('unblock_user user#' .. user)
|
||||
end
|
||||
|
||||
return drua
|
||||
|
@ -5,7 +5,7 @@ local bindings -- Load Telegram bindings.
|
||||
local utilities -- Load miscellaneous and cross-plugin functions.
|
||||
local redis = (loadfile "./otouto/redis.lua")()
|
||||
|
||||
bot.version = '2.0'
|
||||
bot.version = '2.1'
|
||||
|
||||
function bot:init(config) -- The function run when the bot is started or reloaded.
|
||||
|
||||
@ -32,6 +32,28 @@ function bot:init(config) -- The function run when the bot is started or reloade
|
||||
self.database = utilities.load_data(self.info.username..'.db')
|
||||
end
|
||||
|
||||
-- MIGRATION CODE 2.0 -> 2.1
|
||||
if self.database.users and self.database.version ~= '2.1' then
|
||||
self.database.userdata = {}
|
||||
for id, user in pairs(self.database.users) do
|
||||
self.database.userdata[id] = {}
|
||||
self.database.userdata[id].nickname = user.nickname
|
||||
self.database.userdata[id].lastfm = user.lastfm
|
||||
user.nickname = nil
|
||||
user.lastfm = nil
|
||||
user.id_str = nil
|
||||
user.name = nil
|
||||
end
|
||||
end
|
||||
-- END MIGRATION CODE
|
||||
|
||||
-- Table to cache user info (usernames, IDs, etc).
|
||||
self.database.users = self.database.users or {}
|
||||
-- Table to store userdata (nicknames, lastfm usernames, etc).
|
||||
self.database.userdata = self.database.userdata or {}
|
||||
-- Save the bot's version in the database to make migration simpler.
|
||||
self.database.version = bot.version
|
||||
-- Add updated bot info to the user info cache.
|
||||
self.database.users = self.database.users or {} -- Table to cache userdata.
|
||||
self.database.users[tostring(self.info.id)] = self.info
|
||||
|
||||
@ -49,6 +71,7 @@ function bot:init(config) -- The function run when the bot is started or reloade
|
||||
|
||||
self.last_update = self.last_update or 0 -- Set loop variables: Update offset,
|
||||
self.last_cron = self.last_cron or os.date('%M') -- the time of the last cron job,
|
||||
self.last_database_save = self.last_database_save or os.date('%H') -- the time of the last database save,
|
||||
self.is_started = true -- and whether or not the bot should be running.
|
||||
|
||||
end
|
||||
@ -57,18 +80,24 @@ function bot:on_msg_receive(msg, config) -- The fn run whenever a message is rec
|
||||
-- remove comment to enable debugging
|
||||
-- vardump(msg)
|
||||
-- Cache user info for those involved.
|
||||
utilities.create_user_entry(self, msg.from)
|
||||
if msg.forward_from and msg.forward_from.id ~= msg.from.id then
|
||||
utilities.create_user_entry(self, msg.forward_from)
|
||||
elseif msg.reply_to_message and msg.reply_to_message.from.id ~= msg.from.id then
|
||||
utilities.create_user_entry(self, msg.reply_to_message.from)
|
||||
end
|
||||
|
||||
if msg.date < os.time() - 5 then return end -- Do not process old messages.
|
||||
|
||||
-- Cache user info for those involved.
|
||||
self.database.users[tostring(msg.from.id)] = msg.from
|
||||
if msg.reply_to_message then
|
||||
self.database.users[tostring(msg.reply_to_message.from.id)] = msg.reply_to_message.from
|
||||
elseif msg.forward_from then
|
||||
self.database.users[tostring(msg.forward_from.id)] = msg.forward_from
|
||||
elseif msg.new_chat_member then
|
||||
self.database.users[tostring(msg.new_chat_member.id)] = msg.new_chat_member
|
||||
elseif msg.left_chat_member then
|
||||
self.database.users[tostring(msg.left_chat_member.id)] = msg.left_chat_member
|
||||
end
|
||||
|
||||
msg = utilities.enrich_message(msg)
|
||||
|
||||
|
||||
-- Support deep linking.
|
||||
if msg.text:match('^'..config.cmd_pat..'start .+') then
|
||||
msg.text = config.cmd_pat .. utilities.input(msg.text)
|
||||
msg.text_lower = msg.text:lower()
|
||||
@ -104,6 +133,7 @@ function bot:on_callback_receive(callback, msg, config) -- whenever a new callba
|
||||
print('Callback Query "'..param..'" für Plugin "'..called_plugin..'" ausgelöst von '..callback.from.first_name..' ('..callback.from.id..')')
|
||||
|
||||
msg = utilities.enrich_message(msg)
|
||||
|
||||
for _, plugin in ipairs(self.plugins) do
|
||||
if plugin.name == called_plugin then
|
||||
if is_plugin_disabled_on_chat(plugin.name, msg) then return end
|
||||
@ -143,7 +173,10 @@ function bot:run(config)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if self.last_database_save ~= os.date('%H') then
|
||||
utilities.save_data(self.info.username..'.db', self.database) -- Save the database.
|
||||
self.last_database_save = os.date('%H')
|
||||
end
|
||||
end
|
||||
|
||||
-- Save the database before exiting.
|
||||
@ -163,7 +196,7 @@ function pre_process_msg(self, msg, config)
|
||||
end
|
||||
|
||||
function match_plugins(self, msg, config, plugin)
|
||||
for _, trigger in pairs(plugin.triggers) do
|
||||
for _, trigger in pairs(plugin.triggers or {}) do
|
||||
if string.match(msg.text_lower, trigger) then
|
||||
-- Check if Plugin is disabled
|
||||
if is_plugin_disabled_on_chat(plugin.name, msg) then return end
|
||||
|
@ -18,13 +18,14 @@ function about:action(msg, config)
|
||||
-- disabled to restore old behaviour
|
||||
-- if msg.forward_from then return end
|
||||
|
||||
local output = config.about_text .. '\nBrawlbot v2.0, basierend auf Otouto von topkecleon.'
|
||||
local output = config.about_text .. '\nBrawlbot v'..bot.version..', basierend auf Otouto von topkecleon.'
|
||||
|
||||
if
|
||||
(msg.new_chat_participant and msg.new_chat_participant.id == self.info.id)
|
||||
or msg.text_lower:match('^'..config.cmd_pat..'about')
|
||||
or msg.text_lower:match('^'..config.cmd_pat..'about@'..self.info.username:lower())
|
||||
or msg.text_lower:match('^'..config.cmd_pat..'start')
|
||||
(msg.new_chat_member and msg.new_chat_member.id == self.info.id)
|
||||
or msg.text_lower:match('^'..config.cmd_pat..'about$')
|
||||
or msg.text_lower:match('^'..config.cmd_pat..'about@'..self.info.username:lower()..'$')
|
||||
or msg.text_lower:match('^'..config.cmd_pat..'start$')
|
||||
or msg.text_lower:match('^'..config.cmd_pat..'start@'..self.info.username:lower()..'$')
|
||||
then
|
||||
utilities.send_message(self, msg.chat.id, output, true, nil, true)
|
||||
return
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -17,8 +17,8 @@ blacklist.triggers = {
|
||||
|
||||
function blacklist:action(msg, config)
|
||||
|
||||
if self.database.blacklist[msg.from.id_str] then return end
|
||||
if self.database.blacklist[msg.chat.id_str] then return end
|
||||
if self.database.blacklist[tostring(msg.from.id)] then return end
|
||||
if self.database.blacklist[tostring(msg.chat.id)] then return end
|
||||
if not msg.text:match('^'..config.cmd_pat..'blacklist') then return true end
|
||||
if msg.from.id ~= config.admin then return end
|
||||
|
||||
@ -35,9 +35,15 @@ function blacklist:action(msg, config)
|
||||
if self.database.blacklist[tostring(target.id)] then
|
||||
self.database.blacklist[tostring(target.id)] = nil
|
||||
utilities.send_reply(self, msg, target.name .. ' has been removed from the blacklist.')
|
||||
if config.drua_block_on_blacklist then
|
||||
require('drua-tg').unblock(target.id)
|
||||
end
|
||||
else
|
||||
self.database.blacklist[tostring(target.id)] = true
|
||||
utilities.send_reply(self, msg, target.name .. ' has been added to the blacklist.')
|
||||
if config.drua_block_on_blacklist then
|
||||
require('drua-tg').block(target.id)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -17,7 +17,7 @@ function control:action(msg, config)
|
||||
return
|
||||
end
|
||||
|
||||
if msg.date < os.time() - 1 then return end
|
||||
if msg.date < os.time() - 2 then return end
|
||||
|
||||
if msg.text_lower:match('^'..cmd_pat..'restart') then
|
||||
for pac, _ in pairs(package.loaded) do
|
||||
|
@ -41,12 +41,16 @@ end
|
||||
|
||||
function greetings:action(msg, config)
|
||||
|
||||
local nick = self.database.users[msg.from.id_str].nickname or msg.from.first_name
|
||||
local nick = utilities.build_name(msg.from.first_name, msg.from.last_name)
|
||||
if self.database.userdata[tostring(msg.from.id)] then
|
||||
nick = self.database.userdata[tostring(msg.from.id)].nickname or nick
|
||||
end
|
||||
|
||||
for trigger,responses in pairs(config.greetings) do
|
||||
for _,response in pairs(responses) do
|
||||
if msg.text_lower:match(response..',? '..self.info.first_name:lower()) then
|
||||
utilities.send_message(self, msg.chat.id, utilities.latcyr(trigger:gsub('#NAME', nick)))
|
||||
local output = utilities.char.zwnj .. trigger:gsub('#NAME', nick)
|
||||
utilities.send_message(self, msg.chat.id, output)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
@ -30,6 +30,8 @@ lastfm.command = 'lastfm'
|
||||
function lastfm:action(msg, config)
|
||||
|
||||
local input = utilities.input(msg.text)
|
||||
local from_id_str = tostring(msg.from.id)
|
||||
self.database.userdata[from_id_str] = self.database.userdata[from_id_str] or {}
|
||||
|
||||
if string.match(msg.text, '^'..config.cmd_pat..'lastfm') then
|
||||
utilities.send_message(self, msg.chat.id, lastfm.doc, true, msg.message_id, true)
|
||||
@ -38,10 +40,10 @@ function lastfm:action(msg, config)
|
||||
if not input then
|
||||
utilities.send_message(self, msg.chat.id, lastfm.doc, true, msg.message_id, true)
|
||||
elseif input == '--' or input == utilities.char.em_dash then
|
||||
self.database.users[msg.from.id_str].lastfm = nil
|
||||
self.database.userdata[from_id_str].lastfm = nil
|
||||
utilities.send_reply(self, msg, 'Your last.fm username has been forgotten.')
|
||||
else
|
||||
self.database.users[msg.from.id_str].lastfm = input
|
||||
self.database.userdata[from_id_str].lastfm = input
|
||||
utilities.send_reply(self, msg, 'Your last.fm username has been set to "' .. input .. '".')
|
||||
end
|
||||
return
|
||||
@ -53,12 +55,12 @@ function lastfm:action(msg, config)
|
||||
local alert = ''
|
||||
if input then
|
||||
username = input
|
||||
elseif self.database.users[msg.from.id_str].lastfm then
|
||||
username = self.database.users[msg.from.id_str].lastfm
|
||||
elseif self.database.userdata[from_id_str].lastfm then
|
||||
username = self.database.userdata[from_id_str].lastfm
|
||||
elseif msg.from.username then
|
||||
username = msg.from.username
|
||||
alert = '\n\nYour username has been set to ' .. username .. '.\nTo change it, use '..config.cmd_pat..'fmset <username>.'
|
||||
self.database.users[msg.from.id_str].lastfm = username
|
||||
self.database.userdata[from_id_str].lastfm = username
|
||||
else
|
||||
utilities.send_reply(self, msg, 'Please specify your last.fm username or set it with '..config.cmd_pat..'fmset.')
|
||||
return
|
||||
|
@ -4,24 +4,37 @@ local utilities = require('otouto.utilities')
|
||||
|
||||
function me:init(config)
|
||||
me.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('me', true).table
|
||||
me.command = 'me'
|
||||
me.doc = '`Returns userdata stored by the bot.`'
|
||||
end
|
||||
|
||||
function me:action(msg, config)
|
||||
|
||||
local target = self.database.users[msg.from.id_str]
|
||||
local userdata = self.database.userdata[tostring(msg.from.id)] or {}
|
||||
|
||||
if msg.from.id == config.admin and (msg.reply_to_message or utilities.input(msg.text)) then
|
||||
target = utilities.user_from_message(self, msg, true)
|
||||
if target.err then
|
||||
utilities.send_reply(self, msg, target.err)
|
||||
return
|
||||
if msg.from.id == config.admin then
|
||||
if msg.reply_to_message then
|
||||
userdata = self.database.userdata[tostring(msg.reply_to_message.from.id)]
|
||||
else
|
||||
local input = utilities.input(msg.text)
|
||||
if input then
|
||||
local user_id = utilities.id_from_username(self, input)
|
||||
if user_id then
|
||||
userdata = self.database.userdata[tostring(user_id)] or {}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local output = ''
|
||||
for k,v in pairs(target) do
|
||||
for k,v in pairs(userdata) do
|
||||
output = output .. '*' .. k .. ':* `' .. tostring(v) .. '`\n'
|
||||
end
|
||||
|
||||
if output == '' then
|
||||
output = 'There is no data stored for this user.'
|
||||
end
|
||||
|
||||
utilities.send_message(self, msg.chat.id, output, true, nil, true)
|
||||
|
||||
end
|
||||
|
@ -14,34 +14,35 @@ end
|
||||
|
||||
function nick:action(msg, config)
|
||||
|
||||
local target = msg.from
|
||||
local id_str, name
|
||||
|
||||
if msg.from.id == config.admin and msg.reply_to_message then
|
||||
target = msg.reply_to_message.from
|
||||
target.id_str = tostring(target.id)
|
||||
target.name = target.first_name
|
||||
if target.last_name then
|
||||
target.name = target.first_name .. ' ' .. target.last_name
|
||||
end
|
||||
id_str = tostring(msg.reply_to_message.from.id)
|
||||
name = utilities.build_name(msg.reply_to_message.from.first_name, msg.reply_to_message.from.last_name)
|
||||
else
|
||||
id_str = tostring(msg.from.id)
|
||||
name = utilities.build_name(msg.from.first_name, msg.from.last_name)
|
||||
end
|
||||
|
||||
self.database.userdata[id_str] = self.database.userdata[id_str] or {}
|
||||
|
||||
local output
|
||||
local input = utilities.input(msg.text)
|
||||
if not input then
|
||||
if self.database.users[target.id_str].nickname then
|
||||
output = target.name .. '\'s nickname is "' .. self.database.users[target.id_str].nickname .. '".'
|
||||
if self.database.userdata[id_str].nickname then
|
||||
output = name .. '\'s nickname is "' .. self.database.userdata[id_str].nickname .. '".'
|
||||
else
|
||||
output = target.name .. ' currently has no nickname.'
|
||||
output = name .. ' currently has no nickname.'
|
||||
end
|
||||
elseif utilities.utf8_len(input) > 32 then
|
||||
output = 'The character limit for nicknames is 32.'
|
||||
elseif input == '--' or input == utilities.char.em_dash then
|
||||
self.database.users[target.id_str].nickname = nil
|
||||
output = target.name .. '\'s nickname has been deleted.'
|
||||
self.database.userdata[id_str].nickname = nil
|
||||
output = name .. '\'s nickname has been deleted.'
|
||||
else
|
||||
input = input:gsub('\n', ' ')
|
||||
self.database.users[target.id_str].nickname = input
|
||||
output = target.name .. '\'s nickname has been set to "' .. input .. '".'
|
||||
self.database.userdata[id_str].nickname = input
|
||||
output = name .. '\'s nickname has been set to "' .. input .. '".'
|
||||
end
|
||||
|
||||
utilities.send_reply(self, msg, output)
|
||||
|
@ -61,7 +61,7 @@ local slaps = {
|
||||
'VICTIM died. I blame VICTOR.',
|
||||
'VICTIM was axe-murdered by VICTOR.',
|
||||
'VICTIM\'s melon was split by VICTOR.',
|
||||
'VICTIM was slice and diced by VICTOR.',
|
||||
'VICTIM was sliced and diced by VICTOR.',
|
||||
'VICTIM was split from crotch to sternum by VICTOR.',
|
||||
'VICTIM\'s death put another notch in VICTOR\'s axe.',
|
||||
'VICTIM died impossibly!',
|
||||
@ -102,29 +102,52 @@ local slaps = {
|
||||
'VICTIM was impeached.',
|
||||
'VICTIM was one-hit KO\'d by VICTOR.',
|
||||
'VICTOR sent VICTIM to /dev/null.',
|
||||
'VICTOR sent VICTIM down the memory hole.'
|
||||
'VICTOR sent VICTIM down the memory hole.',
|
||||
'VICTIM was a mistake.',
|
||||
'"VICTIM was a mistake." - VICTOR',
|
||||
'VICTOR checkmated VICTIM in two moves.'
|
||||
}
|
||||
|
||||
-- optimize later
|
||||
function slap:action(msg)
|
||||
|
||||
local victor = self.database.users[msg.from.id_str]
|
||||
local victim = utilities.user_from_message(self, msg, true)
|
||||
local input = utilities.input(msg.text)
|
||||
|
||||
local victim_name = victim.nickname or victim.first_name or input
|
||||
local victor_name = victor.nickname or victor.first_name
|
||||
if not victim_name or victim_name == victor_name then
|
||||
victim_name = victor_name
|
||||
local victor_id = msg.from.id
|
||||
local victim_id = utilities.id_from_message(self, msg)
|
||||
-- IDs
|
||||
if victim_id then
|
||||
if victim_id == victor_id then
|
||||
victor_id = self.info.id
|
||||
end
|
||||
else
|
||||
if not input then
|
||||
victor_id = self.info.id
|
||||
victim_id = msg.from.id
|
||||
end
|
||||
end
|
||||
-- Names
|
||||
local victor_name, victim_name
|
||||
if input and not victim_id then
|
||||
victim_name = input
|
||||
else
|
||||
local victim_id_str = tostring(victim_id)
|
||||
if self.database.userdata[victim_id_str] and self.database.userdata[victim_id_str].nickname then
|
||||
victim_name = self.database.userdata[victim_id_str].nickname
|
||||
elseif self.database.users[victim_id_str] then
|
||||
victim_name = utilities.build_name(self.database.users[victim_id_str].first_name, self.database.users[victim_id_str].last_name)
|
||||
else
|
||||
victim_name = victim_id_str
|
||||
end
|
||||
end
|
||||
local victor_id_str = tostring(victor_id)
|
||||
if self.database.userdata[victor_id_str] and self.database.userdata[victor_id_str].nickname then
|
||||
victor_name = self.database.userdata[victor_id_str].nickname
|
||||
elseif self.database.users[victor_id_str] then
|
||||
victor_name = utilities.build_name(self.database.users[victor_id_str].first_name, self.database.users[victor_id_str].last_name)
|
||||
else
|
||||
victor_name = self.info.first_name
|
||||
end
|
||||
|
||||
local output = slaps[math.random(#slaps)]
|
||||
output = output:gsub('VICTIM', victim_name)
|
||||
output = output:gsub('VICTOR', victor_name)
|
||||
output = utilities.char.zwnj .. output
|
||||
|
||||
local output = utilities.char.zwnj .. slaps[math.random(#slaps)]:gsub('VICTIM', victim_name):gsub('VICTOR', victor_name)
|
||||
utilities.send_message(self, msg.chat.id, output)
|
||||
|
||||
end
|
||||
|
||||
return slap
|
||||
|
@ -2,6 +2,7 @@ local weather = {}
|
||||
|
||||
local HTTPS = require('ssl.https')
|
||||
local URL = require('socket.url')
|
||||
local HTTP = require('socket.http')
|
||||
local JSON = require('dkjson')
|
||||
local utilities = require('otouto.utilities')
|
||||
local bindings = require('otouto.bindings')
|
||||
|
@ -16,9 +16,10 @@ function whoami:action(msg)
|
||||
|
||||
if msg.reply_to_message then
|
||||
msg = msg.reply_to_message
|
||||
msg.from.name = utilities.build_name(msg.from.first_name, msg.from.last_name)
|
||||
end
|
||||
|
||||
local from_name = utilities.build_name(msg.from.first_name, msg.from.last_name)
|
||||
|
||||
local chat_id = math.abs(msg.chat.id)
|
||||
if chat_id > 1000000000000 then
|
||||
chat_id = chat_id - 1000000000000
|
||||
@ -26,10 +27,10 @@ function whoami:action(msg)
|
||||
|
||||
local user = 'You are @%s, also known as *%s* `[%s]`'
|
||||
if msg.from.username then
|
||||
user = user:format(utilities.markdown_escape(msg.from.username), msg.from.name, msg.from.id)
|
||||
user = user:format(utilities.markdown_escape(msg.from.username), from_name, msg.from.id)
|
||||
else
|
||||
user = 'You are *%s* `[%s]`,'
|
||||
user = user:format(msg.from.name, msg.from.id)
|
||||
user = user:format(from_name, msg.from.id)
|
||||
end
|
||||
|
||||
local group = '@%s, also known as *%s* `[%s]`.'
|
||||
|
@ -216,41 +216,12 @@ function utilities.utf8_len(s)
|
||||
return chars
|
||||
end
|
||||
|
||||
-- I swear, I copied this from PIL, not yago! :)
|
||||
function utilities.trim(str) -- Trims whitespace from a string.
|
||||
-- Trims whitespace from a string.
|
||||
function utilities.trim(str)
|
||||
local s = str:gsub('^%s*(.-)%s*$', '%1')
|
||||
return s
|
||||
end
|
||||
|
||||
local lc_list = {
|
||||
-- Latin = 'Cyrillic'
|
||||
['A'] = 'А',
|
||||
['B'] = 'В',
|
||||
['C'] = 'С',
|
||||
['E'] = 'Е',
|
||||
['I'] = 'І',
|
||||
['J'] = 'Ј',
|
||||
['K'] = 'К',
|
||||
['M'] = 'М',
|
||||
['H'] = 'Н',
|
||||
['O'] = 'О',
|
||||
['P'] = 'Р',
|
||||
['S'] = 'Ѕ',
|
||||
['T'] = 'Т',
|
||||
['X'] = 'Х',
|
||||
['Y'] = 'Ү',
|
||||
['a'] = 'а',
|
||||
['c'] = 'с',
|
||||
['e'] = 'е',
|
||||
['i'] = 'і',
|
||||
['j'] = 'ј',
|
||||
['o'] = 'о',
|
||||
['s'] = 'ѕ',
|
||||
['x'] = 'х',
|
||||
['y'] = 'у',
|
||||
['!'] = 'ǃ'
|
||||
}
|
||||
|
||||
-- Retruns true if the string is empty
|
||||
function string:isempty()
|
||||
return self == nil or self == ''
|
||||
@ -322,14 +293,6 @@ function vardump(value)
|
||||
print(serpent.block(value, {comment=false}))
|
||||
end
|
||||
|
||||
-- Replaces letters with corresponding Cyrillic characters.
|
||||
function utilities.latcyr(str)
|
||||
for k,v in pairs(lc_list) do
|
||||
str = str:gsub(k, v)
|
||||
end
|
||||
return str
|
||||
end
|
||||
|
||||
-- Loads a JSON file as a table.
|
||||
function utilities.load_data(filename)
|
||||
local f = io.open(filename)
|
||||
@ -393,15 +356,46 @@ end
|
||||
|
||||
function utilities:resolve_username(input)
|
||||
input = input:gsub('^@', '')
|
||||
for _,v in pairs(self.database.users) do
|
||||
if v.username and v.username:lower() == input:lower() then
|
||||
return v
|
||||
for _, user in pairs(self.database.users) do
|
||||
if user.username and user.username:lower() == input:lower() then
|
||||
local t = {}
|
||||
for key, val in pairs(user) do
|
||||
t[key] = val
|
||||
end
|
||||
return t
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Simpler than above function; only returns an ID.
|
||||
-- Returns nil if no ID is available.
|
||||
function utilities:id_from_username(input)
|
||||
input = input:gsub('^@', '')
|
||||
for _, user in pairs(self.database.users) do
|
||||
if user.username and user.username:lower() == input:lower() then
|
||||
return user.id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Simpler than below function; only returns an ID.
|
||||
-- Returns nil if no ID is available.
|
||||
function utilities:id_from_message(msg)
|
||||
if msg.reply_to_message then
|
||||
return msg.reply_to_message.from.id
|
||||
else
|
||||
local input = utilities.input(msg.text)
|
||||
if input then
|
||||
if tonumber(input) then
|
||||
return tonumber(input)
|
||||
elseif input:match('^@') then
|
||||
return utilities.id_from_username(self, input)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function utilities:user_from_message(msg, no_extra)
|
||||
|
||||
local input = utilities.input(msg.text_lower)
|
||||
local target = {}
|
||||
if msg.reply_to_message then
|
||||
@ -543,21 +537,6 @@ function utilities.pretty_float(x)
|
||||
end
|
||||
end
|
||||
|
||||
function utilities:create_user_entry(user)
|
||||
local id = tostring(user.id)
|
||||
-- Clear things that may no longer exist, or create a user entry.
|
||||
if self.database.users[id] then
|
||||
self.database.users[id].username = nil
|
||||
self.database.users[id].last_name = nil
|
||||
else
|
||||
self.database.users[id] = {}
|
||||
end
|
||||
-- Add all the user info to the entry.
|
||||
for k,v in pairs(user) do
|
||||
self.database.users[id][k] = v
|
||||
end
|
||||
end
|
||||
|
||||
-- This table will store unsavory characters that are not properly displayed,
|
||||
-- or are just not fun to type.
|
||||
utilities.char = {
|
||||
|
Reference in New Issue
Block a user