- Portiere Golem und MyAnimeList

- Fixe Help-Plugin
- Fixe Kommandos für Forecast & Wetter
This commit is contained in:
Andreas Bielawski 2016-06-18 16:41:21 +02:00
parent 3f2b987839
commit ddffbdc83f
7 changed files with 300 additions and 11 deletions

View File

@ -44,6 +44,7 @@ function bot:init(config) -- The function run when the bot is started or reloade
self.plugins[k].name = v self.plugins[k].name = v
if p.init then p.init(self, config) end if p.init then p.init(self, config) end
end end
print('Bot started successfully as:\n@' .. self.info.username .. ', AKA ' .. self.info.first_name ..' ('..self.info.id..')') print('Bot started successfully as:\n@' .. self.info.username .. ', AKA ' .. self.info.first_name ..' ('..self.info.id..')')
self.last_update = self.last_update or 0 -- Set loop variables: Update offset, self.last_update = self.last_update or 0 -- Set loop variables: Update offset,

View File

@ -3,6 +3,8 @@ local cats = {}
local HTTP = require('socket.http') local HTTP = require('socket.http')
local utilities = require('otouto.utilities') local utilities = require('otouto.utilities')
cats.command = 'cat [gif]'
function cats:init(config) function cats:init(config)
if not cred_data.cat_apikey then if not cred_data.cat_apikey then
print('Missing config value: cat_apikey.') print('Missing config value: cat_apikey.')
@ -19,7 +21,7 @@ function cats:init(config)
*]]..config.cmd_pat..[[cat* _gif_: Postet eine zufällige, animierte Katze]] *]]..config.cmd_pat..[[cat* _gif_: Postet eine zufällige, animierte Katze]]
end end
cats.command = 'cat [gif]'
local apikey = cred_data.cat_apikey or "" -- apply for one here: http://thecatapi.com/api-key-registration.html local apikey = cred_data.cat_apikey or "" -- apply for one here: http://thecatapi.com/api-key-registration.html
function cats:action(msg, config) function cats:action(msg, config)

View File

@ -36,7 +36,7 @@ function forecast:init(config)
]] ]]
end end
forecast.command = 'forecast' forecast.command = 'f [Ort]'
local BASE_URL = "https://api.forecast.io/forecast" local BASE_URL = "https://api.forecast.io/forecast"
local apikey = cred_data.forecastio_apikey local apikey = cred_data.forecastio_apikey

59
otouto/plugins/golem.lua Normal file
View File

@ -0,0 +1,59 @@
local golem = {}
local http = require('socket.http')
local json = require('dkjson')
local utilities = require('otouto.utilities')
local bindings = require('otouto.bindings')
function golem:init(config)
if not cred_data.golem_apikey then
print('Missing config value: golem_apikey.')
print('golem.lua will not be enabled.')
return
end
golem.triggers = {
"golem.de/news/([A-Za-z0-9-_-]+)-(%d+).html"
}
end
local BASE_URL = 'http://api.golem.de/api'
function golem:get_golem_data (article_identifier)
local apikey = cred_data.golem_apikey
local url = BASE_URL..'/article/meta/'..article_identifier..'/?key='..apikey..'&format=json'
local res,code = http.request(url)
if code ~= 200 then return "HTTP-FEHLER" end
local data = json.decode(res).data
return data
end
function golem:send_golem_data(data)
local headline = '*'..data.headline..'*'
if data.subheadline ~= "" then
subheadline = '\n_'..data.subheadline..'_'
else
subheadline = ""
end
local subheadline = data.subheadline
local abstracttext = data.abstracttext
local text = headline..subheadline..'\n'..abstracttext
local image_url = data.leadimg.url
return text, image_url
end
function golem:action(msg, config, matches)
local article_identifier = matches[2]
local data = golem:get_golem_data(article_identifier)
if not data then utilities.send_reply(self, msg, config.errors.connection) return end
local text, image_url = golem:send_golem_data(data)
if image_url then
utilities.send_typing(self, msg.chat.id, 'upload_photo')
local file = download_to_file(image_url)
utilities.send_photo(self, msg.chat.id, file, nil, msg.message_id)
end
utilities.send_reply(self, msg, text, true)
end
return golem

View File

