2016-07-17 13:22:27 +02:00
local tweet = { }
2016-08-04 20:37:12 +02:00
require " ./miku/encoding "
2016-07-17 13:22:27 +02:00
function tweet : init ( config )
if not cred_data.tw_consumer_key then
2016-08-01 21:07:27 +02:00
print ( ' Fehlender Key: tw_consumer_key. ' )
print ( ' tweet.lua wird nicht aktiviert. ' )
2016-07-17 13:22:27 +02:00
return
elseif not cred_data.tw_consumer_secret then
2016-08-01 21:07:27 +02:00
print ( ' Fehlender Key: tw_consumer_secret. ' )
print ( ' tweet.lua wird nicht aktiviert. ' )
2016-07-17 13:22:27 +02:00
return
elseif not cred_data.tw_access_token then
2016-08-01 21:07:27 +02:00
print ( ' Fehlender Key: tw_access_token. ' )
print ( ' tweet.lua wird nicht aktiviert. ' )
2016-07-17 13:22:27 +02:00
return
elseif not cred_data.tw_access_token_secret then
2016-08-01 21:07:27 +02:00
print ( ' Fehlender Key: tw_access_token_secret. ' )
print ( ' tweet.lua wird nicht aktiviert. ' )
2016-07-17 13:22:27 +02:00
return
end
tweet.triggers = {
" ^/tweet (id) ([%w_%.%-]+)$ " ,
" ^/tweet (id) ([%w_%.%-]+) (last)$ " ,
" ^/tweet (id) ([%w_%.%-]+) (last) ([%d]+)$ " ,
" ^/tweet (name) ([%w_%.%-]+)$ " ,
" ^/tweet (name) ([%w_%.%-]+) (last)$ " ,
" ^/tweet (name) ([%w_%.%-]+) (last) ([%d]+)$ "
}
tweet.doc = [ [ *
] ] .. config.cmd_pat .. [ [ tweet * id _ [ id ] _ : Zufälliger Tweet vom User mit dieser ID
* ] ] .. config.cmd_pat .. [ [ tweet * id _ [ id ] _ last : Aktuellster Tweet vom User mit dieser ID
* ] ] .. config.cmd_pat .. [ [ tweet * name _ [ Name ] _ : Zufälliger Tweet vom User mit diesem Namen
* ] ] .. config.cmd_pat .. [[tweet* name _[Name]_ last: Aktuellster Tweet vom User mit diesem Namen]]
end
tweet.command = ' tweet name <User> '
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
} )
local twitter_url = " https://api.twitter.com/1.1/statuses/user_timeline.json "
function tweet : analyze_tweet ( tweet )
local header = " Tweet von " .. tweet.user . name .. " (@ " .. tweet.user . screen_name .. " ) \n https://twitter.com/statuses/ " .. tweet.id_str
local text = tweet.text
-- replace short URLs
if tweet.entities . urls then
for k , v in pairs ( tweet.entities . urls ) do
local short = v.url
local long = v.expanded_url
text = text : gsub ( short , long )
end
end
-- remove urls
local urls = { }
if tweet.extended_entities and tweet.extended_entities . media then
for k , v in pairs ( tweet.extended_entities . media ) do
if v.video_info and v.video_info . variants then -- If it's a video!
table.insert ( urls , v.video_info . variants [ 1 ] . url )
else -- If not, is an image
table.insert ( urls , v.media_url )
end
text = text : gsub ( v.url , " " ) -- Replace the URL in text
2016-08-04 20:37:12 +02:00
text = encoding ( text )
2016-07-17 13:22:27 +02:00
end
end
return header , text , urls
end
function tweet : send_all_files ( self , msg , urls )
local data = {
images = {
func = send_photos_from_url ,
urls = { }
} ,
gifs = {
func = send_gifs_from_url ,
urls = { }
} ,
videos = {
func = send_videos_from_url ,
urls = { }
}
}
local table_to_insert = nil
for i , url in pairs ( urls ) do
local _ , _ , extension = string.match ( url , " (https?)://([^ \\ ]-([^ \\ %.]+))$ " )
local mime_type = mimetype.get_content_type_no_sub ( extension )
if extension == ' gif ' then
table_to_insert = data.gifs . urls
elseif mime_type == ' image ' then
table_to_insert = data.images . urls
elseif mime_type == ' video ' then
table_to_insert = data.videos . urls
else
table_to_insert = nil
end
if table_to_insert then
table.insert ( table_to_insert , url )
end
end
for k , v in pairs ( data ) do
if # v.urls > 0 then
end
v.func ( receiver , v.urls )
end
end
function tweet : sendTweet ( self , msg , tweet )
local header , text , urls = tweet : analyze_tweet ( tweet )
-- send the parts
2016-08-04 20:37:12 +02:00
local text = encoding ( text )
2016-07-17 13:22:27 +02:00
send_reply ( self , msg , header .. " \n " .. text )
tweet : send_all_files ( self , msg , urls )
return nil
end
function tweet : getTweet ( self , msg , base , all )
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
2016-08-01 21:07:27 +02:00
local response = json.decode ( response_body )
2016-07-17 13:22:27 +02:00
if # response == 0 then
return " Konnte keinen Tweet bekommen, sorry "
end
if all then
for i , tweet in pairs ( response ) do
tweet : sendTweet ( self , msg , tweet )
end
else
local i = math.random ( # response )
local tweet = response [ i ]
tweet : sendTweet ( self , msg , tweet )
end
return nil
end
function tweet : isint ( n )
return n == math.floor ( n )
end
function tweet : action ( msg , config , matches )
local base = { include_rts = 1 }
if matches [ 1 ] == ' id ' then
local userid = tonumber ( matches [ 2 ] )
if userid == nil or not tweet : isint ( userid ) then
utilities.send_reply ( self , msg , " Die ID eines Users ist eine Zahl, du findest sie, indem du den Namen [auf dieser Webseite](http://gettwitterid.com/) eingibst. " , true )
return
end
base.user_id = userid
elseif matches [ 1 ] == ' name ' then
base.screen_name = matches [ 2 ]
else
return " "
end
local count = 200
local all = false
if # matches > 2 and matches [ 3 ] == ' last ' then
count = 1
if # matches == 4 then
local n = tonumber ( matches [ 4 ] )
if n > 10 then
utilities.send_reply ( self , msg , " Du kannst nur 10 Tweets auf einmal abfragen! " )
return
end
count = matches [ 4 ]
all = true
end
end
base.count = count
utilities.send_reply ( self , msg , tweet : getTweet ( self , msg , base , all ) )
end
return tweet