diff --git a/otouto/plugins/tweet.lua b/otouto/plugins/tweet.lua new file mode 100644 index 0000000..00127fb --- /dev/null +++ b/otouto/plugins/tweet.lua @@ -0,0 +1,97 @@ +local tweet = {} + +require('otouto/plugins/twitter') + +tweet.command = 'tweet ' + +function tweet:init(config) + if not cred_data.tw_consumer_key then + print('Missing config value: tw_consumer_key.') + print('tweet.lua will not be enabled.') + return + elseif not cred_data.tw_consumer_secret then + print('Missing config value: tw_consumer_secret.') + print('tweet.lua will not be enabled.') + return + elseif not cred_data.tw_access_token then + print('Missing config value: tw_access_token.') + print('tweet.lua will not be enabled.') + return + elseif not cred_data.tw_access_token_secret then + print('Missing config value: tw_access_token_secret.') + print('tweet.lua will not be enabled.') + return + end + + tweet.triggers = { + "^/tweet ([%w_%.%-]+)$", + "^/tweet ([%w_%.%-]+) (last)$" + } + tweet.doc = [[* +]]..config.cmd_pat..[[tweet* __: Zufälliger Tweet vom User mit diesem Namen +*]]..config.cmd_pat..[[tweet* __ _[last]_: Aktuellster Tweet vom User mit diesem Namen]] +end + +local twitter_url = "https://api.twitter.com/1.1/statuses/user_timeline.json" + +local consumer_key = cred_data.tw_consumer_key +local consumer_secret = cred_data.tw_consumer_secret +local access_token = cred_data.tw_access_token +local access_token_secret = cred_data.tw_access_token_secret + +local client = OAuth.new(consumer_key, consumer_secret, { + RequestToken = "https://api.twitter.com/oauth/request_token", + AuthorizeUser = {"https://api.twitter.com/oauth/authorize", method = "GET"}, + AccessToken = "https://api.twitter.com/oauth/access_token" +}, { + OAuthToken = access_token, + OAuthTokenSecret = access_token_secret +}) + +function tweet:get_random_tweet(base) + local response_code, response_headers, response_status_line, response_body = client:PerformRequest("GET", twitter_url, base) + if response_code ~= 200 then + return "Konnte nicht verbinden, evtl. existiert der User nicht?" + end + + local response = json.decode(response_body) + if #response == 0 then + return "Konnte keinen Tweet bekommen, sorry" + end + + local i = math.random(#response) + rand_tweet = response[i] + return get_tweet(rand_tweet) +end + +function tweet:action(msg, config, matches) + utilities.send_typing(msg.chat.id, 'typing') + local base = {tweet_mode = 'extended'} + base.screen_name = matches[1] + + local count = 200 + local all = false + if #matches > 1 and matches[2] == 'last' then + count = 1 + end + base.count = count + + local text, images, videos = tweet:get_random_tweet(base) + if not images or not videos then + utilities.send_reply(msg, text) + return + end + + -- send the parts + utilities.send_reply(msg, text, 'HTML') + for k, v in pairs(images) do + local file = download_to_file(v) + utilities.send_photo(msg.chat.id, file, nil, msg.message_id) + end + for k, v in pairs(videos) do + local file = download_to_file(v) + utilities.send_video(msg.chat.id, file, nil, msg.message_id) + end +end + +return tweet \ No newline at end of file diff --git a/otouto/plugins/twitter.lua b/otouto/plugins/twitter.lua index 4f52d30..db19ca3 100644 --- a/otouto/plugins/twitter.lua +++ b/otouto/plugins/twitter.lua @@ -40,18 +40,7 @@ local client = OAuth.new(consumer_key, consumer_secret, { OAuthTokenSecret = access_token_secret }) -function twitter:action(msg, config, matches) - if not matches[2] then - id = matches[1] - else - id = matches[2] - end - - local twitter_url = "https://api.twitter.com/1.1/statuses/show/" .. id.. ".json" - local get_params = {tweet_mode = 'extended'} - local response_code, response_headers, response_status_line, response_body = client:PerformRequest("GET", twitter_url, get_params) - local response = json.decode(response_body) - +function get_tweet(response) local full_name = response.user.name local user_name = response.user.screen_name if response.user.verified then @@ -149,8 +138,30 @@ function twitter:action(msg, config, matches) text = text..'\n\n'..quote..'\n' end + return header.."\n"..utilities.trim(text).."\n"..footer, images, videos +end + +function twitter:action(msg, config, matches) + utilities.send_typing(msg.chat.id, 'typing') + if not matches[2] then + id = matches[1] + else + id = matches[2] + end + + local twitter_url = "https://api.twitter.com/1.1/statuses/show/" .. id.. ".json" + local get_params = {tweet_mode = 'extended'} + local response_code, response_headers, response_status_line, response_body = client:PerformRequest("GET", twitter_url, get_params) + if response_code ~= 200 then + utilities.send_repl(msg, 'Twitter nicht erreichbar, Tweet existiert nicht oder User ist privat.') + return + end + local response = json.decode(response_body) + + local text, images, videos = get_tweet(response) + -- send the parts - utilities.send_reply(msg, header .. "\n" .. utilities.trim(text).."\n"..footer, 'HTML') + utilities.send_reply(msg, text, 'HTML') for k, v in pairs(images) do local file = download_to_file(v) utilities.send_photo(msg.chat.id, file, nil, msg.message_id) @@ -161,4 +172,4 @@ function twitter:action(msg, config, matches) end end -return twitter +return twitter \ No newline at end of file