@ -8,12 +8,17 @@ local utilities = require('otouto.utilities')
local help_text local help_text
function help:init(config) function help:init(config)
help.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('hilfe', true):t('help', true).table
end
function help:action(msg, config)
local commandlist = {} local commandlist = {}
help_text = '*Verfügbare Befehle:*\n'..config.cmd_pat help_text = '*Verfügbare Befehle:*\n'..config.cmd_pat
for _,plugin in ipairs(self.plugins) do for _,plugin in ipairs(self.plugins) do
if plugin.command then if plugin.command then
table.insert(commandlist, plugin.command) table.insert(commandlist, plugin.command)
--help_text = help_text .. '\n• '..config.cmd_pat .. plugin.command:gsub('%[', '\\[') --help_text = help_text .. '\n• '..config.cmd_pat .. plugin.command:gsub('%[', '\\[')
end end
@ -21,17 +26,9 @@ function help:init(config)
table.insert(commandlist, 'hilfe [Plugin]') table.insert(commandlist, 'hilfe [Plugin]')
table.sort(commandlist) table.sort(commandlist)
help_text = help_text .. table.concat(commandlist, '\n'..config.cmd_pat) .. '\nParameter: <benötigt> [optional]' help_text = help_text .. table.concat(commandlist, '\n'..config.cmd_pat) .. '\nParameter: <benötigt> [optional]'
help_text = help_text:gsub('%[', '\\[') help_text = help_text:gsub('%[', '\\[')
help.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('hilfe', true):t('help', true).table
end
function help:action(msg)
local input = utilities.input(msg.text_lower) local input = utilities.input(msg.text_lower)
-- Attempts to send the help message via PM. -- Attempts to send the help message via PM.

View File

