diff --git a/otouto/bot.lua b/otouto/bot.lua index cf551e8..53c80e4 100644 --- a/otouto/bot.lua +++ b/otouto/bot.lua @@ -364,7 +364,7 @@ function create_plugin_set() 'currency', 'banhammer', 'plugins', - 'settings', + 'respond', 'help' } print ('enabling a few plugins - saving to redis set telegram:enabled_plugins') diff --git a/otouto/plugins/9gag.lua b/otouto/plugins/9gag.lua deleted file mode 100644 index 1062d55..0000000 --- a/otouto/plugins/9gag.lua +++ /dev/null @@ -1,59 +0,0 @@ -local ninegag = {} - -ninegag.command = '9gag' - -function ninegag:init(config) - ninegag.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('9gag', true):t('9fag', true).table - ninegag.inline_triggers = { - "^9gag" - } - ninegag.doc = [[* -]]..config.cmd_pat..[[9gag*: Gibt ein zufälliges Bild von den momentan populärsten 9GAG-Posts aus]] -end - -local url = "http://api-9gag.herokuapp.com/" - -function ninegag:get_9GAG() - local b,c = http.request(url) - if c ~= 200 then return nil end - local gag = json.decode(b) - -- random max json table size - local i = math.random(#gag) - - local link_image = gag[i].src - local title = gag[i].title - local post_url = gag[i].url - return link_image, title, post_url -end - -function ninegag:inline_callback(inline_query, config) - local res, code = http.request(url) - if code ~= 200 then abort_inline_query(inline_query) return end - local gag = json.decode(res) - - local results = '[' - local id = 50 - for n in pairs(gag) do - local title = gag[n].title:gsub('"', '\\"') - results = results..'{"type":"photo","id":"'..id..'","photo_url":"'..gag[n].src..'","thumb_url":"'..gag[n].src..'","caption":"'..title..'","reply_markup":{"inline_keyboard":[[{"text":"9GAG aufrufen","url":"'..gag[n].url..'"}]]}}' - id = id+1 - if n < #gag then - results = results..',' - end - end - local results = results..']' - utilities.answer_inline_query(inline_query, results, 300) -end - -function ninegag:action(msg, config) - utilities.send_typing(msg.chat.id, 'upload_photo') - local url, title, post_url = ninegag:get_9GAG() - if not url then - utilities.send_reply(msg, config.errors.connection) - return - end - - utilities.send_photo(msg.chat.id, url, title, msg.message_id, '{"inline_keyboard":[[{"text":"Post aufrufen","url":"'..post_url..'"}]]}') -end - -return ninegag diff --git a/otouto/plugins/afk.lua b/otouto/plugins/afk.lua index 24cd97d..bfb1d13 100644 --- a/otouto/plugins/afk.lua +++ b/otouto/plugins/afk.lua @@ -80,20 +80,11 @@ function afk:pre_process(msg) local duration = makeHumanTime(afk_time) redis:hset(hash, 'afk', false) - local show_afk_keyboard = redis:hget(uhash, 'afk_keyboard') if afk_text then redis:hset(hash, 'afk_text', false) - if show_afk_keyboard == 'true' then - utilities.send_reply(msg, user_name..' ist wieder da (war: '..afk_text..' für '..duration..')!', 'HTML', '{"hide_keyboard":true,"selective":true}') - else - utilities.send_message(chat_id, user_name..' ist wieder da (war: '..afk_text..' für '..duration..')!', true, nil, 'HTML') - end + utilities.send_message(chat_id, user_name..' ist wieder da (war: '..afk_text..' für '..duration..')!', true, nil, 'HTML') else - if show_afk_keyboard == 'true' then - utilities.send_reply(msg, user_name..' ist wieder da (war '..duration..' weg)!', nil, '{"hide_keyboard":true,"selective":true}') - else - utilities.send_message(chat_id, user_name..' ist wieder da (war '..duration..' weg)!') - end + utilities.send_message(chat_id, user_name..' ist wieder da (war '..duration..' weg)!') end end @@ -111,14 +102,8 @@ function afk:action(msg, config, matches) local user_name = get_name(msg) local timestamp = msg.date local uhash = 'user:'..msg.from.id - local show_afk_keyboard = redis:hget(uhash, 'afk_keyboard') - if show_afk_keyboard == 'true' then - keyboard = '{"keyboard":[[{"text":"Wieder da."}]], "one_time_keyboard":true, "selective":true, "resize_keyboard":true}' - else - keyboard = nil - end - utilities.send_reply(msg, afk:switch_afk(user_name, user_id, chat_id, timestamp, matches[2]), false, keyboard) + utilities.send_reply(msg, afk:switch_afk(user_name, user_id, chat_id, timestamp, matches[2]), false) end return afk \ No newline at end of file diff --git a/otouto/plugins/ap.lua b/otouto/plugins/ap.lua deleted file mode 100644 index 7e36b7f..0000000 --- a/otouto/plugins/ap.lua +++ /dev/null @@ -1,38 +0,0 @@ -local ap = {} - -ap.triggers = { - "hosted.ap.org/dynamic/stories/(.+)" -} - -function ap:get_article(article) - local url = 'http://hosted.ap.org/dynamic/stories/'..article - local res, code = http.request(url) - if code ~= 200 then return 'HTTP-Fehler '..code..' ist aufgetreten.' end - - local headline = res:match('(.-)') - if not headline then return end - - local article = unescape(utilities.trim(res:match('

(.-)

'))) - - local pic_url = res:match('\n'..article - return text, pic_url -end - -function ap:action(msg, config, matches) - local article_id = matches[1] - local article, pic = ap:get_article(article_id) - if not article then - utilities.send_reply(msg, config.errors.connection) - return - end - - if pic then - local pic = pic:gsub('-small', '-big') - utilities.send_photo(msg.chat.id, 'http://hosted.ap.org'..pic, nil, msg.message_id) - end - utilities.send_reply(msg, article, 'HTML') -end - -return ap \ No newline at end of file diff --git a/otouto/plugins/bitly_create.lua b/otouto/plugins/bitly_create.lua deleted file mode 100644 index 9d2c7df..0000000 --- a/otouto/plugins/bitly_create.lua +++ /dev/null @@ -1,137 +0,0 @@ -local bitly_create = {} - -function bitly_create:init(config) - if not cred_data.bitly_client_id then - print('Missing config value: bitly_client_id.') - print('bitly_create.lua will not be enabled.') - return - elseif not cred_data.bitly_client_secret then - print('Missing config value: bitly_client_secret.') - print('bitly_create.lua will not be enabled.') - return - elseif not cred_data.bitly_redirect_uri then - print('Missing config value: bitly_redirect_uri.') - print('bitly_create.lua will not be enabled.') - return - end - - bitly_create.triggers = { - "^/short(auth)(.+)$", - "^/short (auth)$", - "^/short (unauth)$", - "^/short (me)$", - "^/short (j.mp) (https?://[%w-_%.%?%.:/%+=&]+)$", - "^/short (bit.ly) (https?://[%w-_%.%?%.:/%+=&]+)$", - "^/short (bitly.com) (https?://[%w-_%.%?%.:/%+=&]+)$", - "^/short (https?://[%w-_%.%?%.:/%+=&]+)$" - } - bitly_create.doc = [[* -]]..config.cmd_pat..[[short* __: Kürzt einen Link mit der Standard Bitly-Adresse -*]]..config.cmd_pat..[[short* __ _[Link]_: Kürzt einen Link mit der ausgewählten Kurz-URL -*]]..config.cmd_pat..[[short* _auth_: Loggt deinen Account ein und nutzt ihn für deine Links (empfohlen!) -*]]..config.cmd_pat..[[short* _me_: Gibt den eingeloggten Account aus -*]]..config.cmd_pat..[[short* _unauth_: Loggt deinen Account aus -]] -end - -bitly_create.command = 'short ' - -local BASE_URL = 'https://api-ssl.bitly.com' - -local client_id = cred_data.bitly_client_id -local client_secret = cred_data.bitly_client_secret -local redirect_uri = cred_data.bitly_redirect_uri - -function bitly_create:get_bitly_access_token(hash, code) - local req = post_petition(BASE_URL..'/oauth/access_token', 'client_id='..client_id..'&client_secret='..client_secret..'&code='..code..'&redirect_uri='..redirect_uri) - if not req.access_token then return '*Fehler beim Einloggen!*' end - - local access_token = req.access_token - local login_name = req.login - redis:hset(hash, 'bitly', access_token) - return 'Erfolgreich als `'..login_name..'` eingeloggt!' -end - -function bitly_create:get_bitly_user_info(bitly_access_token) - local url = BASE_URL..'/v3/user/info?access_token='..bitly_access_token..'&format=json' - local res,code = https.request(url) - if code == 401 then return 'Login fehlgeschlagen!' end - if code ~= 200 then return 'HTTP-Fehler!' end - - local data = json.decode(res).data - - if data.full_name then - name = '*'..data.full_name..'* (`'..data.login..'`)' - else - name = '`'..data.login..'`' - end - - local text = 'Eingeloggt als '..name - - return text -end - -function bitly_create:create_bitlink (long_url, domain, bitly_access_atoken) - local url = BASE_URL..'/v3/shorten?access_token='..bitly_access_token..'&domain='..domain..'&longUrl='..long_url..'&format=txt' - local text,code = https.request(url) - if code ~= 200 then return 'FEHLER: '..text end - return text -end - -function bitly_create:action(msg, config, matches) - local hash = 'user:'..msg.from.id - bitly_access_token = redis:hget(hash, 'bitly') - - if matches[1] == 'auth' and matches[2] then - utilities.send_reply(msg, bitly_create:get_bitly_access_token(hash, matches[2]), true) - local message_id = redis:hget(hash, 'bitly_login_msg') - utilities.edit_message(msg.chat.id, message_id, '*Anmeldung abgeschlossen!*', true, true) - redis:hdel(hash, 'bitly_login_msg') - return - end - - if matches[1] == 'auth' then - local result = utilities.send_reply(msg, '*Bitte logge dich ein und folge den Anweisungen.*', true, '{"inline_keyboard":[[{"text":"Bei Bitly anmelden","url":"https://bitly.com/oauth/authorize?client_id='..client_id..'&redirect_uri='..redirect_uri..'&state='..self.info.username..'"}]]}') - redis:hset(hash, 'bitly_login_msg', result.result.message_id) - return - end - - if matches[1] == 'unauth' and bitly_access_token then - redis:hdel(hash, 'bitly') - utilities.send_reply(msg, '*Erfolgreich ausgeloggt!* Du kannst den Zugriff [in deinen Kontoeinstellungen](https://bitly.com/a/settings/connected) endgültig entziehen.', true) - return - elseif matches[1] == 'unauth' and not bitly_access_token then - utilities.send_reply(msg, 'Wie willst du dich ausloggen, wenn du gar nicht eingeloggt bist?', true) - return - end - - if matches[1] == 'me' and bitly_access_token then - local text = bitly_create:get_bitly_user_info(bitly_access_token) - if text then - utilities.send_reply(msg, text, true) - return - else - return - end - elseif matches[1] == 'me' and not bitly_access_token then - utilities.send_reply(msg, 'Du bist nicht eingeloggt! Logge dich ein mit\n/short auth', true) - return - end - - if not bitly_access_token then - print('Not signed in, will use global bitly access_token') - bitly_access_token = cred_data.bitly_access_token - end - - if matches[2] == nil then - long_url = URL.encode(matches[1]) - domain = 'bit.ly' - else - long_url = URL.encode(matches[2]) - domain = matches[1] - end - utilities.send_reply(msg, bitly_create:create_bitlink(long_url, domain, bitly_access_token)) - return -end - -return bitly_create \ No newline at end of file diff --git a/otouto/plugins/btc.lua b/otouto/plugins/btc.lua deleted file mode 100644 index 12be801..0000000 --- a/otouto/plugins/btc.lua +++ /dev/null @@ -1,34 +0,0 @@ -local btc = {} - -function btc:init(config) - btc.triggers = { - "^/btc$" - } - btc.doc = [[* -]]..config.cmd_pat..[[btc*: Zeigt aktuellen Bitcoin-Kurs an]] -end - -btc.command = 'btc' - --- See https://bitcoinaverage.com/api -function btc:getBTCX() - local base_url = 'https://api.bitcoinaverage.com/ticker/global/' - -- Do request on bitcoinaverage, the final / is critical! - local res,code = https.request(base_url.."EUR/") - - if code ~= 200 then return nil end - local data = json.decode(res) - local ask = string.gsub(data.ask, "%.", ",") - local bid = string.gsub(data.bid, "%.", ",") - - -- Easy, it's right there - text = 'BTC/EUR\n'..'*Kaufen:* '..ask..'\n'..'*Verkaufen:* '..bid - return text -end - - -function btc:action(msg, config, matches) - utilities.send_reply(msg, btc:getBTCX(cur), true) -end - -return btc \ No newline at end of file diff --git a/otouto/plugins/cats.lua b/otouto/plugins/cats.lua deleted file mode 100644 index 4b8d8b0..0000000 --- a/otouto/plugins/cats.lua +++ /dev/null @@ -1,112 +0,0 @@ -local cats = {} - -cats.command = 'cat [gif]' - -function cats:init(config) - if not cred_data.cat_apikey then - print('Missing config value: cat_apikey.') - print('cats.lua will be enabled, but there are more features with a key.') - end - - cats.triggers = { - "^/cat$", - "^/cat (gif)$" - } - - cats.inline_triggers = { - "^cat (gif)$", - "^cat$" - } - - cats.doc = [[* -]]..config.cmd_pat..[[cat*: Postet eine zufällige Katze -*]]..config.cmd_pat..[[cat* _gif_: Postet eine zufällige, animierte Katze]] -end - -local apikey = cred_data.cat_apikey or "" -- apply for one here: http://thecatapi.com/api-key-registration.html -local BASE_URL = 'http://thecatapi.com/api/images/get' - -function cats:inline_callback(inline_query, config, matches) - if matches[1] == 'gif' then - img_type = 'gif' - id = 100 - else - img_type = 'jpg' - id = 200 - end - local url = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D%27http%3A%2F%2Fthecatapi.com%2Fapi%2Fimages%2Fget%3Fformat%3Dxml%26results_per_page%3D50%26type%3D'..img_type..'%26apikey%3D'..apikey..'%27&format=json' -- no way I'm using XML, plz die - local res, code = https.request(url) - if code ~= 200 then return end - local data = json.decode(res).query.results.response.data.images.image - if not data then return end - if not data[1] then return end - - local results = '[' - - for n in pairs(data) do - if img_type == 'gif' then - results = results..'{"type":"gif","id":"'..id..'","gif_url":"'..data[n].url..'","thumb_url":"'..data[n].url..'"}' - id = id+1 - else - results = results..'{"type":"photo","id":"'..id..'","photo_url":"'..data[n].url..'","thumb_url":"'..data[n].url..'"}' - id = id+1 - end - if n < #data then - results = results..',' - end - end - local results = results..']' - utilities.answer_inline_query(inline_query, results, 30) -end - -function cats:get_cat(gif) - if gif then - local url = BASE_URL..'?type=gif&apikey='..apikey - file = download_to_file(url, 'miau.gif') - else - local url = BASE_URL..'?type=jpg,png&apikey='..apikey - file = download_to_file(url, 'miau.png') - end - return file -end - -function cats:callback(callback, msg, self, config, input) - utilities.answer_callback_query(callback, 'Miau!') - utilities.send_typing(msg.chat.id, 'upload_photo') - if string.isempty(input) then - local file = cats:get_cat() - if not file then - utilities.answer_callback_query(callback, 'Beim Herunterladen ist ein Fehler aufgetreten :(', true) - return - end - utilities.send_photo(msg.chat.id, file, nil, msg.message_id, '{"inline_keyboard":[[{"text":"Nochmal!","callback_data":"cats:"}]]}') - else - local file = cats:get_cat(true) - if not file then - utilities.answer_callback_query(callback, 'Beim Herunterladen ist ein Fehler aufgetreten :(', true) - return - end - utilities.send_document(msg.chat.id, file, nil, msg.message_id, '{"inline_keyboard":[[{"text":"Nochmal!","callback_data":"cats:gif"}]]}') - end -end - -function cats:action(msg, config, matches) - utilities.send_typing(msg.chat.id, 'upload_photo') - if matches[1] == 'gif' then - local file = cats:get_cat(true) - if not file then - utilities.send_reply(msg, config.errors.connection) - return - end - utilities.send_document(msg.chat.id, file, nil, msg.message_id, '{"inline_keyboard":[[{"text":"Nochmal!","callback_data":"cats:gif"}]]}') - else - local file = cats:get_cat() - if not file then - utilities.send_reply(msg, config.errors.connection) - return - end - utilities.send_photo(msg.chat.id, file, nil, msg.message_id, '{"inline_keyboard":[[{"text":"Nochmal!","callback_data":"cats:"}]]}') - end -end - -return cats \ No newline at end of file diff --git a/otouto/plugins/clypit.lua b/otouto/plugins/clypit.lua deleted file mode 100644 index 893ad62..0000000 --- a/otouto/plugins/clypit.lua +++ /dev/null @@ -1,28 +0,0 @@ -local clypit = {} - -clypit.triggers = { - "clyp.it/([A-Za-z0-9-_-]+)" -} - -function clypit:get_clypit_details(shortcode) - local BASE_URL = "http://api.clyp.it" - local url = BASE_URL..'/'..shortcode - local res,code = http.request(url) - if code ~= 200 then return nil end - local data = json.decode(res) - - local title = data.Title - local duration = data.Duration - - local audio = download_to_file(data.Mp3Url) - return audio, title, duration -end - -function clypit:action(msg, config, matches) - utilities.send_typing(msg.chat.id, 'upload_audio') - local audio, title, duration = clypit:get_clypit_details(matches[1]) - if not audio then return utilities.send_reply(msg, config.errors.connection) end - utilities.send_audio(msg.chat.id, audio, nil, msg.message_id, duration, nil, title) -end - -return clypit diff --git a/otouto/plugins/deviantart.lua b/otouto/plugins/deviantart.lua deleted file mode 100644 index 2cc2fc7..0000000 --- a/otouto/plugins/deviantart.lua +++ /dev/null @@ -1,48 +0,0 @@ -local deviantart = {} - -deviantart.triggers = { - "http://(.*).deviantart.com/art/(.*)" -} - -local BASE_URL = 'https://backend.deviantart.com' - -function deviantart:get_da_data (da_code) - local url = BASE_URL..'/oembed?url='..da_code - local res,code = https.request(url) - if code ~= 200 then return nil end - local data = json.decode(res) - return data -end - -function deviantart:send_da_data (data) - local title = data.title - local category = data.category - local author_name = data.author_name - local text = title..' von '..author_name..'\n'..category - - if data.rating == "adult" then - return title..' von '..author_name..'\n'..category..'\n(NSFW)' - else - local image_url = data.fullsize_url - if image_url == nil then - image_url = data.url - end - local file = download_to_file(image_url) - return text, file - end -end - -function deviantart:action(msg, config, matches) - local data = deviantart:get_da_data('http://'..matches[1]..'.deviantart.com/art/'..matches[2]) - if not data then utilities.send_reply(msg, config.errors.connection) return end - - local text, file = deviantart:send_da_data(data) - if file then - utilities.send_photo(msg.chat.id, file, text, msg.message_id) - else - utilities.send_reply(msg, text) - return - end -end - -return deviantart diff --git a/otouto/plugins/dhl.lua b/otouto/plugins/dhl.lua deleted file mode 100644 index 4852fe8..0000000 --- a/otouto/plugins/dhl.lua +++ /dev/null @@ -1,34 +0,0 @@ -local dhl = {} - -function dhl:init(config) - dhl.triggers = { - "/dhl (%d+)$" - } - dhl.doc = [[* -]]..config.cmd_pat..[[dhl* __: Aktueller Status der Sendung]] -end - - -local BASE_URL = 'https://mobil.dhl.de' - -function dhl:sendungsstatus(id) - local url = BASE_URL..'/shipmentdetails.html?shipmentId='..id - local res,code = https.request(url) - if code ~= 200 then return "Fehler beim Abrufen von mobil.dhl.de" end - local status = string.match(res, "
(.-)
") - local status = utilities.trim(status) - local zeit = string.match(res, "
(.-)
") - local zeit = utilities.trim(zeit) - if not zeit or zeit == '
' then - return status - end - return '*'..status..'*\n_Stand: '..zeit..'_' -end - -function dhl:action(msg, config, matches) - local sendungs_id = matches[1] - if string.len(sendungs_id) < 8 then return end - utilities.send_reply(msg, dhl:sendungsstatus(sendungs_id), true) -end - -return dhl diff --git a/otouto/plugins/fefe.lua b/otouto/plugins/fefe.lua deleted file mode 100644 index 5211a3b..0000000 --- a/otouto/plugins/fefe.lua +++ /dev/null @@ -1,29 +0,0 @@ -local fefe = {} - -fefe.triggers = { - "blog.fefe.de/%?ts=%w%w%w%w%w%w%w%w" -} - -function fefe:post(id) - local url = 'https://'..id - local results, code = https.request(url) - if code ~= 200 then return "HTTP-Fehler" end - if string.match(results, "No entries found.") then return "Eintrag nicht gefunden." end - - local line = string.sub( results, string.find(results, "
  • %[l]", "") - -- replace "

    " with newline; "" and "" with "*" - local text = text:gsub("

    ", "\n\n"):gsub("

    ", "\n\n") - -- format quotes and links markdown-like - local text = text:gsub("

    ", "\n\n> "):gsub("
    ", "\n\n") - - return text -end - -function fefe:action(msg, config, matches) - utilities.send_reply(msg, fefe:post(matches[1]), 'HTML') -end - -return fefe \ No newline at end of file diff --git a/otouto/plugins/flickr_search.lua b/otouto/plugins/flickr_search.lua deleted file mode 100644 index 72ae2d9..0000000 --- a/otouto/plugins/flickr_search.lua +++ /dev/null @@ -1,73 +0,0 @@ -local flickr_search = {} - -function flickr_search:init(config) - if not cred_data.flickr_apikey then - print('Missing config value: flickr_apikey.') - print('flickr_search.lua will not be enabled.') - return - end - - flickr_search.triggers = { - "^/flickr (.+)$" - } -end - -flickr_search.command = 'flickr ' - -local apikey = cred_data.flickr_apikey -local BASE_URL = 'https://api.flickr.com/services/rest' - -function flickr_search:get_flickr(term) - local url = BASE_URL..'/?method=flickr.photos.search&api_key='..apikey..'&format=json&nojsoncallback=1&privacy_filter=1&safe_search=3&media=photos&sort=relevance&is_common=true&per_page=20&extras=url_l,url_o&text='..term - local b,c = https.request(url) - if c ~= 200 then return nil end - local photo = json.decode(b).photos.photo - if not photo[1] then return nil end - - -- truly randomize - math.randomseed(os.time()) - -- random max json table size - local i = math.random(#photo) - - local link_image = photo[i].url_l or photo[i].url_o - local orig_image = photo[i].url_o or link_image - local title = photo[i].title - if title:len() > 200 then - title = title:sub(1, 197) .. '...' - end - - return link_image, title, orig_image -end - -function flickr_search:callback(callback, msg, self, config, input) - utilities.send_typing(msg.chat.id, 'upload_photo') - local input = URL.unescape(input) - utilities.answer_callback_query(callback, 'Suche nochmal nach "'..input..'"') - local url, title, orig = flickr_search:get_flickr(input) - - if not url then utilities.answer_callback_query(callback, 'Konnte nicht mit Flickr verbinden :(', true) return end - - if string.ends(url, ".gif") then - utilities.send_document(msg.chat.id, url, title, msg.message_id, '{"inline_keyboard":[[{"text":"Im Browser öffnen","url":"'..orig..'"},{"text":"Nochmal suchen","callback_data":"flickr_search:'..URL.escape(input)..'"}]]}') - return - else - utilities.send_photo(msg.chat.id, url, title, msg.message_id, '{"inline_keyboard":[[{"text":"Bild öffnen","url":"'..orig..'"}, {"text":"Nochmal suchen","callback_data":"flickr_search:'..URL.escape(input)..'"}]]}') - return - end -end - -function flickr_search:action(msg, config, matches) - utilities.send_typing(msg.chat.id, 'upload_photo') - local url, title, orig = flickr_search:get_flickr(matches[1]) - if not url then utilities.send_reply(msg, config.errors.results) return end - - if string.ends(url, ".gif") then - utilities.send_document(msg.chat.id, url, title, msg.message_id, '{"inline_keyboard":[[{"text":"Im Browser öffnen","url":"'..orig..'"},{"text":"Nochmal suchen","callback_data":"flickr_search:'..URL.escape(matches[1])..'"}]]}') - return - else - utilities.send_photo(msg.chat.id, url, title, msg.message_id, '{"inline_keyboard":[[{"text":"Bild öffnen","url":"'..orig..'"}, {"text":"Nochmal suchen","callback_data":"flickr_search:'..URL.escape(matches[1])..'"}]]}') - return - end -end - -return flickr_search \ No newline at end of file diff --git a/otouto/plugins/get.lua b/otouto/plugins/get.lua deleted file mode 100644 index 987698e..0000000 --- a/otouto/plugins/get.lua +++ /dev/null @@ -1,56 +0,0 @@ -local get = {} - -get.command = 'get ' - -function get:init(config) - get.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('get', true).table - get.doc = [[* -]]..config.cmd_pat..[[get*: Gibt alle Variablen aus -*]]..config.cmd_pat..[[get* __: Gibt _Variable_ aus -Nutze `!set ` zum Setzen von Variablen]] -end - -function get:get_value(msg, var_name) - local hash = get_redis_hash(msg, 'variables') - if hash then - local value = redis:hget(hash, var_name) - if not value then - return'Nicht gefunden; benutze /get, um alle Variablen aufzulisten.' - else - return var_name..' = '..value - end - end -end - -function get:list_variables(msg) - local hash = get_redis_hash(msg, 'variables') - print(hash) - - if hash then - print('Getting variable from redis hash '..hash) - local names = redis:hkeys(hash) - local text = '' - for i=1, #names do - variables = get:get_value(msg, names[i]) - text = text..variables.."\n" - end - if text == '' or text == nil then - return 'Keine Variablen vorhanden!' - else - return text - end - end -end - -function get:action(msg) - local input = utilities.input(msg.text) - if input then - output = get:get_value(msg, input:match('(.+)')) - else - output = get:list_variables(msg) - end - - utilities.send_message(msg.chat.id, output, true, nil, true) -end - -return get diff --git a/otouto/plugins/hackernews.lua b/otouto/plugins/hackernews.lua deleted file mode 100644 index 87fc695..0000000 --- a/otouto/plugins/hackernews.lua +++ /dev/null @@ -1,40 +0,0 @@ -local hackernews = {} - -hackernews.triggers = { - "news.ycombinator.com/item%?id=(%d+)" -} - -local BASE_URL = 'https://hacker-news.firebaseio.com/v0' - -function hackernews:send_hackernews_post (hn_code) - local url = BASE_URL..'/item/'..hn_code..'.json' - local res,code = https.request(url) - if code ~= 200 then return "HTTP-FEHLER" end - local data = json.decode(res) - - local by = data.by - local title = data.title - - if data.url then - url = '\n[Link besuchen]('..data.url..')' - else - url = '' - end - - if data.text then - post = '\n'..unescape_html(data.text) - post = string.gsub(post, '

    ', ' ') - else - post = '' - end - local text = '*'..title..'* von _'..by..'_'..post..url - - return text -end - -function hackernews:action(msg, config, matches) - local hn_code = matches[1] - utilities.send_reply(msg, hackernews:send_hackernews_post(hn_code), true) -end - -return hackernews diff --git a/otouto/plugins/hello.lua b/otouto/plugins/hello.lua deleted file mode 100644 index 041a986..0000000 --- a/otouto/plugins/hello.lua +++ /dev/null @@ -1,11 +0,0 @@ -local hello = {} - -hello.triggers = { - "^[Ss][Aa][Gg] [Hh][Aa][Ll][Ll][Oo] [Zz][Uu] (.*)$" -} - -function hello:action(msg, config, matches) - utilities.send_message(msg.chat.id, 'Hallo, '..matches[1]..'!') -end - -return hello diff --git a/otouto/plugins/imgur.lua b/otouto/plugins/imgur.lua deleted file mode 100644 index 1ec1c08..0000000 --- a/otouto/plugins/imgur.lua +++ /dev/null @@ -1,56 +0,0 @@ -local imgur = {} - -function imgur:init(config) - if not cred_data.imgur_client_id then - print('Missing config value: imgur_client_id.') - print('imgur.lua will not be enabled.') - return - end - - imgur.triggers = { - "imgur.com/([A-Za-z0-9]+).gifv", - "https?://imgur.com/([A-Za-z0-9]+)" - } -end - -local client_id = cred_data.imgur_client_id -local BASE_URL = 'https://api.imgur.com/3' - -function imgur:get_imgur_data(imgur_code) - local response_body = {} - local request_constructor = { - url = BASE_URL..'/image/'..imgur_code, - method = "GET", - sink = ltn12.sink.table(response_body), - headers = { - Authorization = 'Client-ID '..client_id - } - } - local ok, response_code, response_headers, response_status_line = https.request(request_constructor) - if not ok then - return nil - end - - local response_body = json.decode(table.concat(response_body)) - - if response_body.status ~= 200 then return nil end - - return response_body.data.link -end - -function imgur:action(msg) - local imgur_code = matches[1] - if imgur_code == "login" then return nil end - utilities.send_typing(msg.chat.id, 'upload_photo') - local link = imgur:get_imgur_data(imgur_code) - if link then - local file = download_to_file(link) - if string.ends(link, ".gif") then - utilities.send_document(msg.chat.id, file, nil, msg.message_id) - else - utilities.send_photo(msg.chat.id, file, nil, msg.message_id) - end - end -end - -return imgur diff --git a/otouto/plugins/instagram.lua b/otouto/plugins/instagram.lua deleted file mode 100644 index 021ed04..0000000 --- a/otouto/plugins/instagram.lua +++ /dev/null @@ -1,75 +0,0 @@ -local instagram = {} - -function instagram:init(config) - if not cred_data.instagram_access_token then - print('Missing config value: instagram_access_token.') - print('instagram.lua will not be enabled.') - return - end - - instagram.triggers = { - "instagram.com/p/([A-Za-z0-9-_-]+)" - } -end - -local BASE_URL = 'https://api.instagram.com/v1' -local access_token = cred_data.instagram_access_token - -function instagram:get_insta_data(insta_code) - local url = BASE_URL..'/media/shortcode/'..insta_code..'?access_token='..access_token - local res,code = https.request(url) - if code ~= 200 then return nil end - local data = json.decode(res).data - return data -end - -function instagram:send_instagram_data(data) - -- Header - local username = data.user.username - local full_name = data.user.full_name - if username == full_name then - header = full_name..' hat ein' - else - header = full_name..' ('..username..') hat ein' - end - if data.type == 'video' then - header = header..' Video gepostet' - else - header = header..' Foto gepostet' - end - - -- Caption - if data.caption == nil then - caption = '' - else - caption = ':\n'..data.caption.text - end - - -- Footer - local comments = comma_value(data.comments.count) - local likes = comma_value(data.likes.count) - local footer = '\n'..likes..' Likes, '..comments..' Kommentare' - if data.type == 'video' then - footer = '\n'..data.videos.standard_resolution.url..footer - end - - -- Image - local image_url = data.images.standard_resolution.url - - return header..caption..footer, image_url -end - -function instagram:action(msg, config, matches) - local insta_code = matches[1] - local data = instagram:get_insta_data(insta_code) - if not data then utilities.send_reply(msg, config.errors.connection) return end - - local text, image_url = instagram:send_instagram_data(data) - if not image_url then utilities.send_reply(msg, config.errors.connection) return end - - utilities.send_typing(msg.chat.id, 'upload_photo') - local file = download_to_file(image_url) - utilities.send_photo(msg.chat.id, file, text, msg.message_id) -end - -return instagram diff --git a/otouto/plugins/isup.lua b/otouto/plugins/isup.lua deleted file mode 100644 index 3bd5d6c..0000000 --- a/otouto/plugins/isup.lua +++ /dev/null @@ -1,79 +0,0 @@ -local isup = {} - -function isup:init(config) - isup.triggers = { - "^/isup (.*)$", - "^/ping (.*)$" - } - - isup.doc = [[* -]]..config.cmd_pat..[[isup* __: Prüft, ob die URL up ist]] -end - -function isup:is_up_socket(ip, port) - print('Connect to', ip, port) - local c = socket.try(socket.tcp()) - c:settimeout(3) - local conn = c:connect(ip, port) - if not conn then - return false - else - c:close() - return true - end -end - -function isup:is_up_http(url) - -- Parse URL from input, default to http - local parsed_url = URL.parse(url, { scheme = 'http', authority = '' }) - -- Fix URLs without subdomain not parsed properly - if not parsed_url.host and parsed_url.path then - parsed_url.host = parsed_url.path - parsed_url.path = "" - end - -- Re-build URL - local url = URL.build(parsed_url) - - local protocols = { - ["https"] = https, - ["http"] = http - } - local options = { - url = url, - redirect = false, - method = "GET" - } - local response = { protocols[parsed_url.scheme].request(options) } - local code = tonumber(response[2]) - if code == nil or code >= 400 then - return false - end - return true -end - -function isup:isup(url) - local pattern = '^(%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?):?(%d?%d?%d?%d?%d?)$' - local ip,port = string.match(url, pattern) - local result = nil - - -- /isup 8.8.8.8:53 - if ip then - port = port or '80' - result = isup:is_up_socket(ip, port) - else - result = isup:is_up_http(url) - end - return result -end - -function isup:action(msg, config) - if isup:isup(matches[1]) then - utilities.send_reply(msg, matches[1]..' ist UP! ✅') - return - else - utilities.send_reply(msg, matches[1]..' ist DOWN! ❌') - return - end -end - -return isup diff --git a/otouto/plugins/lyrics.lua b/otouto/plugins/lyrics.lua deleted file mode 100644 index b69e7ee..0000000 --- a/otouto/plugins/lyrics.lua +++ /dev/null @@ -1,47 +0,0 @@ -local lyrics = {} - -function lyrics:init(config) - if not cred_data.lyricsnmusic_apikey then - print('Missing config value: lyricsnmusic_apikey.') - print('lyrics.lua will not be enabled.') - return - end - - lyrics.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('lyrics', true).table - lyrics.doc = [[* -]]..config.cmd_pat..[[lyrics* __: Postet Liedertext]] -end - -lyrics.command = 'lyrics ' - -function lyrics:getLyrics(text) - local apikey = cred_data.lyricsnmusic_apikey - local q = URL.encode(text) - local b = http.request("http://api.lyricsnmusic.com/songs?api_key="..apikey.."&q=" .. q) - response = json.decode(b) - local reply = "" - if #response > 0 then - -- grab first match - local result = response[1] - reply = result.title .. " - " .. result.artist.name .. "\n" .. result.snippet .. "\n[Ganzen Liedertext ansehen](" .. result.url .. ")" - else - reply = nil - end - return reply -end - -function lyrics:action(msg, config, matches) - local input = utilities.input(msg.text) - if not input then - if msg.reply_to_message and msg.reply_to_message.text then - input = msg.reply_to_message.text - else - utilities.send_message(msg.chat.id, lyrics.doc, true, msg.message_id, true) - return - end - end - - utilities.send_reply(msg, lyrics:getLyrics(input), true) -end - -return lyrics diff --git a/otouto/plugins/myanimelist.lua b/otouto/plugins/myanimelist.lua deleted file mode 100644 index b4970ab..0000000 --- a/otouto/plugins/myanimelist.lua +++ /dev/null @@ -1,222 +0,0 @@ -local mal = {} - -local xml = require("xml") - -mal.command = 'anime , /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) (.+)$", - "^/(manga) (.+)$" - } - mal.doc = [[* -]]..config.cmd_pat..[[anime*_ _: Sendet Infos zum Anime -*]]..config.cmd_pat..[[manga*_ _: Sendet Infos zum Manga -]] -end - -local user = cred_data.mal_user -local password = cred_data.mal_pw - -local BASE_URL = 'https://'..user..':'..password..'@myanimelist.net/api' - -function mal:delete_tags(str) - str = string.gsub( str, '
    ', '') - str = string.gsub( str, '%[i%]', '') - str = string.gsub( str, '%[/i%]', '') - str = string.gsub( str, '—', ' — ') - 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 = https.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 = 'https://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 = 'https://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, matches) - 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(msg, 'Anime nicht gefunden!') - return - else - local text, image_url = mal:send_anime_data(anime_info) - if image_url then - utilities.send_typing(msg.chat.id, 'upload_photo') - utilities.send_photo(msg.chat.id, image_url, nil, msg.message_id) - end - utilities.send_reply(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(msg, 'Manga nicht gefunden!') - return - else - local text, image_url = mal:send_manga_data(manga_info) - if image_url then - utilities.send_typing(msg.chat.id, 'upload_photo') - utilities.send_photo(msg.chat.id, image_url, nil, msg.message_id) - end - utilities.send_reply(msg, text, true) - return - end - end -end - -return mal diff --git a/otouto/plugins/pagespeed_insights.lua b/otouto/plugins/pagespeed_insights.lua deleted file mode 100644 index 6f8358e..0000000 --- a/otouto/plugins/pagespeed_insights.lua +++ /dev/null @@ -1,35 +0,0 @@ -local pagespeed_insights = {} - -function pagespeed_insights:init(config) - if not cred_data.google_apikey then - print('Missing config value: google_apikey.') - print('pagespeed_insights.lua will not be enabled.') - return - end - - pagespeed_insights.triggers = { - "^/speed (https?://[%w-_%.%?%.:/%+=&]+)" - } - pagespeed_insights.doc = [[* -]]..config.cmd_pat..[[speed* __: Testet Geschwindigkeit der Seite mit PageSpeed Insights]] -end - -local BASE_URL = 'https://www.googleapis.com/pagespeedonline/v2' - -function pagespeed_insights:get_pagespeed(test_url) - local apikey = cred_data.google_apikey - local url = BASE_URL..'/runPagespeed?url='..test_url..'&key='..apikey..'&fields=id,ruleGroups(SPEED(score))' - local res,code = https.request(url) - if code ~= 200 then return "HTTP-FEHLER" end - local data = json.decode(res) - return data.id..' hat einen PageSpeed-Score von *'..data.ruleGroups.SPEED.score..' Punkten.*' -end - -function pagespeed_insights:action(msg, config, matches) - utilities.send_typing(msg.chat.id, 'typing') - local text = pagespeed_insights:get_pagespeed(matches[1]) - if not text then utilities.send_reply(msg, config.errors.connection) return end - utilities.send_reply(msg, text, true) -end - -return pagespeed_insights diff --git a/otouto/plugins/play_store.lua b/otouto/plugins/play_store.lua deleted file mode 100644 index e290c55..0000000 --- a/otouto/plugins/play_store.lua +++ /dev/null @@ -1,58 +0,0 @@ -local play_store = {} - -function play_store:init(config) - if not cred_data.x_mashape_key then - print('Missing config value: x_mashape_key.') - print('play_store.lua will not be enabled.') - return - end - - play_store.triggers = { - "play.google.com/store/apps/details%?id=(.*)" - } -end - -local BASE_URL = 'https://apps.p.mashape.com/google/application' - -function play_store:get_playstore_data (appid) - local apikey = cred_data.x_mashape_key - local url = BASE_URL..'/'..appid..'?mashape-key='..apikey - local res,code = https.request(url) - if code ~= 200 then return nil end - local data = json.decode(res).data - return data -end - -function play_store:send_playstore_data(data) - local title = data.title - local developer = data.developer.id - local category = data.category.name - local rating = data.rating.average - local installs = data.performance.installs - local description = data.description - if data.version == "Varies with device" then - appversion = "variiert je nach Gerät" - else - appversion = data.version - end - if data.price == 0 then - price = "Gratis" - else - price = data.price - end - local text = '*'..title..'* von *'..developer..'* aus der Kategorie _'..category..'_, durschnittlich bewertet mit '..rating..' Sternen.\n_'..description..'_\n'..installs..' Installationen, Version '..appversion - return text -end - -function play_store:action(msg, config, matches) - local appid = matches[1] - local data = play_store:get_playstore_data(appid) - if data == nil then - return - else - utilities.send_reply(msg, play_store:send_playstore_data(data), true) - return - end -end - -return play_store diff --git a/otouto/plugins/pocket.lua b/otouto/plugins/pocket.lua deleted file mode 100644 index 6d07a16..0000000 --- a/otouto/plugins/pocket.lua +++ /dev/null @@ -1,144 +0,0 @@ -local pocket = {} - -function pocket:init(config) - if not cred_data.pocket_consumer_key then - print('Missing config value: pocket_consumer_key.') - print('pocket.lua will not be enabled.') - return - end - - pocket.triggers = { - "^/pocket(set)(.+)$", - "^/pocket (add) (https?://.*)$", - "^/pocket (archive) (%d+)$", - "^/pocket (readd) (%d+)$", - "^/pocket (unfavorite) (%d+)$", - "^/pocket (favorite) (%d+)$", - "^/pocket (delete) (%d+)$", - "^/pocket (unauth)$", - "^/pocket$" - } - - pocket.doc = [[* -]]..config.cmd_pat..[[pocket*: Postet Liste deiner Links -*]]..config.cmd_pat..[[pocket* add _(url)_: Fügt diese URL deiner Liste hinzu -*]]..config.cmd_pat..[[pocket* archive _[id]_: Archiviere diesen Eintrag -*]]..config.cmd_pat..[[pocket* readd _[id]_: De-archiviere diesen Eintrag -*]]..config.cmd_pat..[[pocket* favorite _[id]_: Favorisiere diesen Eintrag -*]]..config.cmd_pat..[[pocket* unfavorite _[id]_: Entfavorisiere diesen Eintrag -*]]..config.cmd_pat..[[pocket* delete _[id]_: Lösche diesen Eintrag -*]]..config.cmd_pat..[[pocket* unauth: Löscht deinen Account aus dem Bot]] -end - -pocket.command = 'pocket ' - -local BASE_URL = 'https://getpocket.com/v3' -local consumer_key = cred_data.pocket_consumer_key -local headers = { - ["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF8", - ["X-Accept"] = "application/json" -} - -function pocket:set_pocket_access_token(hash, access_token) - if string.len(access_token) ~= 30 then return '*Inkorrekter Access-Token*' end - print('Setting pocket in redis hash '..hash..' to users access_token') - redis:hset(hash, 'pocket', access_token) - return '*Authentifizierung abgeschlossen!*\nDas Plugin kann jetzt verwendet werden.' -end - -function pocket:list_pocket_items(access_token) - local items = post_petition(BASE_URL..'/get', 'consumer_key='..consumer_key..'&access_token='..access_token..'&state=unread&sort=newest&detailType=simple', headers) - - if items.status == 2 then return 'Keine Elemente eingespeichert.' end - if items.status ~= 1 then return 'Ein Fehler beim Holen der Elemente ist aufgetreten.' end - - local text = '' - for element in pairs(items.list) do - title = items.list[element].given_title - if not title or title == "" then title = items.list[element].resolved_title end - text = text..'#'..items.list[element].item_id..': '..title..'\n— '..items.list[element].resolved_url..'\n\n' - end - - return text -end - -function pocket:add_pocket_item(access_token, url) - local result = post_petition(BASE_URL..'/add', 'consumer_key='..consumer_key..'&access_token='..access_token..'&url='..url, headers) - if result.status ~= 1 then return 'Ein Fehler beim Hinzufügen der URL ist aufgetreten :(' end - local given_url = result.item.given_url - if result.item.title == "" or not result.item.title then - title = 'Seite' - else - title = '"'..result.item.title..'"' - end - local code = result.item.response_code - - local text = title..' ('..given_url..') hinzugefügt!' - if not code then return text end - if code ~= "200" and code ~= "0" then text = text..'\nAber die Seite liefert Fehler '..code..' zurück.' end - return text -end - -function pocket:modify_pocket_item(access_token, action, id) - local result = post_petition(BASE_URL..'/send', 'consumer_key='..consumer_key..'&access_token='..access_token..'&actions=[{"action":"'..action..'","item_id":'..id..'}]', headers) - if result.status ~= 1 then return 'Ein Fehler ist aufgetreten :(' end - - if action == 'readd' then - if result.action_results[1] == false then - return 'Dieser Eintrag existiert nicht!' - end - local url = result.action_results[1].normal_url - return url..' wieder de-archiviert' - end - if result.action_results[1] == true then - return 'Aktion ausgeführt.' - else - return 'Ein Fehler ist aufgetreten.' - end -end - -function pocket:action(msg, config, matches) - local hash = 'user:'..msg.from.id - local access_token = redis:hget(hash, 'pocket') - - if matches[1] == 'set' then - local access_token = matches[2] - utilities.send_reply(msg, pocket:set_pocket_access_token(hash, access_token), true) - local message_id = redis:hget(hash, 'pocket_login_msg') - utilities.edit_message(msg.chat.id, message_id, '*Anmeldung abgeschlossen!*', true, true) - redis:hdel(hash, 'pocket_login_msg') - return - end - - if not access_token then - local result = utilities.send_reply(msg, '*Bitte authentifiziere dich zuerst, indem du dich anmeldest.*', true, '{"inline_keyboard":[[{"text":"Bei Pocket anmelden","url":"https://brawlbot.tk/apis/callback/pocket/connect.php"}]]}') - redis:hset(hash, 'pocket_login_msg', result.result.message_id) - return - end - - if matches[1] == 'unauth' then - redis:hdel(hash, 'pocket') - utilities.send_reply(msg, 'Erfolgreich ausgeloggt! Du kannst den Zugriff [in deinen Einstellungen](https://getpocket.com/connected_applications) endgültig entziehen.', true) - return - end - - if matches[1] == 'add' then - utilities.send_reply(msg, pocket:add_pocket_item(access_token, matches[2])) - return - end - - if matches[1] == 'archive' or matches[1] == 'delete' or matches[1] == 'readd' or matches[1] == 'favorite' or matches[1] == 'unfavorite' then - utilities.send_reply(msg, pocket:modify_pocket_item(access_token, matches[1], matches[2])) - return - end - - if msg.chat.type == 'chat' or msg.chat.type == 'supergroup' then - utilities.send_reply(msg, 'Ausgeben deiner privaten Pocket-Liste in einem öffentlichen Chat wird feige verweigert. Bitte schreibe mich privat an!', true) - return - else - utilities.send_reply(msg, pocket:list_pocket_items(access_token)) - return - end -end - -return pocket \ No newline at end of file diff --git a/otouto/plugins/reddit.lua b/otouto/plugins/reddit.lua deleted file mode 100644 index 04706e8..0000000 --- a/otouto/plugins/reddit.lua +++ /dev/null @@ -1,77 +0,0 @@ -local reddit = {} - -reddit.command = 'reddit [r/subreddit | Suchbegriff]' - -function reddit:init(config) - reddit.triggers = utilities.triggers(self.info.username, config.cmd_pat, {'^/r/'}):t('reddit', true):t('r', true):t('r/', true).table - reddit.doc = [[* -]]..config.cmd_pat..[[r* _[r/subreddit | Suchbegriff]_: Gibt Top-Posts oder Ergebnisse eines Subreddits aus. Wenn kein Argument gegeben ist, wird /r/all genommen.]] -end - -local format_results = function(posts) - local output = '' - for _,v in ipairs(posts) do - local post = v.data - local title = post.title:gsub('%[', '('):gsub('%]', ')'):gsub('&', '&') - if title:len() > 256 then - title = title:sub(1, 253) - title = utilities.trim(title) .. '...' - end - local short_url = 'https://redd.it/' .. post.id - local s = '[' .. unescape(title) .. '](' .. short_url .. ')' - if post.domain and not post.is_self and not post.over_18 then - s = '`[`[' .. post.domain .. '](' .. post.url:gsub('%)', '\\)') .. ')`]` ' .. s - end - output = output .. '• ' .. s .. '\n' - end - return output -end - -reddit.subreddit_url = 'https://www.reddit.com/%s/.json?limit=' -reddit.search_url = 'https://www.reddit.com/search.json?q=%s&limit=' -reddit.rall_url = 'https://www.reddit.com/.json?limit=' - -function reddit:action(msg, config) - -- Eight results in PM, four results elsewhere. - local limit = 4 - if msg.chat.type == 'private' then - limit = 8 - end - local text = msg.text_lower - if text:match('^/r/.') then - -- Normalize input so this hack works easily. - text = msg.text_lower:gsub('^/r/', config.cmd_pat..'r r/') - end - local input = utilities.input(text) - local source, url - if input then - if input:match('^r/.') then - input = utilities.get_word(input, 1) - url = reddit.subreddit_url:format(input) .. limit - source = '*/' .. utilities.md_escape(input) .. '*\n' - else - input = utilities.input(msg.text) - source = '*Ergebnisse für* _' .. utilities.md_escape(input) .. '_ *:*\n' - input = URL.escape(input) - url = reddit.search_url:format(input) .. limit - end - else - url = reddit.rall_url .. limit - source = '*/r/all*\n' - end - local jstr, res = https.request(url) - if res ~= 200 then - utilities.send_reply(msg, config.errors.results) - else - local jdat = json.decode(jstr) - if #jdat.data.children == 0 then - utilities.send_reply(msg, config.errors.results) - else - local output = format_results(jdat.data.children) - output = source .. output - utilities.send_message(msg.chat.id, output, true, nil, true) - end - end -end - -return reddit diff --git a/otouto/plugins/set.lua b/otouto/plugins/set.lua deleted file mode 100644 index ca1a441..0000000 --- a/otouto/plugins/set.lua +++ /dev/null @@ -1,52 +0,0 @@ -local set = {} - -set.command = 'set ' - -function set:init(config) - set.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('set', true).table - set.doc = [[* -]]..config.cmd_pat..[[set* __ __: Speichert eine Variable mit einem Wert -*]]..config.cmd_pat..[[set* __ _nil_: Löscht Variable -Nutze `/get ` zum Abrufen]] -end - -function set:save_value(msg, name, value) - local hash = get_redis_hash(msg, 'variables') - if hash then - print('Saving variable to redis hash '..hash) - redis:hset(hash, name, value) - return "Gespeichert: "..name.." = "..value - end -end - -function set:delete_value(msg, name) - local hash = get_redis_hash(msg, 'variables') - if redis:hexists(hash, name) == true then - print('Deleting variable from redis hash '..hash) - redis:hdel(hash, name) - return 'Variable "'..name..'" erfolgreich gelöscht!' - else - return 'Du kannst keine Variable löschen, die nicht existiert .-.' - end -end - -function set:action(msg) - local input = utilities.input(msg.text) - if not input or not input:match('([^%s]+) (.+)') then - utilities.send_message(msg.chat.id, set.doc, true, msg.message_id, true) - return - end - - local name = input:match('([^%s]+) ') - local value = input:match(' (.+)') - - if value == "nil" then - output = set:delete_value(msg, name) - else - output = set:save_value(msg, name, value) - end - - utilities.send_message(msg.chat.id, output, true, nil, true) -end - -return set diff --git a/otouto/plugins/settings.lua b/otouto/plugins/settings.lua deleted file mode 100644 index ff4c7bd..0000000 --- a/otouto/plugins/settings.lua +++ /dev/null @@ -1,56 +0,0 @@ -local settings = {} - -settings.triggers = { - "^(⚙ [Ee]instellungen)$", - "^(/settings)$", - "^(💤 [Aa][Ff][Kk]%-[Kk]eyboard einschalten)", - "^(💤 [Aa][Ff][Kk]%-[Kk]eyboard ausschalten)", - "^(❌ [Ee]instellungen verstecken)" -} - ---[[ - -[ - [ "Top Left", "Top Right" ], - [ "Bottom Left", "Bottom Right" ] -] - -]] - -function settings:keyboard(user_id) - if redis:hget('user:'..user_id, 'afk_keyboard') == 'true' then - afk_button = '{"text":"💤 AFK-Keyboard ausschalten"}' - else - afk_button = '{"text":"💤 AFK-Keyboard einschalten"}' - end - local hide_settings_button = '{"text":"❌ Einstellungen verstecken"}' - - local settings_keyboard = '[['..afk_button..','..hide_settings_button..']]' - return settings_keyboard -end - -function settings:action(msg, config, matches) - if msg.chat.type ~= "private" then - return - end - - local hash = 'user:'..msg.from.id - - if matches[1] == '⚙ Einstellungen' or matches[1] == '/settings' then - utilities.send_reply(msg, 'Was möchtest du einstellen?', false, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}') - return - elseif matches[1] == '💤 AFK-Keyboard einschalten' then - redis:hset(hash, 'afk_keyboard', 'true') - utilities.send_reply(msg, 'Das AFK-Keyboard wurde erfolgreich *eingeschaltet*.', true, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}') - return - elseif matches[1] == '💤 AFK-Keyboard ausschalten' then - redis:hset(hash, 'afk_keyboard', 'false') - utilities.send_reply(msg, 'Das AFK-Keyboard wurde erfolgreich *ausgeschaltet*.', true, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}') - return - elseif matches[1] == '❌ Einstellungen verstecken' then - utilities.send_reply(msg, 'Um die Einstellungen wieder einzublenden, führe /settings aus.', true, '{"hide_keyboard":true}') - return - end -end - -return settings \ No newline at end of file diff --git a/otouto/plugins/soundcloud.lua b/otouto/plugins/soundcloud.lua deleted file mode 100644 index 8f0f6bf..0000000 --- a/otouto/plugins/soundcloud.lua +++ /dev/null @@ -1,37 +0,0 @@ -local soundcloud = {} - -soundcloud.triggers = { - "soundcloud.com/([A-Za-z0-9-/-_-.]+)" -} - -local BASE_URL = 'http://api.soundcloud.com/resolve.json' -local client_id = cred_data.soundcloud_client_id - -function soundcloud:send_soundcloud_info(sc_url) - local url = BASE_URL..'?url=http://soundcloud.com/'..sc_url..'&client_id='..client_id - - local res,code = http.request(url) - if code ~= 200 then return nil end - local data = json.decode(res) - - local title = data.title - local description = data.description - local user = data.user.username - local user = 'Unbekannt' - local genre = data.genre - local playback_count = data.playback_count - local milliseconds = data.duration - local totalseconds = math.floor(milliseconds / 1000) - local duration = makeHumanTime(totalseconds) - - local text = '*'..title..'* von _'..user..'_\n_(Tag: '..genre..', '..duration..'; '..playback_count..' mal angehört)_\n'..description - return text -end - -function soundcloud:action(msg, config, matches) - local text = soundcloud:send_soundcloud_info(matches[1]) - if not text then utilities.send_reply(msg, config.errors.connection) return end - utilities.send_reply(msg, text, true) -end - -return soundcloud diff --git a/otouto/plugins/streamable.lua b/otouto/plugins/streamable.lua deleted file mode 100644 index 96ea2e5..0000000 --- a/otouto/plugins/streamable.lua +++ /dev/null @@ -1,49 +0,0 @@ -local streamable = {} - -streamable.triggers = { - "streamable.com/([A-Za-z0-9-_-]+)", -} - -function streamable:send_streamable_video(shortcode, msg) - local BASE_URL = "https://api.streamable.com" - local url = BASE_URL..'/videos/'..shortcode - local res,code = https.request(url) - if code ~= 200 then return 'HTTP-Fehler' end - local data = json.decode(res) - if data.status ~= 2 then utilities.send_reply(msg, "Video ist (noch) nicht verfügbar.") return end - - if data.files.webm then - if data.title == "" then title = shortcode..'.webm' else title = data.title..'.webm' end - url = 'https:'..data.files.webm.url - width = data.files.webm.width - height = data.files.webm.height - if data.files.webm.size > 50000000 then - local size = math.floor(data.files.webm.size / 1000000) - utilities.send_reply(msg, '*Video ist größer als 50 MB* ('..size..' MB)!\n[Direktlink]('..url..')', true) - return - end - elseif data.files.mp4 then - if data.title == "" then title = shortcode..'.mp4' else title = data.title..'.mp4' end - url = 'https:'..data.files.mp4.url - width = data.files.mp4.width - height = data.files.mp4.height - if data.files.mp4.size > 50000000 then - local size = math.floor(data.files.mp4.size / 1000000) - utilities.send_reply(msg, '*Video ist größer als 50 MB* ('..size..' MB)!\n[Direktlink]('..url..')', true) - return - end - end - - utilities.send_typing(msg.chat.id, 'upload_video') - local file = download_to_file(url, title) - utilities.send_video(msg.chat.id, file, nil, msg.message_id, nil, width, height) - return -end - -function streamable:action(msg, config, matches) - local shortcode = matches[1] - streamable:send_streamable_video(shortcode, msg) - return -end - -return streamable diff --git a/otouto/plugins/tex.lua b/otouto/plugins/tex.lua deleted file mode 100644 index 4597cb1..0000000 --- a/otouto/plugins/tex.lua +++ /dev/null @@ -1,31 +0,0 @@ -local tex = {} - -tex.command = 'tex ' - -function tex:init(config) - tex.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('tex', true).table - tex.doc = [[* -]]..config.cmd_pat..[[tex* __: Konvertiert LaTeX in ein Bild]] -end - -function tex:action(msg, config) - local input = utilities.input(msg.text) - if not input then - if msg.reply_to_message and msg.reply_to_message.text then - input = msg.reply_to_message.text - else - utilities.send_message(msg.chat.id, tex.doc, true, msg.message_id, true) - return - end - end - - utilities.send_typing(msg.chat.id, 'upload_photo') - local eq = URL.escape(input) - - local url = "http://latex.codecogs.com/png.download?" - .."\\dpi{300}%20\\LARGE%20"..eq - local file = download_to_file(url, 'latex.png') - utilities.send_photo(msg.chat.id, file, nil, msg.message_id) -end - -return tex diff --git a/otouto/plugins/thetvdb.lua b/otouto/plugins/thetvdb.lua deleted file mode 100644 index bbaef66..0000000 --- a/otouto/plugins/thetvdb.lua +++ /dev/null @@ -1,92 +0,0 @@ -local tv = {} - -local xml = require("xml") - -tv.command = 'tv ' - -function tv:init(config) - tv.triggers = { - "^/tv (.+)$" - } - tv.doc = [[* -]]..config.cmd_pat..[[tv*_ _: Sendet Infos zur TV-Serie]] -end - -local BASE_URL = 'http://thetvdb.com/api' - -local makeOurDate = function(dateString) - local pattern = "(%d+)%-(%d+)%-(%d+)" - local year, month, day = dateString:match(pattern) - return day..'.'..month..'.'..year -end - - -function tv:get_tv_info(series) - local url = BASE_URL..'/GetSeries.php?seriesname='..series..'&language=de' - local res,code = http.request(url) - if code ~= 200 then return "HTTP-ERROR" end - local result = xml.load(res) - if not xml.find(result, 'seriesid') then return "NOTFOUND" end - return result -end - -function tv:send_tv_data(result, msg) - local title = xml.find(result, 'SeriesName')[1] - local id = xml.find(result, 'seriesid')[1] - - if xml.find(result, 'AliasNames') and xml.find(result, 'AliasNames')[1] ~= title then - alias = '\noder: '..xml.find(result, 'AliasNames')[1] - else - alias = '' - end - - if xml.find(result, 'Overview') then - desc = '\n_'..string.sub(xml.find(result, 'Overview')[1], 1, 250) .. '..._' - else - desc = '' - end - - if xml.find(result, 'FirstAired') then - aired = '\n*Erstausstrahlung:* '..makeOurDate(xml.find(result, 'FirstAired')[1]) - else - aired = '' - end - - - if xml.find(result, 'Network') then - publisher = '\n*Publisher:* '..xml.find(result, 'Network')[1] - else - publisher = '' - end - - if xml.find(result, 'IMDB_ID') then - imdb = '\n[IMDB-Seite](http://www.imdb.com/title/'..xml.find(result, 'IMDB_ID')[1]..')' - else - imdb = '' - end - - local text = '*'..title..'*'..alias..aired..publisher..imdb..desc..'\n[TVDB-Seite besuchen](http://thetvdb.com/?id='..id..'&tab=series)' - if xml.find(result, 'banner') then - local image_url = 'http://www.thetvdb.com/banners/'..xml.find(result, 'banner')[1] - utilities.send_typing(msg.chat.id, 'upload_photo') - utilities.send_photo(msg.chat.id, image_url, nil, msg.message_id) - end - utilities.send_reply(msg, text, true) -end - - -function tv:action(msg, config, matches) - local series = URL.escape(matches[1]) - local tv_info = tv:get_tv_info(series) - if tv_info == "NOTFOUND" then - utilities.send_reply(msg, config.errors.results) - return - elseif tv_info == "HTTP-ERROR" then - utilities.send_reply(msg, config.errors.connection) - return - else - tv:send_tv_data(tv_info, msg) - end -end - -return tv diff --git a/otouto/plugins/wiimmfi.lua b/otouto/plugins/wiimmfi.lua deleted file mode 100644 index 0b4bec7..0000000 --- a/otouto/plugins/wiimmfi.lua +++ /dev/null @@ -1,54 +0,0 @@ -local wiimmfi = {} - -function wiimmfi:init(config) - wiimmfi.triggers = { - "^/(mkw)$", - "^/wiimmfi$", - "^/wfc$" - } - wiimmfi.doc = [[* -]]..config.cmd_pat..[[wfc*: Zeigt alle Wiimmfi-Spieler an -*]]..config.cmd_pat..[[mkw*: Zeigt alle Mario-Kart-Wii-Spieler an]] -end - -wiimmfi.command = 'wfc, /mkw' - -function wiimmfi:getplayer(game) - local url = 'http://wiimmfi.de/game' - local res,code = http.request(url) - if code ~= 200 then return "Fehler beim Abrufen von wiimmfi.de" end - if game == 'mkw' then - local players = string.match(res, "(.-)") - if players == nil then players = 0 end - text = 'Es spielen gerade '..players..' Spieler Mario Kart Wii' - else - local players = string.match(res, "(.-).-", ": ") - local players = string.gsub(players, "", "") - local players = string.gsub(players, "Wii", "") - local players = string.gsub(players, "WiiWare", "") - local players = string.gsub(players, "NDS", "") - local players = string.gsub(players, "", "") - local players = string.gsub(players, "", "") - local players = string.gsub(players, "", "") - local players = string.gsub(players, "", "") - local players = string.gsub(players, "", "") - local players = string.gsub(players, "", "") - local players = string.gsub(players, "", "") - if players == nil then players = 'Momentan spielt keiner auf Wiimmfi :(' end - text = players - end - return text -end - -function wiimmfi:action(msg, config, matches) - if matches[1] == "mkw" then - utilities.send_reply(msg, wiimmfi:getplayer('mkw')) - return - else - utilities.send_reply(msg, wiimmfi:getplayer()) - return - end -end - -return wiimmfi \ No newline at end of file diff --git a/otouto/plugins/yourls.lua b/otouto/plugins/yourls.lua deleted file mode 100644 index 5f28266..0000000 --- a/otouto/plugins/yourls.lua +++ /dev/null @@ -1,53 +0,0 @@ -local yourls = {} - -function yourls:init(config) - if not cred_data.yourls_site_url then - print('Missing config value: yourls_site_url.') - print('yourls.lua will not be enabled.') - return - elseif not cred_data.yourls_signature_token then - print('Missing config value: yourls_signature_token.') - print('yourls.lua will not be enabled.') - return - end - - yourls.triggers = { - "^/yourls (https?://[%w-_%.%?%.:/%+=&]+)" - } -end - -local SITE_URL = cred_data.yourls_site_url -local signature = cred_data.yourls_signature_token -local BASE_URL = SITE_URL..'/yourls-api.php' - -function yourls:prot_url(url) - local url, h = string.gsub(url, "http://", "") - local url, hs = string.gsub(url, "https://", "") - local protocol = "http" - if hs == 1 then - protocol = "https" - end - return url, protocol -end - -function yourls:create_yourls_link(long_url, protocol) - local url = BASE_URL..'?format=simple&signature='..signature..'&action=shorturl&url='..long_url - if protocol == "http" then - link,code = http.request(url) - else - link,code = https.request(url) - end - if code ~= 200 then - link = 'Ein Fehler ist aufgetreten. '..link - end - return link -end - -function yourls:action(msg, config, matches) - local long_url = matches[1] - local baseurl, protocol = yourls:prot_url(SITE_URL) - utilities.send_reply(msg, yourls:create_yourls_link(long_url, protocol)) - return -end - -return yourls