First commit of Mikubot
@ -1,6 +1,6 @@
|
|||||||
require("./bot/utils")
|
require("./bot/utils")
|
||||||
|
|
||||||
VERSION = '0.11.2'
|
VERSION = '2.5-reloaded'
|
||||||
|
|
||||||
-- This function is called when tg receive a msg
|
-- This function is called when tg receive a msg
|
||||||
function on_msg_receive (msg)
|
function on_msg_receive (msg)
|
||||||
@ -76,7 +76,7 @@ local function is_plugin_disabled_on_chat(plugin_name, receiver)
|
|||||||
for disabled_plugin,disabled in pairs(disabled_chats[receiver]) do
|
for disabled_plugin,disabled in pairs(disabled_chats[receiver]) do
|
||||||
print(disabled_plugin)
|
print(disabled_plugin)
|
||||||
if disabled_plugin == plugin_name and disabled then
|
if disabled_plugin == plugin_name and disabled then
|
||||||
local warning = 'Plugin '..disabled_plugin..' is disabled on this chat'
|
local warning = ''
|
||||||
print(warning)
|
print(warning)
|
||||||
send_msg(receiver, warning, ok_cb, false)
|
send_msg(receiver, warning, ok_cb, false)
|
||||||
return true
|
return true
|
||||||
|
@ -99,7 +99,7 @@ function download_to_file(url, file_name)
|
|||||||
|
|
||||||
file_name = file_name or get_http_file_name(url, headers)
|
file_name = file_name or get_http_file_name(url, headers)
|
||||||
|
|
||||||
local file_path = "/tmp/"..file_name
|
local file_path = "/home/pi/Mikubot/tmp/"..file_name
|
||||||
print("Saved to: "..file_path)
|
print("Saved to: "..file_path)
|
||||||
|
|
||||||
file = io.open(file_path, "w+")
|
file = io.open(file_path, "w+")
|
||||||
|
BIN
pictures/Nii-san.jpg
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
pictures/aha.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
pictures/cats/cat1.jpg
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
pictures/cats/cat2.jpg
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
pictures/cats/cat3.jpg
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
pictures/cats/cat4.jpg
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
pictures/luckystar/Thumbs.db
Normal file
BIN
pictures/luckystar/barusamikosu.jpg
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
pictures/luckystar/kagami.jpg
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
pictures/luckystar/konata.jpg
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
pictures/luckystar/miyuki.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
pictures/luckystar/tsukasa.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
pictures/nau.jpg
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
pictures/neorame.jpg
Normal file
After Width: | Height: | Size: 6.5 KiB |
BIN
pictures/nyu.jpg
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
pictures/sakurasou/Thumbs.db
Normal file
BIN
pictures/sakurasou/chihiro.jpg
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
pictures/sakurasou/jin.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
pictures/sakurasou/misaki.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
pictures/sakurasou/nanami.jpg
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
pictures/sakurasou/ryuunosuke.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
pictures/sakurasou/shiina.jpg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
pictures/sakurasou/sorata.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
pictures/senrankagura/hanzouacademy/Thumbs.db
Normal file
BIN
pictures/senrankagura/hanzouacademy/asuka.jpg
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
pictures/senrankagura/hanzouacademy/hibari.jpg
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
pictures/senrankagura/hanzouacademy/ikaruga.jpg
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
pictures/senrankagura/hanzouacademy/katsuragi.jpg
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
pictures/senrankagura/hanzouacademy/yagyuu.jpg
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
pictures/senrankagura/hebijoacademy/Thumbs.db
Normal file
BIN
pictures/senrankagura/hebijoacademy/haruka.jpg
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
pictures/senrankagura/hebijoacademy/hikage.jpg
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
pictures/senrankagura/hebijoacademy/homura.jpg
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
pictures/senrankagura/hebijoacademy/mirai.jpg
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
pictures/senrankagura/hebijoacademy/yomi.jpg
Normal file
After Width: | Height: | Size: 30 KiB |
@ -30,9 +30,9 @@ local function run(msg, matches)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "9GAG for telegram",
|
description = "9GAG",
|
||||||
usage = "!9gag: Send random image from 9gag",
|
usage = "/9gag",
|
||||||
patterns = {"^!9gag$"},
|
patterns = {"^/9gag$"},
|
||||||
run = run
|
run = run
|
||||||
}
|
}
|
||||||
|
|
||||||
|
13
plugins/afk.lua
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
local user_name = get_name(msg)
|
||||||
|
return "" .. user_name .. " ist nun AFK"
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Sagt dass ihr afk seid",
|
||||||
|
usage = "/afk",
|
||||||
|
patterns = {
|
||||||
|
"^/afk(.*)$"
|
||||||
|
},
|
||||||
|
run = run
|
||||||
|
}
|
13
plugins/aha.png.lua
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, "aha.png") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/aha.png", ok_cb, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Aha",
|
||||||
|
usage = "aha.png",
|
||||||
|
patterns = {"^aha.png"},
|
||||||
|
run = run
|
||||||
|
}
|
15
plugins/baka_bot.lua
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
return "Gomen'nasai 😣"
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "",
|
||||||
|
usage = "",
|
||||||
|
patterns = {"^baka bot",
|
||||||
|
"Baka bot",
|
||||||
|
"baka Bot",
|
||||||
|
"Baka Bot",
|
||||||
|
"BAKA BOT"},
|
||||||
|
run = run
|
||||||
|
}
|
15
plugins/barusamikosu.lua
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/barusamiko') or string.starts(msg.text, "/barusamikosu") or string.starts(msg.text, "/Balsamiko Essig") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/luckystar/barusamikosu.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Balsamiko Essig!",
|
||||||
|
usage = "/barusamiko",
|
||||||
|
patterns = {"^/barusamiko",
|
||||||
|
"^/barusamikosu",
|
||||||
|
"^/Balsamiko Essig"},
|
||||||
|
run = run
|
||||||
|
}
|
@ -11,7 +11,7 @@ function getRandomButts(attempt)
|
|||||||
|
|
||||||
-- The OpenBoobs API sometimes returns an empty array
|
-- The OpenBoobs API sometimes returns an empty array
|
||||||
if not data and attempt < 10 then
|
if not data and attempt < 10 then
|
||||||
print('Cannot get that butts, trying another ones...')
|
print('Keine Butts gefunden!')
|
||||||
return getRandomButts(attempt)
|
return getRandomButts(attempt)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ function getRandomBoobs(attempt)
|
|||||||
|
|
||||||
-- The OpenBoobs API sometimes returns an empty array
|
-- The OpenBoobs API sometimes returns an empty array
|
||||||
if not data and attempt < 10 then
|
if not data and attempt < 10 then
|
||||||
print('Cannot get that boobs, trying another ones...')
|
print('Keine Boobs gefunden!')
|
||||||
return getRandomBoobs(attempt)
|
return getRandomBoobs(attempt)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -39,11 +39,11 @@ end
|
|||||||
function run(msg, matches)
|
function run(msg, matches)
|
||||||
local url = nil
|
local url = nil
|
||||||
|
|
||||||
if matches[1] == "!boobs" then
|
if matches[1] == "/boobs" then
|
||||||
url = getRandomBoobs()
|
url = getRandomBoobs()
|
||||||
end
|
end
|
||||||
|
|
||||||
if matches[1] == "!butts" then
|
if matches[1] == "/butts" then
|
||||||
url = getRandomButts()
|
url = getRandomButts()
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -51,19 +51,19 @@ function run(msg, matches)
|
|||||||
local receiver = get_receiver(msg)
|
local receiver = get_receiver(msg)
|
||||||
send_photo_from_url(receiver, url)
|
send_photo_from_url(receiver, url)
|
||||||
else
|
else
|
||||||
return 'Error getting boobs/butts for you, please try again later.'
|
return 'Keine Boobs/Butts gefunden.'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Gets a random boobs or butts pic",
|
description = "Sendet ein zufälliges Boobs/Butts Bild",
|
||||||
usage = {
|
usage = {
|
||||||
"!boobs: Get a boobs NSFW image. 🔞",
|
"/boobs",
|
||||||
"!butts: Get a butts NSFW image. 🔞"
|
"/butts"
|
||||||
},
|
},
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!boobs$",
|
"^/boobs$",
|
||||||
"^!butts$"
|
"^/butts$"
|
||||||
},
|
},
|
||||||
run = run
|
run = run
|
||||||
}
|
}
|
||||||
|
@ -1,50 +0,0 @@
|
|||||||
|
|
||||||
function getBTCX(amount,currency)
|
|
||||||
-- Do request on bitcoinaverage, the final / is critical!
|
|
||||||
local res,code = https.request("https://api.bitcoinaverage.com/ticker/global/"..currency.."/")
|
|
||||||
|
|
||||||
if code~= 200 then return nil end
|
|
||||||
local data = json:decode(res)
|
|
||||||
|
|
||||||
-- Easy, it's right there
|
|
||||||
text = "BTC/"..currency..'\n'..'Buy: '..data.ask..'\n'..'Sell: '..data.bid
|
|
||||||
|
|
||||||
-- If we have a number as second parameter, calculate the bitcoin amount
|
|
||||||
if amount~=nil then
|
|
||||||
btc = tonumber(amount) / tonumber(data.ask)
|
|
||||||
text = text.."\n "..currency .." "..amount.." = BTC "..btc
|
|
||||||
end
|
|
||||||
return text
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
vardump(matches)
|
|
||||||
local cur = 'EUR'
|
|
||||||
local amt = nil
|
|
||||||
-- Get the global match out of the way
|
|
||||||
if matches[1] == "!btc" then return getBTCX(amt,cur) end
|
|
||||||
|
|
||||||
if matches[2]~=nil then
|
|
||||||
-- There is a second match
|
|
||||||
amt = matches[2]
|
|
||||||
cur = string.upper(matches[1])
|
|
||||||
else
|
|
||||||
-- Just a EUR or USD param
|
|
||||||
cur = string.upper(matches[1])
|
|
||||||
end
|
|
||||||
return getBTCX(amt,cur)
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Bitcoin global average market value (in EUR or USD)",
|
|
||||||
usage = "!btc [EUR|USD] [amount]",
|
|
||||||
patterns = {
|
|
||||||
"^!btc$",
|
|
||||||
"^!btc ([Ee][Uu][Rr])$",
|
|
||||||
"^!btc ([Uu][Ss][Dd])$",
|
|
||||||
"^!btc (EUR) (%d+[%d%.]*)$",
|
|
||||||
"^!btc (USD) (%d+[%d%.]*)$"
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
local BASE_URL = "https://bugzilla.mozilla.org/rest/"
|
|
||||||
|
|
||||||
function bugzilla_login()
|
|
||||||
local url = BASE_URL.."login?login=" .. _config.bugzilla.username .. "&password=" .. _config.bugzilla.password
|
|
||||||
print("accessing " .. url)
|
|
||||||
local res,code = https.request( url )
|
|
||||||
data = json:decode(res)
|
|
||||||
return data
|
|
||||||
end
|
|
||||||
|
|
||||||
function bugzilla_check(id)
|
|
||||||
-- data = bugzilla_login()
|
|
||||||
vardump(data)
|
|
||||||
local url = BASE_URL.."bug/" .. id .. "?api_key=" .. _config.bugzilla.apikey
|
|
||||||
-- print(url)
|
|
||||||
local res,code = https.request( url )
|
|
||||||
data = json:decode(res)
|
|
||||||
return data
|
|
||||||
end
|
|
||||||
|
|
||||||
function bugzilla_listopened(email)
|
|
||||||
local url = BASE_URL.."bug?include_fields=id,summary,status,whiteboard,resolution&email1=" .. email .. "&email2=" .. email .. "&emailassigned_to2=1&emailreporter1=1&emailtype1=substring&emailtype2=substring&f1=bug_status&f2=bug_status&n1=1&n2=1&o1=equals&o2=equals&resolution=---&v1=closed&v2=resolved&api_key=" .. _config.bugzilla.apikey
|
|
||||||
local res,code = https.request( url )
|
|
||||||
print(res)
|
|
||||||
local data = json:decode(res)
|
|
||||||
return data
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
|
|
||||||
local response = ""
|
|
||||||
|
|
||||||
if matches[1] == "status" then
|
|
||||||
data = bugzilla_check(matches[2])
|
|
||||||
vardump(data)
|
|
||||||
if data.error == true then
|
|
||||||
return "Sorry, API failed with message: " .. data.message
|
|
||||||
else
|
|
||||||
response = "Bug #"..matches[1]..":\nReporter: "..data.bugs[1].creator
|
|
||||||
response = response .. "\n Last update: "..data.bugs[1].last_change_time
|
|
||||||
response = response .. "\n Status: "..data.bugs[1].status.." "..data.bugs[1].resolution
|
|
||||||
response = response .. "\n Whiteboard: "..data.bugs[1].whiteboard
|
|
||||||
response = response .. "\n Access: https://bugzilla.mozilla.org/show_bug.cgi?id=" .. matches[1]
|
|
||||||
print(response)
|
|
||||||
end
|
|
||||||
elseif matches[1] == "list" then
|
|
||||||
data = bugzilla_listopened(matches[2])
|
|
||||||
|
|
||||||
vardump(data)
|
|
||||||
if data.error == true then
|
|
||||||
return "Sorry, API failed with message: " .. data.message
|
|
||||||
else
|
|
||||||
|
|
||||||
-- response = "Bug #"..matches[1]..":\nReporter: "..data.bugs[1].creator
|
|
||||||
-- response = response .. "\n Last update: "..data.bugs[1].last_change_time
|
|
||||||
-- response = response .. "\n Status: "..data.bugs[1].status.." "..data.bugs[1].resolution
|
|
||||||
-- response = response .. "\n Whiteboard: "..data.bugs[1].whiteboard
|
|
||||||
-- response = response .. "\n Access: https://bugzilla.mozilla.org/show_bug.cgi?id=" .. matches[1]
|
|
||||||
local total = table.map_length(data.bugs)
|
|
||||||
|
|
||||||
print("total bugs: " .. total)
|
|
||||||
response = "There are " .. total .. " number of bug(s) assigned/reported by " .. matches[2]
|
|
||||||
|
|
||||||
if total > 0 then
|
|
||||||
response = response .. ": "
|
|
||||||
|
|
||||||
for tableKey, bug in pairs(data.bugs) do
|
|
||||||
response = response .. "\n #" .. bug.id
|
|
||||||
response = response .. "\n Status: " .. bug.status .. " " .. bug.resolution
|
|
||||||
response = response .. "\n Whiteboard: " .. bug.whiteboard
|
|
||||||
response = response .. "\n Summary: " .. bug.summary
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
return response
|
|
||||||
end
|
|
||||||
|
|
||||||
-- (table)
|
|
||||||
-- [bugs] = (table)
|
|
||||||
-- [1] = (table)
|
|
||||||
-- [status] = (string) ASSIGNED
|
|
||||||
-- [id] = (number) 927704
|
|
||||||
-- [whiteboard] = (string) [approved][full processed]
|
|
||||||
-- [summary] = (string) Budget Request - Arief Bayu Purwanto - https://reps.mozilla.org/e/mozilla-summit-2013/
|
|
||||||
-- [2] = (table)
|
|
||||||
-- [status] = (string) ASSIGNED
|
|
||||||
-- [id] = (number) 1049337
|
|
||||||
-- [whiteboard] = (string) [approved][full processed][waiting receipts][waiting report and photos]
|
|
||||||
-- [summary] = (string) Budget Request - Arief Bayu Purwanto - https://reps.mozilla.org/e/workshop-firefox-os-pada-workshop-media-sosial-untuk-perubahan-1/
|
|
||||||
-- total bugs: 2
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Lookup bugzilla status update",
|
|
||||||
usage = "/bot bugzilla [bug number]",
|
|
||||||
patterns = {
|
|
||||||
"^/bugzilla (status) (.*)$",
|
|
||||||
"^/bugzilla (list) (.*)$"
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
@ -17,13 +17,13 @@ local function enable_channel(receiver)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if _config.disabled_channels[receiver] == nil then
|
if _config.disabled_channels[receiver] == nil then
|
||||||
return 'Channel isn\'t disabled'
|
return 'Channel ist nicht deaktiviert!'
|
||||||
end
|
end
|
||||||
|
|
||||||
_config.disabled_channels[receiver] = false
|
_config.disabled_channels[receiver] = false
|
||||||
|
|
||||||
save_config()
|
save_config()
|
||||||
return "Channel reenabled"
|
return "Channel wieder aktiviert!"
|
||||||
end
|
end
|
||||||
|
|
||||||
local function disable_channel( receiver )
|
local function disable_channel( receiver )
|
||||||
@ -34,7 +34,7 @@ local function disable_channel( receiver )
|
|||||||
_config.disabled_channels[receiver] = true
|
_config.disabled_channels[receiver] = true
|
||||||
|
|
||||||
save_config()
|
save_config()
|
||||||
return "Channel disabled"
|
return "Channel deaktiviert!"
|
||||||
end
|
end
|
||||||
|
|
||||||
local function pre_process(msg)
|
local function pre_process(msg)
|
||||||
@ -42,7 +42,7 @@ local function pre_process(msg)
|
|||||||
|
|
||||||
-- If is sudo can reeanble the channel
|
-- If is sudo can reeanble the channel
|
||||||
if is_sudo(msg) then
|
if is_sudo(msg) then
|
||||||
if msg.text == "!channel enable" then
|
if msg.text == "/channel enable" then
|
||||||
enable_channel(receiver)
|
enable_channel(receiver)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -67,13 +67,11 @@ local function run(msg, matches)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Plugin to manage channels. Enable or disable channel.",
|
description = "",
|
||||||
usage = {
|
usage = {""},
|
||||||
"!channel enable: enable current channel",
|
|
||||||
"!channel disable: disable current channel" },
|
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!channel? (enable)",
|
"^/channel? (enable)",
|
||||||
"^!channel? (disable)" },
|
"^/channel? (disable)" },
|
||||||
run = run,
|
run = run,
|
||||||
privileged = true,
|
privileged = true,
|
||||||
pre_process = pre_process
|
pre_process = pre_process
|
||||||
|
@ -4,10 +4,10 @@ function run(msg, matches)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Simplest plugin ever!",
|
description = "Wiederholt euch",
|
||||||
usage = "!echo [whatever]: echoes the msg",
|
usage = "/echo [Satz]",
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!echo (.*)$"
|
"^/echo (.*)$"
|
||||||
},
|
},
|
||||||
run = run
|
run = run
|
||||||
}
|
}
|
||||||
|
14
plugins/emoticons.lua
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
if matches[1] == "/emoticons" then
|
||||||
|
return '😄😃😀😊☺️😉😍😘😚😗😙😜😝😛😳😁😔😌😒😞😣😢😂😭😪😥😰😅😓😩😫😨😱😠😡😤😖😆😋😷😎😴😵😲😟😦😧😈👿😮😬😐😕😯😶😇😏😑👲👳👮👷💂👶👦👧👨👩👴👵👱👼👸😺😸😻😽😼🙀😿😹😾👹👺🙈🙉🙊💀👽💩🔥✨🌟💫💥💢💦💧💤💨👂👀👃👅👄👍👎👌👊✊✌️👋✋👐👆👇👉👈🙌🙏☝️👏💪🚶🏃💃👫👪👬👭💏💑👯🙆🙅💁🙋💆💇💅👰🙎🙍🙇🎩👑👒👟👞👡👠👢👕👔👚👗🎽👖👘👙💼👜👝👛👓🎀🌂💄💛💙💜💚❤️💔💗💓💕💖💞💘💌💋💍💎👤👥💬👣💭🐶🐺🐱🐭🐹🐰🐸🐯🐨🐻🐷🐽🐮🐗🐵🐒🐴🐑🐘🐼🐧🐦🐤🐥🐣🐔🐍🐢🐛🐝🐜🐞🐌🐙🐚🐠🐟🐬🐳🐋🐄🐏🐀🐃🐅🐇🐉🐎🐐🐓🐕🐖🐁🐂🐲🐡🐊🐫🐪🐆🐈🐩🐾💐🌸🌷🍀🌹🌻🌺🍁🍃🍂🌿🌾🍄🌵🌴🌲🌳🌰🌱🌼🌐🌞🌝🌚🌑🌒🌓🌔🌕🌖🌗🌘🌜🌛🌙🌍🌎🌏🌋🌌🌠⭐️☀️⛅️☁️⚡️☔️❄️⛄️🌀🌁🌈🌊🎍💝🎎🎒🎓🎏🎆🎇🎐🎑🎃👻🎅🎄🎁🎋🎉🎊🎈🎌🔮🎥📷📹📼💿📀💽💾💻📱☎️📞📟📠📡📺📻🔊🔉🔈🔇🔔🔕📢📣⏳⌛️⏰⌚️🔓🔒🔏🔐🔑🔎💡🔦🔆🔅🔌🔋🔍🛁🛀🚿🚽🔧🔩🔨🚪🚬💣🔫🔪💊💉💰💴💵💷💶💳💸📲📧📥📤✉️📩📨📯📫📪📬📭📮📦📝📄📃📑📊📈📉📜📋📅📆📇📁📂✂️📌📎✒️✏️📏📐📕📗📘📙📓📔📒📚📖🔖📛🔬🔭📰🎨🎬🎤🎧🎼🎵🎶🎹🎻🎺🎷🎸👾🎮🃏🎴🀄️🎲🎯🏈🏀⚽️⚾️🎾🎱🏉🎳⛳️🚵🚴🏁🏇🏆🎿🏂🏊🏄🎣☕️🍵🍶🍼🍺🍻🍸🍹🍷🍴🍕🍔🍟🍗🍖🍝🍛🍤🍱🍣🍥🍙🍘🍚🍜🍲🍢🍡🍳🍞🍩🍮🍦🍨🍧🎂🍰🍪🍫🍬🍭🍯🍎🍏🍊🍋🍒🍇🍉🍓🍑🍈🍌🍐🍍🍠🍆🍅🌽🏠🏡🏫🏢🏣🏥🏦🏪🏩🏨💒⛪️🏬🏤🌇🌆🏯🏰⛺️🏭🗼🗾🗻🌄🌅🌃🗽🌉🎠🎡⛲️🎢🚢⛵️🚤🚣⚓️🚀✈️💺🚁🚂🚊🚉🚞🚆🚄🚅🚈🚇🚝🚋🚃🚎🚌🚍🚙🚘🚗🚕🚖🚛🚚🚨🚓🚔🚒🚑🚐🚲🚡🚟🚠🚜💈🚏🎫🚦🚥⚠️🚧🔰⛽️🏮🎰♨️🗿🎪🎭📍🚩🇯🇵🇰🇷🇩🇪🇨🇳🇺🇸🇫🇷🇪🇸🇮🇹🇷🇺🇬🇧1⃣2⃣3⃣4⃣5⃣6⃣7⃣8⃣9⃣0⃣🔟🔢#⃣🔣⬆️⬇️⬅️➡️🔠🔡🔤↗️↖️↘️↙️↔️↕️🔄◀️▶️🔼🔽↩️↪️ℹ️⏪⏩⏫⏬⤵️⤴️🆗🔀🔁🔂🆕🆙🆒🆓🆖📶🎦🈁🈯️🈳🈵🈴🈲🉐🈹🈺🈶🈚️🚻🚹🚺🚼🚾🚰🚮🅿️♿️🚭🈷🈸🈂Ⓜ️🛂🛄🛅🛃🉑㊙️㊗️🆑🆘🆔🚫🔞📵🚯🚱🚳🚷🚸⛔️✳️❇️❎✅✴️💟🆚📳📴🅰🅱🆎🅾💠➿♻️♈️♉️♊️♋️♌️♍️♎️♏️♐️♑️♒️♓️⛎🔯🏧💹💲💱©®™❌‼️⁉️❗️❓❕❔⭕️🔝🔚🔙🔛🔜🔃🕛🕧🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕖🕗🕘🕙🕚🕡🕢🕣🕤🕥🕦✖️➕➖➗♠️♥️♣️♦️💮💯✔️☑️🔘🔗➰〰〽️🔱◼️◻️◾️◽️▪️▫️🔺🔲🔳⚫️⚪️🔴🔵🔻⬜️⬛️🔶🔷🔸🔹'
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Sendet alle Emoticons",
|
||||||
|
usage = "/emoticons",
|
||||||
|
patterns = {"^/emoticons"},
|
||||||
|
run = run
|
||||||
|
}
|
@ -1,35 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
function getEURUSD(usd)
|
|
||||||
local b = http.request("http://webrates.truefx.com/rates/connect.html?c=EUR/USD&f=csv&s=n")
|
|
||||||
local rates = b:split(", ")
|
|
||||||
local symbol = rates[1]
|
|
||||||
local timestamp = rates[2]
|
|
||||||
local sell = rates[3]..rates[4]
|
|
||||||
local buy = rates[5]..rates[6]
|
|
||||||
text = symbol..'\n'..'Buy: '..buy..'\n'..'Sell: '..sell
|
|
||||||
if usd then
|
|
||||||
eur = tonumber(usd) / tonumber(buy)
|
|
||||||
text = text.."\n "..usd.."USD = "..eur.."EUR"
|
|
||||||
end
|
|
||||||
return text
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
if matches[1] == "!eur" then
|
|
||||||
return getEURUSD(nil)
|
|
||||||
end
|
|
||||||
return getEURUSD(matches[1])
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "EURUSD market value",
|
|
||||||
usage = "!eur [USD]",
|
|
||||||
patterns = {
|
|
||||||
"^!eur$",
|
|
||||||
"^!eur (%d+[%d%.]*)$",
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
11
plugins/facepalm.lua
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
send_document(get_receiver(msg), "sticker/facepalm.webp", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Facepalm",
|
||||||
|
usage = "/facepalm",
|
||||||
|
patterns = {"^/facepalm",
|
||||||
|
"^/Facepalm"},
|
||||||
|
run = run
|
||||||
|
}
|
@ -1,24 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
function get_fortunes_uc3m()
|
|
||||||
local i = math.random(0,178) -- max 178
|
|
||||||
local web = "http://www.gul.es/fortunes/f"..i
|
|
||||||
local b, c, h = http.request(web)
|
|
||||||
return b
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
return get_fortunes_uc3m()
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Fortunes from Universidad Carlos III",
|
|
||||||
usage = "!uc3m",
|
|
||||||
patterns = {
|
|
||||||
"^!uc3m$"
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
@ -1,94 +0,0 @@
|
|||||||
local _file_values = './data/values.lua'
|
|
||||||
|
|
||||||
function read_file_values( )
|
|
||||||
local f = io.open(_file_values, "r+")
|
|
||||||
-- If file doesn't exists
|
|
||||||
if f == nil then
|
|
||||||
-- Create a new empty table
|
|
||||||
print ('Created value file '.._file_values)
|
|
||||||
serialize_to_file({}, _file_values)
|
|
||||||
else
|
|
||||||
print ('Values loaded: '.._file_values)
|
|
||||||
f:close()
|
|
||||||
end
|
|
||||||
return loadfile (_file_values)()
|
|
||||||
end
|
|
||||||
|
|
||||||
_values = read_file_values()
|
|
||||||
|
|
||||||
function fetch_value(chat, value_name)
|
|
||||||
-- Chat non exists
|
|
||||||
if _values[chat] == nil then
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
if value_name == nil then
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
local value = _values[chat][value_name]
|
|
||||||
return value
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_value(chat, value_name)
|
|
||||||
|
|
||||||
-- If chat values is empty
|
|
||||||
if (_values[chat] == nil) then
|
|
||||||
return "There isn't any data"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- If there is not value name, return all the values.
|
|
||||||
if (value_name == nil ) then
|
|
||||||
local text = ""
|
|
||||||
for key,value in pairs(_values[chat]) do
|
|
||||||
text = text..key.." = "..value.."\n"
|
|
||||||
end
|
|
||||||
return text
|
|
||||||
end
|
|
||||||
local value = _values[chat][value_name]
|
|
||||||
if ( value == nil) then
|
|
||||||
return "Can't find "..value_name
|
|
||||||
end
|
|
||||||
return value_name.." = "..value
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
local chat_id = tostring(msg.to.id)
|
|
||||||
if matches[1] == "!get" then
|
|
||||||
return get_value(chat_id, nil)
|
|
||||||
end
|
|
||||||
return get_value(chat_id, matches[1])
|
|
||||||
end
|
|
||||||
|
|
||||||
function lex(msg)
|
|
||||||
|
|
||||||
if msg.text then
|
|
||||||
local text = msg.text
|
|
||||||
local chat_id = tostring(msg.to.id)
|
|
||||||
local s, e = text:find("%$%a+")
|
|
||||||
|
|
||||||
if s then
|
|
||||||
local var = text:sub(s + 1, e)
|
|
||||||
local value = fetch_value(chat_id, var)
|
|
||||||
|
|
||||||
if (value == nil) then
|
|
||||||
value = "(unknown value " .. var .. ")"
|
|
||||||
end
|
|
||||||
|
|
||||||
msg.text = text:sub(0, s - 1) .. value .. text:sub(e + 1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return msg
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Retrieves variables saved with !set",
|
|
||||||
usage = "!get (value_name): Returns the value_name value.",
|
|
||||||
patterns = {
|
|
||||||
"^!get (%a+)$",
|
|
||||||
"^!get$"},
|
|
||||||
run = run,
|
|
||||||
pre_process = lex
|
|
||||||
}
|
|
||||||
|
|
@ -49,25 +49,25 @@ function run(msg, matches)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not gif_url then
|
if not gif_url then
|
||||||
return "Error: GIF not found"
|
return "Kein GIF gefunden!"
|
||||||
end
|
end
|
||||||
|
|
||||||
local receiver = get_receiver(msg)
|
local receiver = get_receiver(msg)
|
||||||
send_document_from_url(receiver, gif_url)
|
send_document_from_url(receiver, gif_url)
|
||||||
return "Preparing to make you laugh"
|
return "Einen Moment, GIF wird hochgeladen."
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "GIFs from telegram with Giphy API",
|
description = "Sucht und sendet ein GIF von Giphy",
|
||||||
usage = {
|
usage = {
|
||||||
"!gif (term): Search and sends GIF from Giphy. If no param, sends a trending GIF.",
|
"/gif (Begriff)",
|
||||||
"!giphy (term): Search and sends GIF from Giphy. If no param, sends a trending GIF."
|
"/giphy (Begriff)"
|
||||||
},
|
},
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!gif$",
|
"^/gif$",
|
||||||
"^!gif (.*)",
|
"^/gif (.*)",
|
||||||
"^!giphy (.*)",
|
"^/giphy (.*)",
|
||||||
"^!giphy$"
|
"^/giphy$"
|
||||||
},
|
},
|
||||||
run = run
|
run = run
|
||||||
}
|
}
|
||||||
|
@ -28,10 +28,10 @@ function run(msg, matches)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Searches Google and send results",
|
description = "Durchsucht Google und sendet die ersten 5 Ergebnisse",
|
||||||
usage = "!google [terms]: Searches Google and send results",
|
usage = "/google [Begriff]",
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!google (.*)$",
|
"^/google (.*)$",
|
||||||
"^%.[g|G]oogle (.*)$"
|
"^%.[g|G]oogle (.*)$"
|
||||||
},
|
},
|
||||||
run = run
|
run = run
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
local lat = matches[1]
|
|
||||||
local lon = matches[2]
|
|
||||||
local receiver = get_receiver(msg)
|
|
||||||
|
|
||||||
local zooms = {16, 18}
|
|
||||||
local urls = {}
|
|
||||||
for i = 1, #zooms do
|
|
||||||
local zoom = zooms[i]
|
|
||||||
local url = "http://maps.googleapis.com/maps/api/staticmap?zoom=" .. zoom .. "&size=600x300&maptype=roadmap¢er=" .. lat .. "," .. lon .. "&markers=color:blue%7Clabel:X%7C" .. lat .. "," .. lon
|
|
||||||
table.insert(urls, url)
|
|
||||||
end
|
|
||||||
|
|
||||||
send_photos_from_url(receiver, urls)
|
|
||||||
|
|
||||||
return "www.google.es/maps/place/@" .. lat .. "," .. lon
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "generates a map showing the given GPS coordinates",
|
|
||||||
usage = "!gps latitude,longitude: generates a map showing the given GPS coordinates",
|
|
||||||
patterns = {"^!gps ([^,]*)[,%s]([^,]*)$"},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
@ -1,24 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
local result = 'Hacker News Top5:\n'
|
|
||||||
local top_stories_json, code = https.request('https://hacker-news.firebaseio.com/v0/topstories.json')
|
|
||||||
if code ~=200 then return nil end
|
|
||||||
local top_stories = json:decode(top_stories_json)
|
|
||||||
for i = 1, 5 do
|
|
||||||
local story_json, code = https.request('https://hacker-news.firebaseio.com/v0/item/'..top_stories[i]..'.json')
|
|
||||||
if code ~=200 then return nil end
|
|
||||||
local story = json:decode(story_json)
|
|
||||||
result = result .. i .. '. ' .. story.title .. ' - ' .. story.url .. '\n'
|
|
||||||
end
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Show top 5 hacker news (ycombinator.com)",
|
|
||||||
usage = "!hackernews",
|
|
||||||
patterns = {"^!hackernews$"},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
15
plugins/hallo.lua
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
local user_name = get_name(msg)
|
||||||
|
local receiver = get_receiver(msg)
|
||||||
|
return "Hallo " .. user_name .. "!"
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Sagt hallo zu euch",
|
||||||
|
usage = "hallo",
|
||||||
|
patterns = {
|
||||||
|
"^Hallo(.*)$",
|
||||||
|
"^hallo(.*)$"
|
||||||
|
},
|
||||||
|
run = run
|
||||||
|
}
|
@ -1,17 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
return "Hello, " .. matches[1]
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Says hello to someone",
|
|
||||||
usage = "say hello to [name]",
|
|
||||||
patterns = {
|
|
||||||
"^say hello to (.*)$",
|
|
||||||
"^Say hello to (.*)$"
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
@ -27,13 +27,13 @@ end
|
|||||||
|
|
||||||
-- !help command
|
-- !help command
|
||||||
local function telegram_help()
|
local function telegram_help()
|
||||||
local text = "Plugin list: \n\n"
|
local text = "Plugin Liste: \n\n"
|
||||||
-- Plugins names
|
-- Plugins names
|
||||||
for name in pairs(plugins) do
|
for name in pairs(plugins) do
|
||||||
text = text..name..'\n'
|
text = text..name..'\n'
|
||||||
end
|
end
|
||||||
text = text..'\n'..'Write "!help [plugin name]" for more info.'
|
text = text..'\n'..'Benutze "/hilfe [Plugin Name]" für mehr Informationen'
|
||||||
text = text..'\n'..'Or "!help all" to show all info.'
|
text = text..'\n'..'Oder "/hilfe all" um alles zu sehen.'
|
||||||
return text
|
return text
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -47,9 +47,9 @@ local function help_all()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function run(msg, matches)
|
local function run(msg, matches)
|
||||||
if matches[1] == "!help" then
|
if matches[1] == "/hilfe" then
|
||||||
return telegram_help()
|
return telegram_help()
|
||||||
elseif matches[1] == "!help all" then
|
elseif matches[1] == "/hilfe all" then
|
||||||
return help_all()
|
return help_all()
|
||||||
else
|
else
|
||||||
local text = plugin_help(matches[1])
|
local text = plugin_help(matches[1])
|
||||||
@ -61,16 +61,12 @@ local function run(msg, matches)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Help plugin. Get info from other plugins. ",
|
description = "",
|
||||||
usage = {
|
usage = {""},
|
||||||
"!help: Show list of plugins.",
|
|
||||||
"!help all: Show all commands for every plugin.",
|
|
||||||
"!help [plugin name]: Commands for that plugin."
|
|
||||||
},
|
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!help$",
|
"^/hilfe$",
|
||||||
"^!help all",
|
"^/hilfe all",
|
||||||
"^!help (.+)"
|
"^/hilfe (.+)"
|
||||||
},
|
},
|
||||||
run = run
|
run = run
|
||||||
}
|
}
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
function imdb(movie)
|
|
||||||
local http = require("socket.http")
|
|
||||||
http.TIMEOUT = 5
|
|
||||||
|
|
||||||
local movie = movie:gsub(' ', '+')
|
|
||||||
local url = "http://www.imdbapi.com/?t=" .. movie
|
|
||||||
local response, code, headers = http.request(url)
|
|
||||||
|
|
||||||
if code ~= 200 then
|
|
||||||
return "Error: " .. code
|
|
||||||
end
|
|
||||||
|
|
||||||
if #response > 0 then
|
|
||||||
local r = json:decode(response)
|
|
||||||
r['Url'] = "http://imdb.com/title/" .. r.imdbID
|
|
||||||
local t = ""
|
|
||||||
for k, v in pairs(r) do t = t .. k .. ": " .. v .. ", " end
|
|
||||||
return t:sub(1, -3)
|
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
return imdb(matches[1])
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Imdb plugin for telegram",
|
|
||||||
usage = "!imdb [movie]",
|
|
||||||
patterns = {"^!imdb (.+)"},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
@ -2,7 +2,7 @@ do
|
|||||||
|
|
||||||
function getGoogleImage(text)
|
function getGoogleImage(text)
|
||||||
local text = URL.escape(text)
|
local text = URL.escape(text)
|
||||||
local api = "https://ajax.googleapis.com/ajax/services/search/images?v=1.0&rsz=8&q="
|
local api = "https://ajax.googleapis.com/ajax/services/search/images?v=1.0&rsz=8&safe=active&q="
|
||||||
local res, code = http.request(api..text)
|
local res, code = http.request(api..text)
|
||||||
if code ~= 200 then return nil end
|
if code ~= 200 then return nil end
|
||||||
local google = json:decode(res)
|
local google = json:decode(res)
|
||||||
@ -32,17 +32,17 @@ function run(msg, matches)
|
|||||||
local url = getGoogleImage(text)
|
local url = getGoogleImage(text)
|
||||||
|
|
||||||
if not url then
|
if not url then
|
||||||
return "Error: Image not found"
|
return "Kein Bild gefunden. Versuch es nochmal"
|
||||||
end
|
end
|
||||||
|
|
||||||
print("Image URL: ", url)
|
print("Bilder-URL: ", url)
|
||||||
send_photo_from_url(receiver, url)
|
send_photo_from_url(receiver, url)
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Search image with Google API and sends it.",
|
description = "Sucht Bild mit Google-API und versendet es (SafeSearch aktiv)",
|
||||||
usage = "!img [term]: Random search an image with Google API.",
|
usage = "/img [Suchbegriff]",
|
||||||
patterns = {"^!img (.*)$"},
|
patterns = {"^/img (.*)$"},
|
||||||
run = run
|
run = run
|
||||||
}
|
}
|
||||||
|
|
||||||
|
49
plugins/img_google_nsfw.lua
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
do
|
||||||
|
|
||||||
|
function getGoogleImage(text)
|
||||||
|
local text = URL.escape(text)
|
||||||
|
local api = "https://ajax.googleapis.com/ajax/services/search/images?v=1.0&rsz=8&q="
|
||||||
|
local res, code = http.request(api..text)
|
||||||
|
if code ~= 200 then return nil end
|
||||||
|
local google = json:decode(res)
|
||||||
|
|
||||||
|
if google.responseStatus ~= 200 then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local data = google.responseData
|
||||||
|
|
||||||
|
if not data or not data.results then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if #data.results == 0 then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Random image from table
|
||||||
|
local i = math.random(#data.results)
|
||||||
|
return data.results[i].url
|
||||||
|
end
|
||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
local receiver = get_receiver(msg)
|
||||||
|
local text = matches[1]
|
||||||
|
local url = getGoogleImage(text)
|
||||||
|
|
||||||
|
if not url then
|
||||||
|
return "Kein Bild gefunden. Versuch es nochmal"
|
||||||
|
end
|
||||||
|
|
||||||
|
print("Bilder-URL: ", url)
|
||||||
|
send_photo_from_url(receiver, url)
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Sucht Bild mit Google-API und versendet es (SafeSearch aktiv)",
|
||||||
|
usage = "/img [Suchbegriff]",
|
||||||
|
patterns = {"^/img (.*)$"},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
|
||||||
|
end
|
@ -1,44 +0,0 @@
|
|||||||
-- Invite other user to the chat group.
|
|
||||||
-- Use !invite name User_name or !invite id id_number
|
|
||||||
-- The User_name is the print_name (there are no spaces but _)
|
|
||||||
|
|
||||||
do
|
|
||||||
|
|
||||||
local function run(msg, matches)
|
|
||||||
-- User submitted a user name
|
|
||||||
if matches[1] == "name" then
|
|
||||||
user = matches[2]
|
|
||||||
user = string.gsub(user," ","_")
|
|
||||||
end
|
|
||||||
-- User submitted an id
|
|
||||||
if matches[1] == "id" then
|
|
||||||
user = matches[2]
|
|
||||||
user = 'user#id'..user
|
|
||||||
end
|
|
||||||
-- The message must come from a chat group
|
|
||||||
if msg.to.type == 'chat' then
|
|
||||||
chat = 'chat#id'..msg.to.id
|
|
||||||
else
|
|
||||||
return 'This isnt a chat group!'
|
|
||||||
end
|
|
||||||
print ("Trying to add: "..user.." to "..chat)
|
|
||||||
status = chat_add_user (chat, user, ok_cb, false)
|
|
||||||
if not status then
|
|
||||||
return "An error happened"
|
|
||||||
end
|
|
||||||
return "Added user: "..user.." to "..chat
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Invite other user to the chat group",
|
|
||||||
usage = {
|
|
||||||
"!invite name [user_name]",
|
|
||||||
"!invite id [user_id]" },
|
|
||||||
patterns = {
|
|
||||||
"^!invite (name) (.*)$",
|
|
||||||
"^!invite (id) (%d+)$"
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
22
plugins/kitty.lua
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/kitty') then
|
||||||
|
randomValue = math.random(4)
|
||||||
|
if randomValue == 1 then
|
||||||
|
send_photo(get_receiver(msg), "pictures/cats/cat1.jpg", ok_cb, false)
|
||||||
|
elseif randomValue == 2 then
|
||||||
|
send_photo(get_receiver(msg), "pictures/cats/cat2.jpg", ok_cb, false)
|
||||||
|
elseif randomValue == 3 then
|
||||||
|
send_photo(get_receiver(msg), "pictures/cats/cat3.jpg", ok_cb, false)
|
||||||
|
elseif randomValue == 4 then
|
||||||
|
send_photo(get_receiver(msg), "pictures/cats/cat4.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Sendet eins von 4 Katzenbilder",
|
||||||
|
usage = "/kitty",
|
||||||
|
patterns = {"^/kitty"},
|
||||||
|
run = run
|
||||||
|
}
|
@ -1,61 +0,0 @@
|
|||||||
-- Implement a command !loc [area] which uses
|
|
||||||
-- the static map API to get a location image
|
|
||||||
|
|
||||||
-- Not sure if this is the proper way
|
|
||||||
-- Intent: get_latlong is in time.lua, we need it here
|
|
||||||
-- loadfile "time.lua"
|
|
||||||
|
|
||||||
-- Globals
|
|
||||||
-- If you have a google api key for the geocoding/timezone api
|
|
||||||
do
|
|
||||||
|
|
||||||
local api_key = nil
|
|
||||||
|
|
||||||
local base_api = "https://maps.googleapis.com/maps/api"
|
|
||||||
|
|
||||||
function get_staticmap(area)
|
|
||||||
local api = base_api .. "/staticmap?"
|
|
||||||
|
|
||||||
-- Get a sense of scale
|
|
||||||
local lat,lng,acc,types = get_latlong(area)
|
|
||||||
|
|
||||||
local scale = types[1]
|
|
||||||
if scale=="locality" then zoom=8
|
|
||||||
elseif scale=="country" then zoom=4
|
|
||||||
else zoom = 13 end
|
|
||||||
|
|
||||||
local parameters =
|
|
||||||
"size=600x300" ..
|
|
||||||
"&zoom=" .. zoom ..
|
|
||||||
"¢er=" .. URL.escape(area) ..
|
|
||||||
"&markers=color:red"..URL.escape("|"..area)
|
|
||||||
|
|
||||||
if api_key ~=nil and api_key ~= "" then
|
|
||||||
parameters = parameters .. "&key="..api_key
|
|
||||||
end
|
|
||||||
return lat, lng, api..parameters
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
local receiver = get_receiver(msg)
|
|
||||||
local lat,lng,url = get_staticmap(matches[1])
|
|
||||||
|
|
||||||
-- Send the actual location, is a google maps link
|
|
||||||
send_location(receiver, lat, lng, ok_cb, false)
|
|
||||||
|
|
||||||
-- Send a picture of the map, which takes scale into account
|
|
||||||
send_photo_from_url(receiver, url)
|
|
||||||
|
|
||||||
-- Return a link to the google maps stuff is now not needed anymore
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Gets information about a location, maplink and overview",
|
|
||||||
usage = "!loc (location): Gets information about a location, maplink and overview",
|
|
||||||
patterns = {"^!loc (.*)$"},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
32
plugins/lucky_star.lua
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/kagami') or string.starts(msg.text, "/Kagami") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/luckystar/kagami.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/konata') or string.starts(msg.text, "/Konata") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/luckystar/konata.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/miyuki') or string.starts(msg.text, "/Miyuki") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/luckystar/miyuki.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/tsukasa') or string.starts(msg.text, "/Tsukasa") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/luckystar/tsukasa.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Sendet ein Bild von den Lucky Star Chars",
|
||||||
|
usage = "/kagami, /konata, /tsukasa oder /miyuki",
|
||||||
|
patterns = {"^/kagami",
|
||||||
|
"^/Kagami",
|
||||||
|
"^/konata",
|
||||||
|
"^/Konata",
|
||||||
|
"^/miyuki",
|
||||||
|
"^/Miyuki",
|
||||||
|
"^/tsukasa",
|
||||||
|
"^/Tsukasa"},
|
||||||
|
run = run
|
||||||
|
}
|
@ -1,22 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
local answers = {'It is certain','It is decidedly so','Without a doubt',
|
|
||||||
'Yes definitely','You may rely on it','As I see it, yes',
|
|
||||||
'Most likely','Outlook good','Yes','Signs point to yes',
|
|
||||||
'Reply hazy try again','Ask again later',
|
|
||||||
'Better not tell you now','Cannot predict now',
|
|
||||||
'Concentrate and ask again','Don\'t count on it',
|
|
||||||
'My reply is no','My sources say no','Outlook not so good',
|
|
||||||
'Very doubtful'}
|
|
||||||
return answers[math.random(#answers)]
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Magic 8Ball",
|
|
||||||
usage = "!magic8ball",
|
|
||||||
patterns = {"^!magic8ball"},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
20
plugins/magische_miesmuschel.lua
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
do
|
||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
local answers = {'Ja','Nein','Eines Tages vielleicht'}
|
||||||
|
return answers[math.random(#answers)]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Beantwortet euch eine Frage (100% Wahrheit!)",
|
||||||
|
usage = "Magische Miesmuschel [Frage]",
|
||||||
|
patterns = {
|
||||||
|
"^Magische Miesmuschel(.*)$",
|
||||||
|
"^magische Miesmuschel(.*)$",
|
||||||
|
"^Magische miesmuschel(.*)$",
|
||||||
|
"^magische miesmuschel(.*)$"
|
||||||
|
},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
end
|
@ -1,6 +1,7 @@
|
|||||||
do
|
do
|
||||||
|
|
||||||
function run(msg, matches)
|
function run(msg, matches)
|
||||||
|
local receiver = get_receiver(msg)
|
||||||
local file = download_to_file(matches[1])
|
local file = download_to_file(matches[1])
|
||||||
send_document(get_receiver(msg), file, ok_cb, false)
|
send_document(get_receiver(msg), file, ok_cb, false)
|
||||||
end
|
end
|
||||||
@ -18,7 +19,17 @@ return {
|
|||||||
"(https?://[%w-_%.%?%.:/%+=&]+%.rar)$",
|
"(https?://[%w-_%.%?%.:/%+=&]+%.rar)$",
|
||||||
"(https?://[%w-_%.%?%.:/%+=&]+%.wmv)$",
|
"(https?://[%w-_%.%?%.:/%+=&]+%.wmv)$",
|
||||||
"(https?://[%w-_%.%?%.:/%+=&]+%.doc)$",
|
"(https?://[%w-_%.%?%.:/%+=&]+%.doc)$",
|
||||||
"(https?://[%w-_%.%?%.:/%+=&]+%.avi)$"
|
"(https?://[%w-_%.%?%.:/%+=&]+%.tar.gz)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.dlc)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.txt)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.deb)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.webm)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.avi)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.wav)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.exe)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.rpm)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.dmg)$",
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+%.apk)$"
|
||||||
},
|
},
|
||||||
run = run
|
run = run
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
local function callback(extra, success, result)
|
local function callback(extra, success, result)
|
||||||
if success then
|
if success then
|
||||||
print('File downloaded to:', result)
|
print('File downloaded to:', result)
|
15
plugins/moepse.lua
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
return 'se'
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Möpse? Meepse?",
|
||||||
|
usage = "möp oder meep",
|
||||||
|
patterns = {"^möp",
|
||||||
|
"Möp",
|
||||||
|
"meep",
|
||||||
|
"Meep"},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
|
10
plugins/myid.lua
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
return tostring(msg.from.id) .. ' ' .. tostring(is_sudo(msg))
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = 'Zeigt deine Telegram ID',
|
||||||
|
usage = '/myid',
|
||||||
|
patterns = {'^/myid$'},
|
||||||
|
run = run
|
||||||
|
}
|
11
plugins/naira_derp.lua
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
send_document(get_receiver(msg), "sticker/naira_derp.webp", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Naira Derp",
|
||||||
|
usage = "/nairad",
|
||||||
|
patterns = {"^/nairad",
|
||||||
|
"^/Nairad"},
|
||||||
|
run = run
|
||||||
|
}
|
13
plugins/nau.lua
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, "/nau") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/nau.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "RTL Nau",
|
||||||
|
usage = "/nau",
|
||||||
|
patterns = {"^/nau"},
|
||||||
|
run = run
|
||||||
|
}
|
13
plugins/neorame.lua
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, "/neorame") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/neorame.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "NeoRame is best pony!",
|
||||||
|
usage = "/neorame",
|
||||||
|
patterns = {"^/neorame"},
|
||||||
|
run = run
|
||||||
|
}
|
18
plugins/niissan.lua
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, 'nii-san') or string.starts(msg.text, 'Nii-san') or string.starts(msg.text, 'Nissan') or string.starts(msg.text, 'nissan') then
|
||||||
|
send_photo(get_receiver(msg), "pictures/Nii-san.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Nii-san <3",
|
||||||
|
usage = "nii-san, Nii-san, nissan oder Nissan",
|
||||||
|
patterns = {"^nii-san",
|
||||||
|
"^Nii-san",
|
||||||
|
"^nissan",
|
||||||
|
"^Nissan"},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
|
15
plugins/nope.avi.lua
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
if matches[1] == "nope.avi" then
|
||||||
|
return 'https://www.youtube.com/watch?v=gvdf5n-zI14'
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = 'Sendet ein YouTube Video namens "nope.avi"',
|
||||||
|
usage = "nope.avi",
|
||||||
|
patterns = {"^nope.avi"},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
|
16
plugins/nyu.lua
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, 'nyu') or string.starts(msg.text, 'Nyu') then
|
||||||
|
send_photo(get_receiver(msg), "pictures/nyu.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Nyu?",
|
||||||
|
usage = "nyu",
|
||||||
|
patterns = {"^nyu",
|
||||||
|
"^Nyu"},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
|
@ -1,28 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
local socket = require("socket")
|
|
||||||
|
|
||||||
function cron()
|
|
||||||
-- Use yours desired web and id
|
|
||||||
local addr = "www.google.com"
|
|
||||||
local dest = "user#id"..our_id
|
|
||||||
-- Checks a TCP connexion
|
|
||||||
local connexion = socket.connect(addr, 80)
|
|
||||||
if not connexion then
|
|
||||||
local text = "ALERT: "..addr.." is offline"
|
|
||||||
print (text)
|
|
||||||
send_msg(dest, text, ok_cb, false)
|
|
||||||
else
|
|
||||||
connexion:close()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "If domain is offline, send msg to peer",
|
|
||||||
usage = "",
|
|
||||||
patterns = {},
|
|
||||||
run = nil,
|
|
||||||
cron = cron
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
@ -51,7 +51,7 @@ end
|
|||||||
local function enable_plugin( filename )
|
local function enable_plugin( filename )
|
||||||
-- Check if plugin is enabled
|
-- Check if plugin is enabled
|
||||||
if plugin_enabled(filename) then
|
if plugin_enabled(filename) then
|
||||||
return 'Plugin '..filename..' is enabled'
|
return 'Plugin '..filename..' ist aktiviert!'
|
||||||
end
|
end
|
||||||
-- Checks if plugin exists
|
-- Checks if plugin exists
|
||||||
if plugin_exists(filename) then
|
if plugin_exists(filename) then
|
||||||
@ -61,19 +61,19 @@ local function enable_plugin( filename )
|
|||||||
-- Reload the plugins
|
-- Reload the plugins
|
||||||
return reload_plugins( )
|
return reload_plugins( )
|
||||||
else
|
else
|
||||||
return 'Plugin '..filename..' does not exists'
|
return 'Das Plugin '..filename..' exestiert nicht!'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function disable_plugin( name, chat )
|
local function disable_plugin( name, chat )
|
||||||
-- Check if plugins exists
|
-- Check if plugins exists
|
||||||
if not plugin_exists(name) then
|
if not plugin_exists(name) then
|
||||||
return 'Plugin '..name..' does not exists'
|
return 'Das Plugin '..name..' exestiert nicht!'
|
||||||
end
|
end
|
||||||
local k = plugin_enabled(name)
|
local k = plugin_enabled(name)
|
||||||
-- Check if plugin is enabled
|
-- Check if plugin is enabled
|
||||||
if not k then
|
if not k then
|
||||||
return 'Plugin '..name..' not enabled'
|
return 'Das Plugin '..name..' ist nicht aktiviert!'
|
||||||
end
|
end
|
||||||
-- Disable and reload
|
-- Disable and reload
|
||||||
table.remove(_config.enabled_plugins, k)
|
table.remove(_config.enabled_plugins, k)
|
||||||
@ -83,7 +83,7 @@ end
|
|||||||
|
|
||||||
local function disable_plugin_on_chat(receiver, plugin)
|
local function disable_plugin_on_chat(receiver, plugin)
|
||||||
if not plugin_exists(plugin) then
|
if not plugin_exists(plugin) then
|
||||||
return "Plugin doesn't exists"
|
return "Das Plugin exestiert nicht!"
|
||||||
end
|
end
|
||||||
|
|
||||||
if not _config.disabled_plugin_on_chat then
|
if not _config.disabled_plugin_on_chat then
|
||||||
@ -97,7 +97,7 @@ local function disable_plugin_on_chat(receiver, plugin)
|
|||||||
_config.disabled_plugin_on_chat[receiver][plugin] = true
|
_config.disabled_plugin_on_chat[receiver][plugin] = true
|
||||||
|
|
||||||
save_config()
|
save_config()
|
||||||
return 'Plugin '..plugin..' disabled on this chat'
|
return 'Das Plugin '..plugin..' ist hier nun deaktiviert!'
|
||||||
end
|
end
|
||||||
|
|
||||||
local function reenable_plugin_on_chat(receiver, plugin)
|
local function reenable_plugin_on_chat(receiver, plugin)
|
||||||
@ -110,16 +110,16 @@ local function reenable_plugin_on_chat(receiver, plugin)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not _config.disabled_plugin_on_chat[receiver][plugin] then
|
if not _config.disabled_plugin_on_chat[receiver][plugin] then
|
||||||
return 'This plugin is not disabled'
|
return 'Dieses Plugin ist nicht deaktiviert!'
|
||||||
end
|
end
|
||||||
|
|
||||||
_config.disabled_plugin_on_chat[receiver][plugin] = false
|
_config.disabled_plugin_on_chat[receiver][plugin] = false
|
||||||
return 'Plugin '..plugin..' is enabled again'
|
return 'Das Plugin '..plugin..' ist wieder aktiviert!'
|
||||||
end
|
end
|
||||||
|
|
||||||
local function run(msg, matches)
|
local function run(msg, matches)
|
||||||
-- Show the available plugins
|
-- Show the available plugins
|
||||||
if matches[1] == '!plugins' then
|
if matches[1] == '/plugins' then
|
||||||
return list_plugins()
|
return list_plugins()
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -158,20 +158,15 @@ local function run(msg, matches)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Plugin to manage other plugins. Enable, disable or reload.",
|
description = "",
|
||||||
usage = {
|
usage = {""},
|
||||||
"!plugins: list all plugins.",
|
|
||||||
"!plugins enable [plugin]: enable plugin.",
|
|
||||||
"!plugins disable [plugin]: disable plugin.",
|
|
||||||
"!plugins disable [plugin] chat: disable plugin only this chat.",
|
|
||||||
"!plugins reload: reloads all plugins." },
|
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!plugins$",
|
"^/plugins$",
|
||||||
"^!plugins? (enable) ([%w_%.%-]+)$",
|
"^/plugins? (enable) ([%w_%.%-]+)$",
|
||||||
"^!plugins? (disable) ([%w_%.%-]+)$",
|
"^/plugins? (disable) ([%w_%.%-]+)$",
|
||||||
"^!plugins? (disable) ([%w_%.%-]+) (chat)",
|
"^/plugins? (disable) ([%w_%.%-]+) (chat)",
|
||||||
"^!plugins? (enable) ([%w_%.%-]+) (chat)",
|
"^/plugins? (enable) ([%w_%.%-]+) (chat)",
|
||||||
"^!plugins? (reload)$" },
|
"^/plugins? (reload)$" },
|
||||||
run = run,
|
run = run,
|
||||||
privileged = true
|
privileged = true
|
||||||
}
|
}
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
local quotes_file = './data/quotes.lua'
|
|
||||||
local quotes_table
|
|
||||||
|
|
||||||
function read_quotes_file()
|
|
||||||
local f = io.open(quotes_file, "r+")
|
|
||||||
|
|
||||||
if f == nil then
|
|
||||||
print ('Created a new quotes file on '..quotes_file)
|
|
||||||
serialize_to_file({}, quotes_file)
|
|
||||||
else
|
|
||||||
print ('Quotes loaded: '..quotes_file)
|
|
||||||
f:close()
|
|
||||||
end
|
|
||||||
return loadfile (quotes_file)()
|
|
||||||
end
|
|
||||||
|
|
||||||
function save_quote(msg)
|
|
||||||
local to_id = tostring(msg.to.id)
|
|
||||||
|
|
||||||
if msg.text:sub(11):isempty() then
|
|
||||||
return "Usage: !addquote quote"
|
|
||||||
end
|
|
||||||
|
|
||||||
if quotes_table == nil then
|
|
||||||
quotes_table = {}
|
|
||||||
end
|
|
||||||
|
|
||||||
if quotes_table[to_id] == nil then
|
|
||||||
print ('New quote key to_id: '..to_id)
|
|
||||||
quotes_table[to_id] = {}
|
|
||||||
end
|
|
||||||
|
|
||||||
local quotes = quotes_table[to_id]
|
|
||||||
quotes[#quotes+1] = msg.text:sub(11)
|
|
||||||
|
|
||||||
serialize_to_file(quotes_table, quotes_file)
|
|
||||||
|
|
||||||
return "done!"
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_quote(msg)
|
|
||||||
local to_id = tostring(msg.to.id)
|
|
||||||
local quotes_phrases
|
|
||||||
|
|
||||||
quotes_table = read_quotes_file()
|
|
||||||
quotes_phrases = quotes_table[to_id]
|
|
||||||
|
|
||||||
return quotes_phrases[math.random(1,#quotes_phrases)]
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
if string.match(msg.text, "!quote$") then
|
|
||||||
return get_quote(msg)
|
|
||||||
elseif string.match(msg.text, "!addquote (.+)$") then
|
|
||||||
quotes_table = read_quotes_file()
|
|
||||||
return save_quote(msg)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Save quote",
|
|
||||||
description = "Quote plugin, you can create and retrieves random quotes",
|
|
||||||
usage = {
|
|
||||||
"!addquote [msg]",
|
|
||||||
"!quote",
|
|
||||||
},
|
|
||||||
patterns = {
|
|
||||||
"^!addquote (.+)$",
|
|
||||||
"^!quote$",
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
function getDulcinea( text )
|
|
||||||
-- Powered by https://github.com/javierhonduco/dulcinea
|
|
||||||
|
|
||||||
local api = "http://dulcinea.herokuapp.com/api/?query="
|
|
||||||
local query_url = api..text
|
|
||||||
|
|
||||||
local b, code = http.request(query_url)
|
|
||||||
|
|
||||||
if code ~= 200 then
|
|
||||||
return "Error: HTTP Connexion"
|
|
||||||
end
|
|
||||||
|
|
||||||
dulcinea = json:decode(b)
|
|
||||||
|
|
||||||
if dulcinea.status == "error" then
|
|
||||||
return "Error: " .. dulcinea.message
|
|
||||||
end
|
|
||||||
|
|
||||||
while dulcinea.type == "multiple" do
|
|
||||||
text = dulcinea.response[1].id
|
|
||||||
b = http.request(api..text)
|
|
||||||
dulcinea = json:decode(b)
|
|
||||||
end
|
|
||||||
|
|
||||||
local text = ""
|
|
||||||
|
|
||||||
local responses = #dulcinea.response
|
|
||||||
|
|
||||||
if responses == 0 then
|
|
||||||
return "Error: 404 word not found"
|
|
||||||
end
|
|
||||||
|
|
||||||
if (responses > 5) then
|
|
||||||
responses = 5
|
|
||||||
end
|
|
||||||
|
|
||||||
for i = 1, responses, 1 do
|
|
||||||
text = text .. dulcinea.response[i].word .. "\n"
|
|
||||||
local meanings = #dulcinea.response[i].meanings
|
|
||||||
if (meanings > 5) then
|
|
||||||
meanings = 5
|
|
||||||
end
|
|
||||||
for j = 1, meanings, 1 do
|
|
||||||
local meaning = dulcinea.response[i].meanings[j].meaning
|
|
||||||
text = text .. meaning .. "\n\n"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return text
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
return getDulcinea(matches[1])
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Spanish dictionary",
|
|
||||||
usage = "!rae [word]: Search that word in Spanish dictionary.",
|
|
||||||
patterns = {"^!rae (.*)$"},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
19
plugins/rich_bitch.lua
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
if matches[1] == "rich bitch" then
|
||||||
|
return 'Akamaru ist nicht reich!'
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Sagt euch dass Akamaru nicht reich ist",
|
||||||
|
usage = "rich bitch",
|
||||||
|
patterns = {"^Rich Bitch",
|
||||||
|
"^rich bitch",
|
||||||
|
"^rich Bitch",
|
||||||
|
"^Rich bitch",
|
||||||
|
"^RICH BITCH"},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
|
50
plugins/sakurasou.lua
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/shiina') or string.starts(msg.text, "/Shiina") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/sakurasou/shiina.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/chihiro') or string.starts(msg.text, "/Chihiro") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/sakurasou/chihiro.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/jin') or string.starts(msg.text, "/Jin") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/sakurasou/jin.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/misaki') or string.starts(msg.text, "/Misaki") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/sakurasou/misaki.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/nanami') or string.starts(msg.text, "/Nanami") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/sakurasou/nanami.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/ryuunosuke') or string.starts(msg.text, "/Ryuunosuke") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/sakurasou/ryuunosuke.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/sorata') or string.starts(msg.text, "/Sorata") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/sakurasou/sorata.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "",
|
||||||
|
usage = "",
|
||||||
|
patterns = {"^/shiina",
|
||||||
|
"^/Shiina",
|
||||||
|
"^/chihiro",
|
||||||
|
"^/Chihiro",
|
||||||
|
"^/jin",
|
||||||
|
"^/Jin",
|
||||||
|
"^/misaki",
|
||||||
|
"^/Misaki",
|
||||||
|
"^/nanami",
|
||||||
|
"^/Nanami",
|
||||||
|
"^/ryuunosuke",
|
||||||
|
"^/Ryuunosuke",
|
||||||
|
"^/sorata",
|
||||||
|
"^/Sorata"},
|
||||||
|
run = run
|
||||||
|
}
|
@ -29,7 +29,7 @@ local function searchYoutubeVideo(text)
|
|||||||
print("HTTP Error")
|
print("HTTP Error")
|
||||||
return nil
|
return nil
|
||||||
elseif not data.feed.entry then
|
elseif not data.feed.entry then
|
||||||
return "YouTube video not found!"
|
return "Kein YouTube Video gefunden!"
|
||||||
end
|
end
|
||||||
return data.feed.entry[1].link[1].href
|
return data.feed.entry[1].link[1].href
|
||||||
end
|
end
|
||||||
@ -43,10 +43,10 @@ local function run(msg, matches)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Search video on youtube and send it.",
|
description = "Sucht ein Video auf YouTube und sendet es",
|
||||||
usage = "!youtube [term]: Search for a youtube video and send it.",
|
usage = "/youtube [Begriff]",
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!youtube (.*)"
|
"^/youtube (.*)"
|
||||||
},
|
},
|
||||||
run = run
|
run = run
|
||||||
}
|
}
|
||||||
|
69
plugins/senran_kagura.lua
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/asuka') or string.starts(msg.text, "/Asuka") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hanzouacademy/asuka.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/hibari') or string.starts(msg.text, "/Hibari") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hanzouacademy/hibari.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/ikaruga') or string.starts(msg.text, "/Ikaruga") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hanzouacademy/ikaruga.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/katsuragi') or string.starts(msg.text, "/Katsuragi") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hanzouacademy/katsuragi.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/yagyuu') or string.starts(msg.text, "/Yagyuu") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hanzouacademy/yagyuu.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/haruka') or string.starts(msg.text, "/Haruka") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hebijoacademy/haruka.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/hikage') or string.starts(msg.text, "/Hikage") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hebijoacademy/hikage.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/homura') or string.starts(msg.text, "/Homura") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hebijoacademy/homura.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/mirai') or string.starts(msg.text, "/Mirai") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hebijoacademy/mirai.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/yomi') or string.starts(msg.text, "/Yomi") then
|
||||||
|
send_photo(get_receiver(msg), "pictures/senrankagura/hebijoacademy/yomi.jpg", ok_cb, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "",
|
||||||
|
usage = "",
|
||||||
|
patterns = {"^/asuka",
|
||||||
|
"^/Asuka",
|
||||||
|
"^/hibari",
|
||||||
|
"^/Hibari",
|
||||||
|
"^/ikaruga",
|
||||||
|
"^/Ikaruga",
|
||||||
|
"^/katsuragi",
|
||||||
|
"^/Katsuragi",
|
||||||
|
"^/yagyuu",
|
||||||
|
"^/Yagyuu",
|
||||||
|
"^/haruka",
|
||||||
|
"^/Haruka",
|
||||||
|
"^/hikage",
|
||||||
|
"^/Hikage",
|
||||||
|
"^/homura",
|
||||||
|
"^/Homura",
|
||||||
|
"^/mirai",
|
||||||
|
"^/Mirai",
|
||||||
|
"^/yomi",
|
||||||
|
"^/Yomi"},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
local _file_values = './data/values.lua'
|
|
||||||
|
|
||||||
function save_value(chat, text )
|
|
||||||
var_name, var_value = string.match(text, "!set (%a+) (.+)")
|
|
||||||
if (var_name == nil or var_value == nil) then
|
|
||||||
return "Usage: !set var_name value"
|
|
||||||
end
|
|
||||||
if _values[chat] == nil then
|
|
||||||
_values[chat] = {}
|
|
||||||
end
|
|
||||||
_values[chat][var_name] = var_value
|
|
||||||
|
|
||||||
-- Save values to file
|
|
||||||
serialize_to_file(_values, _file_values)
|
|
||||||
|
|
||||||
return "Saved "..var_name.." = "..var_value
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
local chat_id = tostring(msg.to.id)
|
|
||||||
local text = save_value(chat_id, msg.text)
|
|
||||||
return text
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Plugin for saving values. get.lua plugin is necesary to retrieve them.",
|
|
||||||
usage = "!set [value_name] [data]: Saves the data with the value_name name.",
|
|
||||||
patterns = {"^!set (%a+) (.+)$"},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
38
plugins/sh.lua
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
function run_sh(msg)
|
||||||
|
name = get_name(msg)
|
||||||
|
text = ''
|
||||||
|
bash = msg.text:sub(4,-1)
|
||||||
|
text = run_bash(bash)
|
||||||
|
return text
|
||||||
|
end
|
||||||
|
|
||||||
|
function run_bash(str)
|
||||||
|
local cmd = io.popen(str)
|
||||||
|
local result = cmd:read('*all')
|
||||||
|
cmd:close()
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
local receiver = get_receiver(msg)
|
||||||
|
if string.starts(msg.text, '/sh') then
|
||||||
|
text = run_sh(msg)
|
||||||
|
send_msg(receiver, text, ok_cb, false)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if string.starts(msg.text, '/uptime') then
|
||||||
|
text = run_bash('uptime')
|
||||||
|
send_msg(receiver, text, ok_cb, false)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Führt Befehle in der Konsole aus",
|
||||||
|
usage = "",
|
||||||
|
patterns = {"^/uptime", "^/sh (.*)$"},
|
||||||
|
run = run,
|
||||||
|
privileged = true
|
||||||
|
}
|
@ -104,10 +104,10 @@ end
|
|||||||
_stats = read_file_stats()
|
_stats = read_file_stats()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Plugin to update user stats.",
|
description = "",
|
||||||
usage = "!stats: Returns a list of Username [telegram_id]: msg_num",
|
usage = "",
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!(stats)",
|
"^/(stats)",
|
||||||
".*"
|
".*"
|
||||||
},
|
},
|
||||||
run = run,
|
run = run,
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
-- See https://wiki.teamfortress.com/wiki/User:RJackson/StorefrontAPI
|
-- See https://wiki.teamfortress.com/wiki/User:RJackson/StorefrontAPI
|
||||||
|
|
||||||
do
|
do
|
||||||
@ -28,8 +29,8 @@ end
|
|||||||
function send_steam_data(data, receiver)
|
function send_steam_data(data, receiver)
|
||||||
local description = string.sub(unescape(data.about_the_game:gsub("%b<>", "")), 1, DESC_LENTH) .. '...'
|
local description = string.sub(unescape(data.about_the_game:gsub("%b<>", "")), 1, DESC_LENTH) .. '...'
|
||||||
local title = data.name
|
local title = data.name
|
||||||
local price = "$"..(data.price_overview.initial/100)
|
local price = "€"..(data.price_overview.initial/100)
|
||||||
local sale_price = "$"..(data.price_overview.final/100)
|
local sale_price = "€"..(data.price_overview.final/100)
|
||||||
local percent_savings = data.price_overview.discount_percent
|
local percent_savings = data.price_overview.discount_percent
|
||||||
local price_display = price
|
local price_display = price
|
||||||
|
|
||||||
|
21
plugins/stille.lua
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
do
|
||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
local answers = {'Ja, es ist sehr ruhig hier','Wenn es dir zu still ist, kannst du gerne mit mir reden','*SCHREI*',
|
||||||
|
'Dann mach doch etwas dagegen!','Möpse?','Vermutlich schlafen alle',
|
||||||
|
'Stört dich die Stille?','Nein, es ist nicht still','Nyu?',
|
||||||
|
'Besser als Spam','Stille ist schön',
|
||||||
|
'Mein Name ist Mikubot','Spiel doch etwas http://curvefever.com/',
|
||||||
|
'Stille sagt manchmal mehr als tausend Worte','Stille und Nacht sind untrennbar verwoben. Die Nacht ist die Stille unter den Sternen.'}
|
||||||
|
return answers[math.random(#answers)]
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Es ist so still hier",
|
||||||
|
usage = "stille",
|
||||||
|
patterns = {"^Stille",
|
||||||
|
"^stille"},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
|
||||||
|
end
|
100
plugins/time.lua
@ -1,100 +0,0 @@
|
|||||||
-- Implement a command !time [area] which uses
|
|
||||||
-- 2 Google APIs to get the desired result:
|
|
||||||
-- 1. Geocoding to get from area to a lat/long pair
|
|
||||||
-- 2. Timezone to get the local time in that lat/long location
|
|
||||||
|
|
||||||
-- Globals
|
|
||||||
-- If you have a google api key for the geocoding/timezone api
|
|
||||||
api_key = nil
|
|
||||||
|
|
||||||
base_api = "https://maps.googleapis.com/maps/api"
|
|
||||||
dateFormat = "%A %d %B - %H:%M:%S"
|
|
||||||
|
|
||||||
-- Need the utc time for the google api
|
|
||||||
function utctime()
|
|
||||||
return os.time(os.date("!*t"))
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Use the geocoding api to get the lattitude and longitude with accuracy specifier
|
|
||||||
-- CHECKME: this seems to work without a key??
|
|
||||||
function get_latlong(area)
|
|
||||||
local api = base_api .. "/geocode/json?"
|
|
||||||
local parameters = "address=".. (URL.escape(area) or "")
|
|
||||||
if api_key ~= nil then
|
|
||||||
parameters = parameters .. "&key="..api_key
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Do the request
|
|
||||||
local res, code = https.request(api..parameters)
|
|
||||||
if code ~=200 then return nil end
|
|
||||||
local data = json:decode(res)
|
|
||||||
|
|
||||||
if (data.status == "ZERO_RESULTS") then
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
if (data.status == "OK") then
|
|
||||||
-- Get the data
|
|
||||||
lat = data.results[1].geometry.location.lat
|
|
||||||
lng = data.results[1].geometry.location.lng
|
|
||||||
acc = data.results[1].geometry.location_type
|
|
||||||
types= data.results[1].types
|
|
||||||
return lat,lng,acc,types
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Use timezone api to get the time in the lat,
|
|
||||||
-- Note: this needs an API key
|
|
||||||
function get_time(lat,lng)
|
|
||||||
local api = base_api .. "/timezone/json?"
|
|
||||||
|
|
||||||
-- Get a timestamp (server time is relevant here)
|
|
||||||
local timestamp = utctime()
|
|
||||||
local parameters = "location=" ..
|
|
||||||
URL.escape(lat) .. "," ..
|
|
||||||
URL.escape(lng) ..
|
|
||||||
"×tamp="..URL.escape(timestamp)
|
|
||||||
if api_key ~=nil then
|
|
||||||
parameters = parameters .. "&key="..api_key
|
|
||||||
end
|
|
||||||
|
|
||||||
local res,code = https.request(api..parameters)
|
|
||||||
if code ~= 200 then return nil end
|
|
||||||
local data = json:decode(res)
|
|
||||||
|
|
||||||
if (data.status == "ZERO_RESULTS") then
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
if (data.status == "OK") then
|
|
||||||
-- Construct what we want
|
|
||||||
-- The local time in the location is:
|
|
||||||
-- timestamp + rawOffset + dstOffset
|
|
||||||
local localTime = timestamp + data.rawOffset + data.dstOffset
|
|
||||||
return localTime, data.timeZoneId
|
|
||||||
end
|
|
||||||
return localTime
|
|
||||||
end
|
|
||||||
|
|
||||||
function getformattedLocalTime(area)
|
|
||||||
if area == nil then
|
|
||||||
return "The time in nowhere is never"
|
|
||||||
end
|
|
||||||
|
|
||||||
lat,lng,acc = get_latlong(area)
|
|
||||||
if lat == nil and lng == nil then
|
|
||||||
return 'It seems that in "'..area..'" they do not have a concept of time.'
|
|
||||||
end
|
|
||||||
local localTime, timeZoneId = get_time(lat,lng)
|
|
||||||
|
|
||||||
return "The local time in "..timeZoneId.." is: ".. os.date(dateFormat,localTime)
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
return getformattedLocalTime(matches[1])
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Displays the local time in an area",
|
|
||||||
usage = "!time [area]: Displays the local time in that area",
|
|
||||||
patterns = {"^!time (.*)$"},
|
|
||||||
run = run
|
|
||||||
}
|
|
@ -1,81 +0,0 @@
|
|||||||
|
|
||||||
--[[
|
|
||||||
-- Translate text using Google Translate.
|
|
||||||
-- http://translate.google.com/translate_a/t?client=z&ie=UTF-8&oe=UTF-8&hl=en&tl=en&text=hello
|
|
||||||
--]]
|
|
||||||
do
|
|
||||||
|
|
||||||
function translate(source_lang, target_lang, text)
|
|
||||||
local path = "http://translate.google.com/translate_a/t"
|
|
||||||
-- URL query parameters
|
|
||||||
local params = {
|
|
||||||
client = "z", -- JSON
|
|
||||||
ie = "UTF-8",
|
|
||||||
oe = "UTF-8",
|
|
||||||
hl = "en",
|
|
||||||
tl = target_lang or "en",
|
|
||||||
sl = source_lang or "",
|
|
||||||
text = URL.escape(text)
|
|
||||||
}
|
|
||||||
|
|
||||||
local query = format_http_params(params, true)
|
|
||||||
local url = path..query
|
|
||||||
|
|
||||||
local res, code = https.request(url)
|
|
||||||
-- Return nil if error
|
|
||||||
if code > 200 then return nil end
|
|
||||||
|
|
||||||
local trans = json:decode(res)
|
|
||||||
|
|
||||||
local sentences = ""
|
|
||||||
-- Join multiple sencentes
|
|
||||||
for k,sentence in pairs(trans.sentences) do
|
|
||||||
sentences = sentences..sentence.trans..'\n'
|
|
||||||
end
|
|
||||||
|
|
||||||
return sentences
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
-- Third pattern
|
|
||||||
if #matches == 1 then
|
|
||||||
print("First")
|
|
||||||
local text = matches[1]
|
|
||||||
return translate(nil, nil, text)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Second pattern
|
|
||||||
if #matches == 2 then
|
|
||||||
print("Second")
|
|
||||||
local target = matches[1]
|
|
||||||
local text = matches[2]
|
|
||||||
return translate(nil, target, text)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Frist pattern
|
|
||||||
if #matches == 3 then
|
|
||||||
print("Third")
|
|
||||||
local source = matches[1]
|
|
||||||
local target = matches[2]
|
|
||||||
local text = matches[3]
|
|
||||||
return translate(source, target, text)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Translate some text",
|
|
||||||
usage = {
|
|
||||||
"!translate text. Translate to english the text.",
|
|
||||||
"!translate target_lang text.",
|
|
||||||
"!translate source,target text",
|
|
||||||
},
|
|
||||||
patterns = {
|
|
||||||
"^!translate ([%w]+),([%a]+) (.+)",
|
|
||||||
"^!translate ([%w]+) (.+)",
|
|
||||||
"^!translate (.+)",
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
@ -1,74 +0,0 @@
|
|||||||
local OAuth = require "OAuth"
|
|
||||||
|
|
||||||
local consumer_key = ""
|
|
||||||
local consumer_secret = ""
|
|
||||||
local access_token = ""
|
|
||||||
local 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 run(msg, matches)
|
|
||||||
|
|
||||||
if consumer_key:isempty() then
|
|
||||||
return "Twitter Consumer Key is empty, write it in plugins/twitter.lua"
|
|
||||||
end
|
|
||||||
if consumer_secret:isempty() then
|
|
||||||
return "Twitter Consumer Secret is empty, write it in plugins/twitter.lua"
|
|
||||||
end
|
|
||||||
if access_token:isempty() then
|
|
||||||
return "Twitter Access Token is empty, write it in plugins/twitter.lua"
|
|
||||||
end
|
|
||||||
if access_token_secret:isempty() then
|
|
||||||
return "Twitter Access Token Secret is empty, write it in plugins/twitter.lua"
|
|
||||||
end
|
|
||||||
|
|
||||||
local twitter_url = "https://api.twitter.com/1.1/statuses/show/" .. matches[1] .. ".json"
|
|
||||||
local response_code, response_headers, response_status_line, response_body = client:PerformRequest("GET", twitter_url)
|
|
||||||
local response = json:decode(response_body)
|
|
||||||
|
|
||||||
local header = "Tweet from " .. response.user.name .. " (@" .. response.user.screen_name .. ")\n"
|
|
||||||
local text = response.text
|
|
||||||
|
|
||||||
-- replace short URLs
|
|
||||||
if response.entities.url then
|
|
||||||
for k, v in pairs(response.entities.urls) do
|
|
||||||
local short = v.url
|
|
||||||
local long = v.expanded_url
|
|
||||||
text = text:gsub(short, long)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- remove images
|
|
||||||
local images = {}
|
|
||||||
if response.extended_entities and response.extended_entities.media then
|
|
||||||
for k, v in pairs(response.extended_entities.media) do
|
|
||||||
local url = v.url
|
|
||||||
local pic = v.media_url
|
|
||||||
text = text:gsub(url, "")
|
|
||||||
table.insert(images, pic)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- send the parts
|
|
||||||
local receiver = get_receiver(msg)
|
|
||||||
send_msg(receiver, header .. "\n" .. text, ok_cb, false)
|
|
||||||
send_photos_from_url(receiver, images)
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "When user sends twitter URL, send text and images to origin. Requieres OAuth Key.",
|
|
||||||
usage = "",
|
|
||||||
patterns = {
|
|
||||||
"https://twitter.com/[^/]+/status/([0-9]+)"
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
local OAuth = require "OAuth"
|
|
||||||
|
|
||||||
local consumer_key = ""
|
|
||||||
local consumer_secret = ""
|
|
||||||
local access_token = ""
|
|
||||||
local 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 run(msg, matches)
|
|
||||||
if consumer_key:isempty() then
|
|
||||||
return "Twitter Consumer Key is empty, write it in plugins/twitter_send.lua"
|
|
||||||
end
|
|
||||||
if consumer_secret:isempty() then
|
|
||||||
return "Twitter Consumer Secret is empty, write it in plugins/twitter_send.lua"
|
|
||||||
end
|
|
||||||
if access_token:isempty() then
|
|
||||||
return "Twitter Access Token is empty, write it in plugins/twitter_send.lua"
|
|
||||||
end
|
|
||||||
if access_token_secret:isempty() then
|
|
||||||
return "Twitter Access Token Secret is empty, write it in plugins/twitter_send.lua"
|
|
||||||
end
|
|
||||||
|
|
||||||
if not is_sudo(msg) then
|
|
||||||
return "You aren't allowed to send tweets"
|
|
||||||
end
|
|
||||||
|
|
||||||
local response_code, response_headers, response_status_line, response_body =
|
|
||||||
client:PerformRequest("POST", "https://api.twitter.com/1.1/statuses/update.json", {
|
|
||||||
status = matches[1]
|
|
||||||
})
|
|
||||||
if response_code ~= 200 then
|
|
||||||
return "Error: "..response_code
|
|
||||||
end
|
|
||||||
return "Tweet sended"
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Sends a tweet",
|
|
||||||
usage = "!tw [text]: Sends the Tweet with the configured accout.",
|
|
||||||
patterns = {"^!tw (.+)"},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
47
plugins/url_title.lua
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
do
|
||||||
|
|
||||||
|
function getTitle(page)
|
||||||
|
local s = page
|
||||||
|
|
||||||
|
-- Remove optional spaces from the tags.
|
||||||
|
s = string.gsub(s, "\n", " ")
|
||||||
|
s = string.gsub(s, " *< *", "<")
|
||||||
|
s = string.gsub(s, " *> *", ">")
|
||||||
|
|
||||||
|
-- Put all the tags in lowercase.
|
||||||
|
s = string.gsub(s, "(<[^ >]+)", string.lower)
|
||||||
|
|
||||||
|
local i, f, t = string.find(s, "<title>(.+)</title>")
|
||||||
|
return t or ""
|
||||||
|
end
|
||||||
|
|
||||||
|
function string.ends(str, fin)
|
||||||
|
return fin=='' or string.sub(str,-string.len(fin)) == fin
|
||||||
|
end
|
||||||
|
|
||||||
|
function run(msg, matches)
|
||||||
|
local url = matches[1]
|
||||||
|
if string.ends(url, ".jpg") or string.ends(url, ".gif") or string.ends(url, ".png") then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local result = http.request(url)
|
||||||
|
local title = getTitle(result)
|
||||||
|
|
||||||
|
-- We don't want 301 (and one Extrawurst for Google), 302, 404 and empty titles
|
||||||
|
if title == "301 Moved Permanently" or title == "" or title == "404 Not Found" or title == "302 Found" or title == "Moved Permanently" then
|
||||||
|
print('Invalide, da "'..title..'"')
|
||||||
|
else
|
||||||
|
return title
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Postet URL-Titel",
|
||||||
|
usage = "",
|
||||||
|
patterns = {
|
||||||
|
"(https?://[%w-_%.%?%.:/%+=&]+)$",
|
||||||
|
},
|
||||||
|
run = run
|
||||||
|
}
|
||||||
|
|
||||||
|
end
|
@ -1,16 +1,14 @@
|
|||||||
do
|
do
|
||||||
|
|
||||||
function run(msg, matches)
|
function run(msg, matches)
|
||||||
return 'Telegram Bot '.. VERSION .. [[
|
return 'Mikubot '.. VERSION ..' by Akamaru'
|
||||||
Checkout http://git.io/6jdjGg
|
|
||||||
GNU GPL v2 license.]]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description = "Shows bot version",
|
description = "Zeigt die Bot Version",
|
||||||
usage = "!version: Shows bot version",
|
usage = "/version",
|
||||||
patterns = {
|
patterns = {
|
||||||
"^!version$"
|
"^/version$"
|
||||||
},
|
},
|
||||||
run = run
|
run = run
|
||||||
}
|
}
|
||||||
|
@ -1,88 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
local _file_votes = './data/votes.lua'
|
|
||||||
|
|
||||||
function read_file_votes ()
|
|
||||||
local f = io.open(_file_votes, "r+")
|
|
||||||
if f == nil then
|
|
||||||
print ('Created voting file '.._file_votes)
|
|
||||||
serialize_to_file({}, _file_votes)
|
|
||||||
else
|
|
||||||
print ('Values loaded: '.._file_votes)
|
|
||||||
f:close()
|
|
||||||
end
|
|
||||||
return loadfile (_file_votes)()
|
|
||||||
end
|
|
||||||
|
|
||||||
function clear_votes (chat)
|
|
||||||
local _votes = read_file_votes ()
|
|
||||||
_votes [chat] = {}
|
|
||||||
serialize_to_file(_votes, _file_votes)
|
|
||||||
end
|
|
||||||
|
|
||||||
function votes_result (chat)
|
|
||||||
local _votes = read_file_votes ()
|
|
||||||
local results = {}
|
|
||||||
local result_string = ""
|
|
||||||
if _votes [chat] == nil then
|
|
||||||
_votes[chat] = {}
|
|
||||||
end
|
|
||||||
for user,vote in pairs (_votes[chat]) do
|
|
||||||
if (results [vote] == nil) then
|
|
||||||
results [vote] = user
|
|
||||||
else
|
|
||||||
results [vote] = results [vote] .. ", " .. user
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for vote,users in pairs (results) do
|
|
||||||
result_string = result_string .. vote .. " : " .. users .. "\n"
|
|
||||||
end
|
|
||||||
return result_string
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
function save_vote(chat, user, vote)
|
|
||||||
local _votes = read_file_votes ()
|
|
||||||
if _votes[chat] == nil then
|
|
||||||
_votes[chat] = {}
|
|
||||||
end
|
|
||||||
_votes[chat][user] = vote
|
|
||||||
|
|
||||||
serialize_to_file(_votes, _file_votes)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
if (matches[1] == "ing") then
|
|
||||||
if (matches [2] == "reset") then
|
|
||||||
clear_votes (tostring(msg.to.id))
|
|
||||||
return "Voting statistics reset.."
|
|
||||||
elseif (matches [2] == "stats") then
|
|
||||||
local votes_result = votes_result (tostring(msg.to.id))
|
|
||||||
if (votes_result == "") then
|
|
||||||
votes_result = "[No votes registered]\n"
|
|
||||||
end
|
|
||||||
return "Voting statistics :\n" .. votes_result
|
|
||||||
end
|
|
||||||
else
|
|
||||||
save_vote(tostring(msg.to.id), msg.from.print_name, tostring(tonumber(matches[2])))
|
|
||||||
return "Vote registered : " .. msg.from.print_name .. " " .. tostring(tonumber(matches [2]))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "Plugin for voting in groups.",
|
|
||||||
usage = {
|
|
||||||
"!voting reset: Reset all the votes.",
|
|
||||||
"!vote [number]: Cast the vote.",
|
|
||||||
"!voting stats: Shows the statistics of voting."
|
|
||||||
},
|
|
||||||
patterns = {
|
|
||||||
"^!vot(ing) (reset)",
|
|
||||||
"^!vot(ing) (stats)",
|
|
||||||
"^!vot(e) ([0-9]+)$"
|
|
||||||
},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
13
plugins/wd.lua
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
function run(msg, matches)
|
||||||
|
local user_name = get_name(msg)
|
||||||
|
return "" .. user_name .. " ist wieder da"
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
description = "Sagt dass ihr wieder da seid",
|
||||||
|
usage = "/wd",
|
||||||
|
patterns = {
|
||||||
|
"^/wd(.*)$"
|
||||||
|
},
|
||||||
|
run = run
|
||||||
|
}
|
@ -1,45 +0,0 @@
|
|||||||
do
|
|
||||||
|
|
||||||
local BASE_URL = "http://api.openweathermap.org/data/2.5"
|
|
||||||
|
|
||||||
function get_weather(location)
|
|
||||||
print("Finding weather in ", location)
|
|
||||||
local b, c, h = http.request(BASE_URL.."/weather?q=" .. location .. "&units=metric")
|
|
||||||
local weather = json:decode(b)
|
|
||||||
print("Weather returns", weather)
|
|
||||||
local city = weather.name
|
|
||||||
local country = weather.sys.country
|
|
||||||
local temp = 'The temperature in ' .. city .. ' (' .. country .. ')'
|
|
||||||
temp = temp .. ' is ' .. weather.main.temp .. '°C'
|
|
||||||
conditions = 'Current conditions are: ' .. weather.weather[1].description
|
|
||||||
|
|
||||||
if weather.weather[1].main == 'Clear' then
|
|
||||||
conditions = conditions .. ' ☀'
|
|
||||||
elseif weather.weather[1].main == 'Clouds' then
|
|
||||||
conditions = conditions .. ' ☁☁'
|
|
||||||
elseif weather.weather[1].main == 'Rain' then
|
|
||||||
conditions = conditions .. ' ☔'
|
|
||||||
elseif weather.weather[1].main == 'Thunderstorm' then
|
|
||||||
conditions = conditions .. ' ☔☔☔☔'
|
|
||||||
end
|
|
||||||
|
|
||||||
return temp .. '\n' .. conditions
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(msg, matches)
|
|
||||||
if string.len(matches[1]) > 2 then
|
|
||||||
city = matches[1]
|
|
||||||
else
|
|
||||||
city = "Madrid,ES"
|
|
||||||
end
|
|
||||||
return get_weather(city)
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
description = "weather in that city (Madrid is default)",
|
|
||||||
usage = "!weather (city)",
|
|
||||||
patterns = {"^!weather(.*)$"},
|
|
||||||
run = run
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|