@ -0,0 +1,230 @@
local mal = {}
local http = require('socket.http')
local URL = require('socket.url')
local xml = require("xml")
local utilities = require('otouto.utilities')
local bindings = require('otouto.bindings')
mal.command = 'anime <Anime>, /manga <Manga>'
function mal:init(config)
if not cred_data.mal_user then
print('Missing config value: mal_user.')
print('myanimelist.lua will not be enabled.')
return
elseif not cred_data.mal_pw then
print('Missing config value: mal_pw.')
print('myanimelist.lua will not be enabled.')
return
end
mal.triggers = {
"^/(anime) (.+)$",
"myanimelist.net/(anime)/[0-9]+/(.*)$",
"^/(manga) (.+)$",
"myanimelist.net/(manga)/[0-9]+/(.*)$"
}
mal.doc = [[*
]]..config.cmd_pat..[[anime*_ <Anime>_: Sendet Infos zum Anime
*]]..config.cmd_pat..[[manga*_ <Manga>_: Sendet Infos zum Manga
]]
end
local user = cred_data.mal_user
local password = cred_data.mal_pw
local BASE_URL = 'http://'..user..':'..password..'@myanimelist.net/api'
function mal:delete_tags(str)
str = string.gsub( str, '<br />', '')
str = string.gsub( str, '%[i%]', '')
str = string.gsub( str, '%[/i%]', '')
str = string.gsub( str, '&mdash;', '')
return str
end
local makeOurDate = function(dateString)
local pattern = "(%d+)%-(%d+)%-(%d+)"
local year, month, day = dateString:match(pattern)
return day..'.'..month..'.'..year
end
function mal:get_mal_info(query, typ)
if typ == 'anime' then
url = BASE_URL..'/anime/search.xml?q='..query
elseif typ == 'manga' then
url = BASE_URL..'/manga/search.xml?q='..query
end
local res,code = http.request(url)
if code ~= 200 then return "HTTP-Fehler" end
local result = xml.load(res)
return result
end
function mal:send_anime_data(result, receiver)
local title = xml.find(result, 'title')[1]
local id = xml.find(result, 'id')[1]
local mal_url = 'http://myanimelist.net/anime/'..id
if xml.find(result, 'synonyms')[1] then
alt_name = '\noder: '..unescape(mal:delete_tags(xml.find(result, 'synonyms')[1]))
else
alt_name = ''
end
if xml.find(result, 'synopsis')[1] then
desc = '\n'..unescape(mal:delete_tags(string.sub(xml.find(result, 'synopsis')[1], 1, 200))) .. '...'
else
desc = ''
end
if xml.find(result, 'episodes')[1] then
episodes = '\nEpisoden: '..xml.find(result, 'episodes')[1]
else
episodes = ''
end
if xml.find(result, 'status')[1] then
status = ' ('..xml.find(result, 'status')[1]..')'
else
status = ''
end
if xml.find(result, 'score')[1] ~= "0.00" then
score = '\nScore: '..string.gsub(xml.find(result, 'score')[1], "%.", ",")
else
score = ''
end
if xml.find(result, 'type')[1] then
typ = '\nTyp: '..xml.find(result, 'type')[1]
else
typ = ''
end
if xml.find(result, 'start_date')[1] ~= "0000-00-00" then
startdate = '\nVeröffentlichungszeitraum: '..makeOurDate(xml.find(result, 'start_date')[1])
else
startdate = ''
end
if xml.find(result, 'end_date')[1] ~= "0000-00-00" then
enddate = ' - '..makeOurDate(xml.find(result, 'end_date')[1])
else
enddate = ''
end
local text = '*'..title..'*'..alt_name..typ..episodes..status..score..startdate..enddate..'_'..desc..'_\n[Auf MyAnimeList ansehen]('..mal_url..')'
if xml.find(result, 'image') then
local image_url = xml.find(result, 'image')[1]
return text, image_url
else
return text
end
end
function mal:send_manga_data(result)
local title = xml.find(result, 'title')[1]
local id = xml.find(result, 'id')[1]
local mal_url = 'http://myanimelist.net/manga/'..id
if xml.find(result, 'type')[1] then
typ = ' ('..xml.find(result, 'type')[1]..')'
else
typ = ''
end
if xml.find(result, 'synonyms')[1] then
alt_name = '\noder: '..unescape(mal:delete_tags(xml.find(result, 'synonyms')[1]))
else
alt_name = ''
end
if xml.find(result, 'chapters')[1] then
chapters = '\nKapitel: '..xml.find(result, 'chapters')[1]
else
chapters = ''
end
if xml.find(result, 'status')[1] then
status = ' ('..xml.find(result, 'status')[1]..')'
else
status = ''
end
if xml.find(result, 'volumes')[1] then
volumes = '\nBände '..xml.find(result, 'volumes')[1]
else
volumes = ''
end
if xml.find(result, 'score')[1] ~= "0.00" then
score = '\nScore: '..xml.find(result, 'score')[1]
else
score = ''
end
if xml.find(result, 'start_date')[1] ~= "0000-00-00" then
startdate = '\nVeröffentlichungszeitraum: '..makeOurDate(xml.find(result, 'start_date')[1])
else
startdate = ''
end
if xml.find(result, 'end_date')[1] ~= "0000-00-00" then
enddate = ' - '..makeOurDate(xml.find(result, 'end_date')[1])
else
enddate = ''
end
if xml.find(result, 'synopsis')[1] then
desc = '\n'..unescape(mal:delete_tags(string.sub(xml.find(result, 'synopsis')[1], 1, 200))) .. '...'
else
desc = ''
end
local text = '*'..title..'*'..alt_name..typ..chapters..status..volumes..score..startdate..enddate..'_'..desc..'_\n[Auf MyAnimeList ansehen]('..mal_url..')'
if xml.find(result, 'image') then
local image_url = xml.find(result, 'image')[1]
return text, image_url
else
return text
end
end
function mal:action(msg, config)
local query = URL.escape(matches[2])
if matches[1] == 'anime' then
local anime_info = mal:get_mal_info(query, 'anime')
if anime_info == "HTTP-Fehler" then
utilities.send_reply(self, msg, 'Anime nicht gefunden!')
return
else
local text, image_url = mal:send_anime_data(anime_info)
if image_url then
utilities.send_typing(self, msg.chat.id, 'upload_photo')
local file = download_to_file(image_url)
utilities.send_photo(self, msg.chat.id, file, nil, msg.message_id)
end
utilities.send_reply(self, msg, text, true)
return
end
elseif matches[1] == 'manga' then
local manga_info = mal:get_mal_info(query, 'manga')
if manga_info == "HTTP-Fehler" then
utilities.send_reply(self, msg, 'Manga nicht gefunden!')
return
else
local text, image_url = mal:send_manga_data(manga_info)
if image_url then
utilities.send_typing(self, msg.chat.id, 'upload_photo')
local file = download_to_file(image_url)
utilities.send_photo(self, msg.chat.id, file, nil, msg.message_id)
end
utilities.send_reply(self, msg, text, true)
return
end
end
end
return mal

View File

@ -30,7 +30,7 @@ function weather:init(config)
]] ]]
end end
weather.command = 'wetter' weather.command = 'w [Ort]'
local BASE_URL = "https://api.forecast.io/forecast" local BASE_URL = "https://api.forecast.io/forecast"
local apikey = cred_data.forecastio_apikey local apikey = cred_data.forecastio_apikey