- Fix für Notify
- Restliche, überflüssige Plugins entfernt
This commit is contained in:
parent
47f6777cdc
commit
859988e93e
@ -1,80 +0,0 @@
|
||||
-- Put this absolutely at the end, even after greetings.lua.
|
||||
|
||||
local chatter = {}
|
||||
|
||||
local HTTP = require('socket.http')
|
||||
local URL = require('socket.url')
|
||||
local JSON = require('dkjson')
|
||||
local bindings = require('otouto.bindings')
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
function chatter:init(config)
|
||||
if not config.simsimi_key then
|
||||
print('Missing config value: simsimi_key.')
|
||||
print('chatter.lua will not be enabled.')
|
||||
return
|
||||
end
|
||||
|
||||
chatter.triggers = {
|
||||
''
|
||||
}
|
||||
end
|
||||
|
||||
chatter.base_url = 'http://%sapi.simsimi.com/request.p?key=%s&lc=%s&ft=1.0&text=%s'
|
||||
|
||||
function chatter:action(msg, config)
|
||||
|
||||
if msg.text == '' then return true end
|
||||
|
||||
if (
|
||||
not (
|
||||
msg.text_lower:match('^'..self.info.first_name:lower()..',')
|
||||
or msg.text_lower:match('^@'..self.info.username:lower()..',')
|
||||
or msg.from.id == msg.chat.id
|
||||
--Uncomment the following line for Al Gore-like conversation.
|
||||
--or (msg.reply_to_message and msg.reply_to_message.from.id == self.info.id)
|
||||
)
|
||||
or msg.text:match('^'..config.cmd_pat)
|
||||
or msg.text == ''
|
||||
) then
|
||||
return true
|
||||
end
|
||||
|
||||
bindings.sendChatAction(self, { action = 'typing' } )
|
||||
|
||||
local input = msg.text_lower:gsub(self.info.first_name, 'simsimi')
|
||||
input = input:gsub('@'..self.info.username, 'simsimi')
|
||||
|
||||
local sandbox = config.simsimi_trial and 'sandbox.' or ''
|
||||
|
||||
local url = chatter.base_url:format(sandbox, config.simsimi_key, config.lang, URL.escape(input))
|
||||
|
||||
local jstr, res = HTTP.request(url)
|
||||
if res ~= 200 then
|
||||
utilities.send_message(self, msg.chat.id, config.errors.chatter_connection)
|
||||
return
|
||||
end
|
||||
|
||||
local jdat = JSON.decode(jstr)
|
||||
if not jdat.response or jdat.response:match('^I HAVE NO RESPONSE.') then
|
||||
utilities.send_message(self, msg.chat.id, config.errors.chatter_response)
|
||||
return
|
||||
end
|
||||
local output = jdat.response
|
||||
|
||||
-- Clean up the response here.
|
||||
output = utilities.trim(output)
|
||||
-- Simsimi will often refer to itself. Replace "simsimi" with the bot name.
|
||||
output = output:gsub('%aimi?%aimi?', self.info.first_name)
|
||||
-- Self-explanatory.
|
||||
output = output:gsub('USER', msg.from.first_name)
|
||||
-- Capitalize the first letter.
|
||||
output = output:gsub('^%l', string.upper)
|
||||
-- Add a period if there is no punctuation.
|
||||
output = output:gsub('%P$', '%1.')
|
||||
|
||||
utilities.send_message(self, msg.chat.id, output)
|
||||
|
||||
end
|
||||
|
||||
return chatter
|
@ -1,430 +0,0 @@
|
||||
-- Commits from https://github.com/ngerakines/commitment.
|
||||
|
||||
local commit = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
commit.command = 'commit'
|
||||
commit.doc = '`Returns a commit message from whatthecommit.com.`'
|
||||
|
||||
function commit:init(config)
|
||||
commit.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('commit').table
|
||||
end
|
||||
|
||||
local commits = {
|
||||
"One does not simply merge into master",
|
||||
"Merging the merge",
|
||||
"Another bug bites the dust",
|
||||
"de-misunderestimating",
|
||||
"Some shit.",
|
||||
"add actual words",
|
||||
"I CAN HAZ COMMENTZ.",
|
||||
"giggle.",
|
||||
"Whatever.",
|
||||
"Finished fondling.",
|
||||
"FONDLED THE CODE",
|
||||
"this is how we generate our shit.",
|
||||
"unh",
|
||||
"It works!",
|
||||
"unionfind is no longer being molested.",
|
||||
"Well, it's doing something.",
|
||||
"I'M PUSHING.",
|
||||
"Whee.",
|
||||
"Whee, good night.",
|
||||
"It'd be nice if type errors caused the compiler to issue a type error",
|
||||
"Fucking templates.",
|
||||
"I hate this fucking language.",
|
||||
"marks",
|
||||
"that coulda been bad",
|
||||
"hoo boy",
|
||||
"It was the best of times, it was the worst of times",
|
||||
"Fucking egotistical bastard. adds expandtab to vimrc",
|
||||
"if you're not using et, fuck off",
|
||||
"WHO THE FUCK CAME UP WITH MAKE?",
|
||||
"This is a basic implementation that works.",
|
||||
"By works, I meant 'doesnt work'. Works now..",
|
||||
"Last time I said it works? I was kidding. Try this.",
|
||||
"Just stop reading these for a while, ok..",
|
||||
"Give me a break, it's 2am. But it works now.",
|
||||
"Make that it works in 90% of the cases. 3:30.",
|
||||
"Ok, 5am, it works. For real.",
|
||||
"FOR REAL.",
|
||||
"I don't know what these changes are supposed to accomplish but somebody told me to make them.",
|
||||
"I don't get paid enough for this shit.",
|
||||
"fix some fucking errors",
|
||||
"first blush",
|
||||
"So my boss wanted this button ...",
|
||||
"uhhhhhh",
|
||||
"forgot we're not using a smart language",
|
||||
"include shit",
|
||||
"To those I leave behind, good luck!",
|
||||
"things occurred",
|
||||
"i dunno, maybe this works",
|
||||
"8==========D",
|
||||
"No changes made",
|
||||
"whooooooooooooooooooooooooooo",
|
||||
"clarify further the brokenness of C++. why the fuck are we using C++?",
|
||||
".",
|
||||
"Friday 5pm",
|
||||
"changes",
|
||||
"A fix I believe, not like I tested or anything",
|
||||
"Useful text",
|
||||
"pgsql is being a pain",
|
||||
"pgsql is more strict, increase the hackiness up to 11",
|
||||
"c&p fail",
|
||||
"syntax",
|
||||
"fix",
|
||||
"just shoot me",
|
||||
"arrrggghhhhh fixed!",
|
||||
"someone fails and it isn't me",
|
||||
"totally more readable",
|
||||
"better grepping",
|
||||
"fix",
|
||||
"fix bug, for realz",
|
||||
"fix /sigh",
|
||||
"Does this work",
|
||||
"MOAR BIFURCATION",
|
||||
"bifurcation",
|
||||
"REALLY FUCKING FIXED",
|
||||
"FIX",
|
||||
"better ignores",
|
||||
"More ignore",
|
||||
"more ignores",
|
||||
"more ignores",
|
||||
"more ignores",
|
||||
"more ignores",
|
||||
"more ignores",
|
||||
"more ignored words",
|
||||
"more fixes",
|
||||
"really ignore ignored worsd",
|
||||
"fixes",
|
||||
"/sigh",
|
||||
"fix",
|
||||
"fail",
|
||||
"pointless limitation",
|
||||
"omg what have I done?",
|
||||
"added super-widget 2.0.",
|
||||
"tagging release w.t.f.",
|
||||
"I can't believe it took so long to fix this.",
|
||||
"I must have been drunk.",
|
||||
"This is why the cat shouldn't sit on my keyboard.",
|
||||
"This is why git rebase is a horrible horrible thing.",
|
||||
"ajax-loader hotness, oh yeah",
|
||||
"small is a real HTML tag, who knew.",
|
||||
"WTF is this.",
|
||||
"Do things better, faster, stronger",
|
||||
"Use a real JS construct, WTF knows why this works in chromium.",
|
||||
"Added a banner to the default admin page. Please have mercy on me =(",
|
||||
"needs more cow bell",
|
||||
"Switched off unit test X because the build had to go out now and there was no time to fix it properly.",
|
||||
"Updated",
|
||||
"I must sleep... it's working... in just three hours...",
|
||||
"I was wrong...",
|
||||
"Completed with no bugs...",
|
||||
"Fixed a little bug...",
|
||||
"Fixed a bug in NoteLineCount... not seriously...",
|
||||
"woa!! this one was really HARD!",
|
||||
"Made it to compile...",
|
||||
"changed things...",
|
||||
"touched...",
|
||||
"i think i fixed a bug...",
|
||||
"perfect...",
|
||||
"Moved something to somewhere... goodnight...",
|
||||
"oops, forgot to add the file",
|
||||
"Corrected mistakes",
|
||||
"oops",
|
||||
"oops!",
|
||||
"put code that worked where the code that didn't used to be",
|
||||
"Nothing to see here, move along",
|
||||
"I am even stupider than I thought",
|
||||
"I don't know what the hell I was thinking.",
|
||||
"fixed errors in the previous commit",
|
||||
"Committed some changes",
|
||||
"Some bugs fixed",
|
||||
"Minor updates",
|
||||
"Added missing file in previous commit",
|
||||
"bug fix",
|
||||
"typo",
|
||||
"bara bra grejjor",
|
||||
"Continued development...",
|
||||
"Does anyone read this? I'll be at the coffee shop accross the street.",
|
||||
"That's just how I roll",
|
||||
"work in progress",
|
||||
"minor changes",
|
||||
"some brief changes",
|
||||
"assorted changes",
|
||||
"lots and lots of changes",
|
||||
"another big bag of changes",
|
||||
"lots of changes after a lot of time",
|
||||
"LOTS of changes. period",
|
||||
"Test commit. Please ignore",
|
||||
"I'm just a grunt. Don't blame me for this awful PoS.",
|
||||
"I did it for the lulz!",
|
||||
"I'll explain this when I'm sober .. or revert it",
|
||||
"Obligatory placeholder commit message",
|
||||
"A long time ago, in a galaxy far far away...",
|
||||
"Fixed the build.",
|
||||
"various changes",
|
||||
"One more time, but with feeling.",
|
||||
"Handled a particular error.",
|
||||
"Fixed unnecessary bug.",
|
||||
"Removed code.",
|
||||
"Added translation.",
|
||||
"Updated build targets.",
|
||||
"Refactored configuration.",
|
||||
"Locating the required gigapixels to render...",
|
||||
"Spinning up the hamster...",
|
||||
"Shovelling coal into the server...",
|
||||
"Programming the flux capacitor",
|
||||
"The last time I tried this the monkey didn't survive. Let's hope it works better this time.",
|
||||
"I should have had a V8 this morning.",
|
||||
"640K ought to be enough for anybody",
|
||||
"pay no attention to the man behind the curtain",
|
||||
"a few bits tried to escape, but we caught them",
|
||||
"Who has two thumbs and remembers the rudiments of his linear algebra courses? Apparently, this guy.",
|
||||
"workaround for ant being a pile of fail",
|
||||
"Don't push this commit",
|
||||
"rats",
|
||||
"squash me",
|
||||
"fixed mistaken bug",
|
||||
"Final commit, ready for tagging",
|
||||
"-m \'So I hear you like commits ...\'",
|
||||
"epic",
|
||||
"need another beer",
|
||||
"Well the book was obviously wrong.",
|
||||
"lolwhat?",
|
||||
"Another commit to keep my CAN streak going.",
|
||||
"I cannot believe that it took this long to write a test for this.",
|
||||
"TDD: 1, Me: 0",
|
||||
"Yes, I was being sarcastic.",
|
||||
"Apparently works-for-me is a crappy excuse.",
|
||||
"tl;dr",
|
||||
"I would rather be playing SC2.",
|
||||
"Crap. Tonight is raid night and I am already late.",
|
||||
"I know what I am doing. Trust me.",
|
||||
"You should have trusted me.",
|
||||
"Is there an award for this?",
|
||||
"Is there an achievement for this?",
|
||||
"I'm totally adding this to epic win. +300",
|
||||
"This really should not take 19 minutes to build.",
|
||||
"fixed the israeli-palestinian conflict",
|
||||
"SHIT ===> GOLD",
|
||||
"Committing in accordance with the prophecy.",
|
||||
"It compiles! Ship it!",
|
||||
"LOL!",
|
||||
"Reticulating splines...",
|
||||
"SEXY RUSSIAN CODES WAITING FOR YOU TO CALL",
|
||||
"s/import/include/",
|
||||
"extra debug for stuff module",
|
||||
"debug line test",
|
||||
"debugo",
|
||||
"remove debug<br/>all good",
|
||||
"debug suff",
|
||||
"more debug... who overwrote!",
|
||||
"these confounded tests drive me nuts",
|
||||
"For great justice.",
|
||||
"QuickFix.",
|
||||
"oops - thought I got that one.",
|
||||
"removed echo and die statements, lolz.",
|
||||
"somebody keeps erasing my changes.",
|
||||
"doh.",
|
||||
"pam anderson is going to love me.",
|
||||
"added security.",
|
||||
"arrgghh... damn this thing for not working.",
|
||||
"jobs... steve jobs",
|
||||
"and a comma",
|
||||
"this is my quickfix branch and i will use to do my quickfixes",
|
||||
"Fix my stupidness",
|
||||
"and so the crazy refactoring process sees the sunlight after some months in the dark!",
|
||||
"gave up and used tables.",
|
||||
"[Insert your commit message here. Be sure to make it descriptive.]",
|
||||
"Removed test case since code didn't pass QA",
|
||||
"removed tests since i can't make them green",
|
||||
"stuff",
|
||||
"more stuff",
|
||||
"Become a programmer, they said. It'll be fun, they said.",
|
||||
"Same as last commit with changes",
|
||||
"foo",
|
||||
"just checking if git is working properly...",
|
||||
"fixed some minor stuff, might need some additional work.",
|
||||
"just trolling the repo",
|
||||
"All your codebase are belong to us.",
|
||||
"Somebody set up us the bomb.",
|
||||
"should work I guess...",
|
||||
"To be honest, I do not quite remember everything I changed here today. But it is all good, I tell ya.",
|
||||
"well crap.",
|
||||
"herpderp (redux)",
|
||||
"herpderp",
|
||||
"Derp",
|
||||
"derpherp",
|
||||
"Herping the derp",
|
||||
"sometimes you just herp the derp so hard it herpderps",
|
||||
"Derp. Fix missing constant post rename",
|
||||
"Herping the fucking derp right here and now.",
|
||||
"Derp, asset redirection in dev mode",
|
||||
"mergederp",
|
||||
"Derp search/replace fuckup",
|
||||
"Herpy dooves.",
|
||||
"Derpy hooves",
|
||||
"derp, helper method rename",
|
||||
"Herping the derp derp (silly scoping error)",
|
||||
"Herp derp I left the debug in there and forgot to reset errors.",
|
||||
"Reset error count between rows. herpderp",
|
||||
"hey, what's that over there?!",
|
||||
"hey, look over there!",
|
||||
"It worked for me...",
|
||||
"Does not work.",
|
||||
"Either Hot Shit or Total Bollocks",
|
||||
"Arrrrgggg",
|
||||
"Don’t mess with Voodoo",
|
||||
"I expected something different.",
|
||||
"Todo!!!",
|
||||
"This is supposed to crash",
|
||||
"No changes after this point.",
|
||||
"I know, I know, this is not how I’m supposed to do it, but I can't think of something better.",
|
||||
"Don’t even try to refactor it.",
|
||||
"(c) Microsoft 1988",
|
||||
"Please no changes this time.",
|
||||
"Why The Fuck?",
|
||||
"We should delete this crap before shipping.",
|
||||
"Shit code!",
|
||||
"ALL SORTS OF THINGS",
|
||||
"Herpderp, shoulda check if it does really compile.",
|
||||
"I CAN HAZ PYTHON, I CAN HAZ INDENTS",
|
||||
"Major fixup.",
|
||||
"less french words",
|
||||
"breathe, =, breathe",
|
||||
"IEize",
|
||||
"this doesn't really make things faster, but I tried",
|
||||
"this should fix it",
|
||||
"forgot to save that file",
|
||||
"Glue. Match sticks. Paper. Build script!",
|
||||
"Argh! About to give up :(",
|
||||
"Blaming regex.",
|
||||
"oops",
|
||||
"it's friday",
|
||||
"yo recipes",
|
||||
"Not sure why",
|
||||
"lol digg",
|
||||
"grrrr",
|
||||
"For real, this time.",
|
||||
"Feed. You. Stuff. No time.",
|
||||
"I don't give a damn 'bout my reputation",
|
||||
"DEAL WITH IT",
|
||||
"commit",
|
||||
"tunning",
|
||||
"I really should've committed this when I finished it...",
|
||||
"It's getting hard to keep up with the crap I've trashed",
|
||||
"I honestly wish I could remember what was going on here...",
|
||||
"I must enjoy torturing myself",
|
||||
"For the sake of my sanity, just ignore this...",
|
||||
"That last commit message about silly mistakes pales in comparision to this one",
|
||||
"My bad",
|
||||
"Still can't get this right...",
|
||||
"Nitpicking about alphabetizing methods, minor OCD thing",
|
||||
"Committing fixes in the dark, seriously, who killed my power!?",
|
||||
"You can't see it, but I'm making a very angry face right now",
|
||||
"Fix the fixes",
|
||||
"It's secret!",
|
||||
"Commit committed....",
|
||||
"No time to commit.. My people need me!",
|
||||
"Something fixed",
|
||||
"I'm hungry",
|
||||
"asdfasdfasdfasdfasdfasdfadsf",
|
||||
"hmmm",
|
||||
"formatted all",
|
||||
"Replace all whitespaces with tabs.",
|
||||
"s/ / /g",
|
||||
"I'm too foo for this bar",
|
||||
"Things went wrong...",
|
||||
"??! what the ...",
|
||||
"This solves it.",
|
||||
"Working on tests (haha)",
|
||||
"fixed conflicts (LOL merge -s ours; push -f)",
|
||||
"last minute fixes.",
|
||||
"fuckup.",
|
||||
"Revert \"fuckup\".",
|
||||
"should work now.",
|
||||
"final commit.",
|
||||
"done. going to bed now.",
|
||||
"buenas those-things.",
|
||||
"Your commit is writing checks your merge can't cash.",
|
||||
"This branch is so dirty, even your mom can't clean it.",
|
||||
"wip",
|
||||
"Revert \"just testing, remember to revert\"",
|
||||
"bla",
|
||||
"harharhar",
|
||||
"restored deleted entities just to be sure",
|
||||
"added some filthy stuff",
|
||||
"bugger",
|
||||
"lol",
|
||||
"oopsie B|",
|
||||
"Copy pasta fail. still had a instead of a",
|
||||
"Now added delete for real",
|
||||
"grmbl",
|
||||
"move your body every every body",
|
||||
"Trying to fake a conflict",
|
||||
"And a commit that I don't know the reason of...",
|
||||
"ffs",
|
||||
"that's all folks",
|
||||
"Fucking submodule bull shit",
|
||||
"apparently i did something…",
|
||||
"bump to 0.0.3-dev:wq",
|
||||
"pep8 - cause I fell like doing a barrel roll",
|
||||
"pep8 fixer",
|
||||
"it is hump day _^_",
|
||||
"happy monday _ bleh _",
|
||||
"after of this commit remember do a git reset hard",
|
||||
"someday I gonna kill someone for this shit...",
|
||||
"magic, have no clue but it works",
|
||||
"I am sorry",
|
||||
"dirty hack, have a better idea ?",
|
||||
"Code was clean until manager requested to fuck it up",
|
||||
" - Temporary commit.",
|
||||
":(:(",
|
||||
"...",
|
||||
"GIT :/",
|
||||
"stopped caring 10 commits ago",
|
||||
"Testing in progress ;)",
|
||||
"Fixed Bug",
|
||||
"Fixed errors",
|
||||
"Push poorly written test can down the road another ten years",
|
||||
"commented out failing tests",
|
||||
"I'm human",
|
||||
"TODO: write meaningful commit message",
|
||||
"Pig",
|
||||
"SOAP is a piece of shit",
|
||||
"did everything",
|
||||
"project lead is allergic to changes...",
|
||||
"making this thing actually usable.",
|
||||
"I was told to leave it alone, but I have this thing called OCD, you see",
|
||||
"Whatever will be, will be 8{",
|
||||
"It's 2015; why are we using ColdFusion?!",
|
||||
"#GrammarNazi",
|
||||
"Future self, please forgive me and don't hit me with the baseball bat again!",
|
||||
"Hide those navs, boi!",
|
||||
"Who knows...",
|
||||
"Who knows WTF?!",
|
||||
"I should get a raise for this.",
|
||||
"Done, to whoever merges this, good luck.",
|
||||
"Not one conflict, today was a good day.",
|
||||
"First Blood",
|
||||
"Fixed the fuck out of #526!",
|
||||
"I'm too old for this shit!",
|
||||
"One little whitespace gets its very own commit! Oh, life is so erratic!",
|
||||
"please dont let this be the problem",
|
||||
"good: no crash. bad: nothing happens",
|
||||
"trying",
|
||||
"trying harder",
|
||||
"i tried",
|
||||
"fml"
|
||||
}
|
||||
|
||||
function commit:action(msg)
|
||||
|
||||
local output = '`'..commits[math.random(#commits)]..'`'
|
||||
utilities.send_message(self, msg.chat.id, output, true, nil, true)
|
||||
|
||||
end
|
||||
|
||||
return commit
|
@ -1,51 +0,0 @@
|
||||
local dilbert = {}
|
||||
|
||||
local HTTP = require('socket.http')
|
||||
local URL = require('socket.url')
|
||||
local bindings = require('otouto.bindings')
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
dilbert.command = 'dilbert [date]'
|
||||
|
||||
function dilbert:init(config)
|
||||
dilbert.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('dilbert', true).table
|
||||
dilbert.doc = [[```
|
||||
]]..config.cmd_pat..[[dilbert [YYYY-MM-DD]
|
||||
Returns the latest Dilbert strip or that of the provided date.
|
||||
Dates before the first strip will return the first strip. Dates after the last trip will return the last strip.
|
||||
Source: dilbert.com
|
||||
```]]
|
||||
end
|
||||
|
||||
function dilbert:action(msg, config)
|
||||
|
||||
bindings.sendChatAction(self, { chat_id = msg.chat.id, action = 'upload_photo' } )
|
||||
|
||||
local input = utilities.input(msg.text)
|
||||
if not input then input = os.date('%F') end
|
||||
if not input:match('^%d%d%d%d%-%d%d%-%d%d$') then input = os.date('%F') end
|
||||
|
||||
local url = 'http://dilbert.com/strip/' .. URL.escape(input)
|
||||
local str, res = HTTP.request(url)
|
||||
if res ~= 200 then
|
||||
utilities.send_reply(self, msg, config.errors.connection)
|
||||
return
|
||||
end
|
||||
|
||||
local strip_filename = '/tmp/' .. input .. '.gif'
|
||||
local strip_file = io.open(strip_filename)
|
||||
if strip_file then
|
||||
strip_file:close()
|
||||
strip_file = strip_filename
|
||||
else
|
||||
local strip_url = str:match('<meta property="og:image" content="(.-)"/>')
|
||||
strip_file = utilities.download_file(strip_url, '/tmp/' .. input .. '.gif')
|
||||
end
|
||||
|
||||
local strip_title = str:match('<meta property="article:publish_date" content="(.-)"/>')
|
||||
|
||||
bindings.sendPhoto(self, { chat_id = msg.chat.id, caption = strip_title }, { photo = strip_file } )
|
||||
|
||||
end
|
||||
|
||||
return dilbert
|
@ -1,58 +0,0 @@
|
||||
local eightball = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
eightball.command = '8ball'
|
||||
eightball.doc = '`Returns an answer from a magic 8-ball!`'
|
||||
|
||||
function eightball:init(config)
|
||||
eightball.triggers = utilities.triggers(self.info.username, config.cmd_pat,
|
||||
{'[Yy]/[Nn]%p*$'}):t('8ball', true).table
|
||||
end
|
||||
|
||||
local ball_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.",
|
||||
"There is a time and place for everything, but not now."
|
||||
}
|
||||
|
||||
local yesno_answers = {
|
||||
'Absolutely.',
|
||||
'In your dreams.',
|
||||
'Yes.',
|
||||
'No.'
|
||||
}
|
||||
|
||||
function eightball:action(msg)
|
||||
|
||||
local output
|
||||
|
||||
if msg.text_lower:match('y/n%p?$') then
|
||||
output = yesno_answers[math.random(#yesno_answers)]
|
||||
else
|
||||
output = ball_answers[math.random(#ball_answers)]
|
||||
end
|
||||
|
||||
utilities.send_reply(self, msg, output)
|
||||
|
||||
end
|
||||
|
||||
return eightball
|
@ -1,31 +0,0 @@
|
||||
-- Requires that the "fortune" program is installed on your computer.
|
||||
|
||||
local fortune = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
function fortune:init(config)
|
||||
local s = io.popen('fortune'):read('*all')
|
||||
if s:match('not found$') then
|
||||
print('fortune is not installed on this computer.')
|
||||
print('fortune.lua will not be enabled.')
|
||||
return
|
||||
end
|
||||
|
||||
fortune.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('fortune').table
|
||||
end
|
||||
|
||||
fortune.command = 'fortune'
|
||||
fortune.doc = '`Returns a UNIX fortune.`'
|
||||
|
||||
function fortune:action(msg)
|
||||
|
||||
local fortunef = io.popen('fortune')
|
||||
local output = fortunef:read('*all')
|
||||
output = '```\n' .. output .. '\n```'
|
||||
utilities.send_message(self, msg.chat.id, output, true, nil, true)
|
||||
fortunef:close()
|
||||
|
||||
end
|
||||
|
||||
return fortune
|
@ -1,130 +0,0 @@
|
||||
-- Plugin for the Hearthstone database provided by hearthstonejson.com.
|
||||
|
||||
local hearthstone = {}
|
||||
|
||||
--local HTTPS = require('ssl.https')
|
||||
local JSON = require('dkjson')
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
function hearthstone:init(config)
|
||||
if not self.database.hearthstone or os.time() > self.database.hearthstone.expiration then
|
||||
|
||||
print('Downloading Hearthstone database...')
|
||||
|
||||
-- This stuff doesn't play well with lua-sec. Disable it for now; hack in curl.
|
||||
--local jstr, res = HTTPS.request('https://api.hearthstonejson.com/v1/latest/enUS/cards.json')
|
||||
--if res ~= 200 then
|
||||
-- print('Error connecting to hearthstonejson.com.')
|
||||
-- print('hearthstone.lua will not be enabled.')
|
||||
-- return
|
||||
--end
|
||||
--local jdat = JSON.decode(jstr)
|
||||
|
||||
local s = io.popen('curl -s https://api.hearthstonejson.com/v1/latest/enUS/cards.json'):read('*all')
|
||||
local d = JSON.decode(s)
|
||||
|
||||
if not d then
|
||||
print('Error connecting to hearthstonejson.com.')
|
||||
print('hearthstone.lua will not be enabled.')
|
||||
return
|
||||
end
|
||||
|
||||
self.database.hearthstone = d
|
||||
self.database.hearthstone.expiration = os.time() + 600000
|
||||
|
||||
print('Download complete! It will be stored for a week.')
|
||||
|
||||
end
|
||||
|
||||
hearthstone.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('hearthstone', true):t('hs').table
|
||||
hearthstone.doc = [[```
|
||||
]]..config.cmd_pat..[[hearthstone <query>
|
||||
Returns Hearthstone card info.
|
||||
Alias: ]]..config.cmd_pat..[[hs
|
||||
```]]
|
||||
end
|
||||
|
||||
hearthstone.command = 'hearthstone <query>'
|
||||
|
||||
local function format_card(card)
|
||||
|
||||
local ctype = card.type
|
||||
if card.race then
|
||||
ctype = card.race
|
||||
end
|
||||
if card.rarity then
|
||||
ctype = card.rarity .. ' ' .. ctype
|
||||
end
|
||||
if card.playerClass then
|
||||
ctype = ctype .. ' (' .. card.playerClass .. ')'
|
||||
elseif card.faction then
|
||||
ctype = ctype .. ' (' .. card.faction .. ')'
|
||||
end
|
||||
|
||||
local stats
|
||||
if card.cost then
|
||||
stats = card.cost .. 'c'
|
||||
if card.attack then
|
||||
stats = stats .. ' | ' .. card.attack .. 'a'
|
||||
end
|
||||
if card.health then
|
||||
stats = stats .. ' | ' .. card.health .. 'h'
|
||||
end
|
||||
if card.durability then
|
||||
stats = stats .. ' | ' .. card.durability .. 'd'
|
||||
end
|
||||
elseif card.health then
|
||||
stats = card.health .. 'h'
|
||||
end
|
||||
|
||||
-- unused?
|
||||
local info
|
||||
if card.text then
|
||||
info = card.text:gsub('</?.->',''):gsub('%$','')
|
||||
if card.flavor then
|
||||
info = info .. '\n_' .. card.flavor .. '_'
|
||||
end
|
||||
elseif card.flavor then
|
||||
info = card.flavor
|
||||
else
|
||||
info = nil
|
||||
end
|
||||
|
||||
local s = '*' .. card.name .. '*\n' .. ctype
|
||||
if stats then
|
||||
s = s .. '\n' .. stats
|
||||
end
|
||||
if info then
|
||||
s = s .. '\n' .. info
|
||||
end
|
||||
|
||||
return s
|
||||
|
||||
end
|
||||
|
||||
function hearthstone:action(msg, config)
|
||||
|
||||
local input = utilities.input(msg.text_lower)
|
||||
if not input then
|
||||
utilities.send_message(self, msg.chat.id, hearthstone.doc, true, msg.message_id, true)
|
||||
return
|
||||
end
|
||||
|
||||
local output = ''
|
||||
for _,v in pairs(self.database.hearthstone) do
|
||||
if type(v) == 'table' and string.lower(v.name):match(input) then
|
||||
output = output .. format_card(v) .. '\n\n'
|
||||
end
|
||||
end
|
||||
|
||||
output = utilities.trim(output)
|
||||
if output:len() == 0 then
|
||||
utilities.send_reply(self, msg, config.errors.results)
|
||||
return
|
||||
end
|
||||
|
||||
utilities.send_message(self, msg.chat.id, output, true, msg.message_id, true)
|
||||
|
||||
end
|
||||
|
||||
return hearthstone
|
@ -1,113 +0,0 @@
|
||||
-- TODO: Add support for librefm API.
|
||||
-- Just kidding, nobody actually uses that.
|
||||
|
||||
local lastfm = {}
|
||||
|
||||
local HTTP = require('socket.http')
|
||||
local URL = require('socket.url')
|
||||
local JSON = require('dkjson')
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
function lastfm:init(config)
|
||||
if not config.lastfm_api_key then
|
||||
print('Missing config value: lastfm_api_key.')
|
||||
print('lastfm.lua will not be enabled.')
|
||||
return
|
||||
end
|
||||
|
||||
lastfm.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('lastfm', true):t('np', true):t('fmset', true).table
|
||||
lastfm.doc = [[```
|
||||
]]..config.cmd_pat..[[np [username]
|
||||
Returns what you are or were last listening to. If you specify a username, info will be returned for that username.
|
||||
|
||||
]]..config.cmd_pat..[[fmset <username>
|
||||
Sets your last.fm username. Otherwise, ]]..config.cmd_pat..[[np will use your Telegram username. Use "]]..config.cmd_pat..[[fmset --" to delete it.
|
||||
```]]
|
||||
end
|
||||
|
||||
lastfm.command = 'lastfm'
|
||||
|
||||
function lastfm:action(msg, config)
|
||||
|
||||
local input = utilities.input(msg.text)
|
||||
local from_id_str = tostring(msg.from.id)
|
||||
self.database.userdata[from_id_str] = self.database.userdata[from_id_str] or {}
|
||||
|
||||
if string.match(msg.text, '^'..config.cmd_pat..'lastfm') then
|
||||
utilities.send_message(self, msg.chat.id, lastfm.doc, true, msg.message_id, true)
|
||||
return
|
||||
elseif string.match(msg.text, '^'..config.cmd_pat..'fmset') then
|
||||
if not input then
|
||||
utilities.send_message(self, msg.chat.id, lastfm.doc, true, msg.message_id, true)
|
||||
elseif input == '--' or input == utilities.char.em_dash then
|
||||
self.database.userdata[from_id_str].lastfm = nil
|
||||
utilities.send_reply(self, msg, 'Your last.fm username has been forgotten.')
|
||||
else
|
||||
self.database.userdata[from_id_str].lastfm = input
|
||||
utilities.send_reply(self, msg, 'Your last.fm username has been set to "' .. input .. '".')
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
local url = 'http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&format=json&limit=1&api_key=' .. config.lastfm_api_key .. '&user='
|
||||
|
||||
local username
|
||||
local alert = ''
|
||||
if input then
|
||||
username = input
|
||||
elseif self.database.userdata[from_id_str].lastfm then
|
||||
username = self.database.userdata[from_id_str].lastfm
|
||||
elseif msg.from.username then
|
||||
username = msg.from.username
|
||||
alert = '\n\nYour username has been set to ' .. username .. '.\nTo change it, use '..config.cmd_pat..'fmset <username>.'
|
||||
self.database.userdata[from_id_str].lastfm = username
|
||||
else
|
||||
utilities.send_reply(self, msg, 'Please specify your last.fm username or set it with '..config.cmd_pat..'fmset.')
|
||||
return
|
||||
end
|
||||
|
||||
url = url .. URL.escape(username)
|
||||
|
||||
local jstr, res
|
||||
utilities.with_http_timeout(
|
||||
1, function ()
|
||||
jstr, res = HTTP.request(url)
|
||||
end)
|
||||
if res ~= 200 then
|
||||
utilities.send_reply(self, msg, config.errors.connection)
|
||||
return
|
||||
end
|
||||
|
||||
local jdat = JSON.decode(jstr)
|
||||
if jdat.error then
|
||||
utilities.send_reply(self, msg, 'Please specify your last.fm username or set it with '..config.cmd_pat..'fmset.')
|
||||
return
|
||||
end
|
||||
|
||||
jdat = jdat.recenttracks.track[1] or jdat.recenttracks.track
|
||||
if not jdat then
|
||||
utilities.send_reply(self, msg, 'No history for this user.' .. alert)
|
||||
return
|
||||
end
|
||||
|
||||
local output = input or msg.from.first_name
|
||||
output = '🎵 ' .. output
|
||||
|
||||
if jdat['@attr'] and jdat['@attr'].nowplaying then
|
||||
output = output .. ' is currently listening to:\n'
|
||||
else
|
||||
output = output .. ' last listened to:\n'
|
||||
end
|
||||
|
||||
local title = jdat.name or 'Unknown'
|
||||
local artist = 'Unknown'
|
||||
if jdat.artist then
|
||||
artist = jdat.artist['#text']
|
||||
end
|
||||
|
||||
output = output .. title .. ' - ' .. artist .. alert
|
||||
utilities.send_message(self, msg.chat.id, output)
|
||||
|
||||
end
|
||||
|
||||
return lastfm
|
@ -1,42 +0,0 @@
|
||||
local me = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
function me:init(config)
|
||||
me.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('me', true).table
|
||||
me.command = 'me'
|
||||
me.doc = '`Returns userdata stored by the bot.`'
|
||||
end
|
||||
|
||||
function me:action(msg, config)
|
||||
|
||||
local userdata = self.database.userdata[tostring(msg.from.id)] or {}
|
||||
|
||||
if msg.from.id == config.admin then
|
||||
if msg.reply_to_message then
|
||||
userdata = self.database.userdata[tostring(msg.reply_to_message.from.id)]
|
||||
else
|
||||
local input = utilities.input(msg.text)
|
||||
if input then
|
||||
local user_id = utilities.id_from_username(self, input)
|
||||
if user_id then
|
||||
userdata = self.database.userdata[tostring(user_id)] or {}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local output = ''
|
||||
for k,v in pairs(userdata) do
|
||||
output = output .. '*' .. k .. ':* `' .. tostring(v) .. '`\n'
|
||||
end
|
||||
|
||||
if output == '' then
|
||||
output = 'There is no data stored for this user.'
|
||||
end
|
||||
|
||||
utilities.send_message(self, msg.chat.id, output, true, nil, true)
|
||||
|
||||
end
|
||||
|
||||
return me
|
@ -1,52 +0,0 @@
|
||||
local nick = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
nick.command = 'nick <nickname>'
|
||||
|
||||
function nick:init(config)
|
||||
nick.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('nick', true).table
|
||||
nick.doc = [[```
|
||||
]]..config.cmd_pat..[[nick <nickname>
|
||||
Set your nickname. Use "]]..config.cmd_pat..[[nick --" to delete it.
|
||||
```]]
|
||||
end
|
||||
|
||||
function nick:action(msg, config)
|
||||
|
||||
local id_str, name
|
||||
|
||||
if msg.from.id == config.admin and msg.reply_to_message then
|
||||
id_str = tostring(msg.reply_to_message.from.id)
|
||||
name = utilities.build_name(msg.reply_to_message.from.first_name, msg.reply_to_message.from.last_name)
|
||||
else
|
||||
id_str = tostring(msg.from.id)
|
||||
name = utilities.build_name(msg.from.first_name, msg.from.last_name)
|
||||
end
|
||||
|
||||
self.database.userdata[id_str] = self.database.userdata[id_str] or {}
|
||||
|
||||
local output
|
||||
local input = utilities.input(msg.text)
|
||||
if not input then
|
||||
if self.database.userdata[id_str].nickname then
|
||||
output = name .. '\'s nickname is "' .. self.database.userdata[id_str].nickname .. '".'
|
||||
else
|
||||
output = name .. ' currently has no nickname.'
|
||||
end
|
||||
elseif utilities.utf8_len(input) > 32 then
|
||||
output = 'The character limit for nicknames is 32.'
|
||||
elseif input == '--' or input == utilities.char.em_dash then
|
||||
self.database.userdata[id_str].nickname = nil
|
||||
output = name .. '\'s nickname has been deleted.'
|
||||
else
|
||||
input = input:gsub('\n', ' ')
|
||||
self.database.userdata[id_str].nickname = input
|
||||
output = name .. '\'s nickname has been set to "' .. input .. '".'
|
||||
end
|
||||
|
||||
utilities.send_reply(self, msg, output)
|
||||
|
||||
end
|
||||
|
||||
return nick
|
@ -61,7 +61,8 @@ end
|
||||
|
||||
function notify:action(msg, config, matches)
|
||||
if not msg.from.username then
|
||||
return 'Du hast keinen Usernamen und kannst daher dieses Feature nicht nutzen. Tut mir leid!'
|
||||
utilities.send_reply(self, msg, 'Du hast keinen Usernamen und kannst daher dieses Feature nicht nutzen. Tut mir leid!' )
|
||||
return
|
||||
end
|
||||
|
||||
local username = string.lower(msg.from.username)
|
||||
@ -92,7 +93,7 @@ function notify:action(msg, config, matches)
|
||||
redis:sadd('notify:ls', username)
|
||||
local res = utilities.send_message(self, msg.from.id, 'Du erhälst jetzt Benachrichtigungen, wenn du angesprochen wirst, nutze `/notify del` zum Deaktivieren.', true, nil, true)
|
||||
if not res then
|
||||
utilities.send_reply(self, msg, 'Bitte schreibe mir [privat](http://telegram.me/' .. self.info.username .. '?start=about), um den Vorgang abzuschließen.', true)
|
||||
utilities.send_reply(self, msg, 'Bitte schreibe mir [privat](http://telegram.me/' .. self.info.username .. '?start=notify), um den Vorgang abzuschließen.', true)
|
||||
elseif msg.chat.type ~= 'private' then
|
||||
utilities.send_reply(self, msg, 'Du erhälst jetzt Benachrichtigungen, wenn du angesprochen wirst, nutze `/notify del` zum Deaktivieren.', true)
|
||||
end
|
||||
|
@ -1,33 +0,0 @@
|
||||
local patterns = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
patterns.triggers = {
|
||||
'^/?s/.-/.-$'
|
||||
}
|
||||
|
||||
function patterns:action(msg)
|
||||
if not msg.reply_to_message then return true end
|
||||
local output = msg.reply_to_message.text
|
||||
if msg.reply_to_message.from.id == self.info.id then
|
||||
output = output:gsub('Did you mean:\n"', '')
|
||||
output = output:gsub('"$', '')
|
||||
end
|
||||
local m1, m2 = msg.text:match('^/?s/(.-)/(.-)/?$')
|
||||
if not m2 then return true end
|
||||
local res
|
||||
res, output = pcall(
|
||||
function()
|
||||
return output:gsub(m1, m2)
|
||||
end
|
||||
)
|
||||
if res == false then
|
||||
utilities.send_reply(self, msg, 'Malformed pattern!')
|
||||
else
|
||||
output = output:sub(1, 4000)
|
||||
output = 'Did you mean:\n"' .. output .. '"'
|
||||
utilities.send_reply(self, msg.reply_to_message, output)
|
||||
end
|
||||
end
|
||||
|
||||
return patterns
|
@ -1,16 +0,0 @@
|
||||
-- Actually the simplest plugin ever!
|
||||
|
||||
local ping = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
function ping:init(config)
|
||||
ping.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('ping'):t('annyong').table
|
||||
end
|
||||
|
||||
function ping:action(msg, config)
|
||||
local output = msg.text_lower:match('^'..config.cmd_pat..'ping') and 'Pong!' or 'Annyong.'
|
||||
utilities.send_message(self, msg.chat.id, output)
|
||||
end
|
||||
|
||||
return ping
|
@ -1,144 +0,0 @@
|
||||
local pun = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
pun.command = 'pun'
|
||||
pun.doc = '`Returns a pun.`'
|
||||
|
||||
function pun:init(config)
|
||||
pun.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('pun').table
|
||||
end
|
||||
|
||||
local puns = {
|
||||
"The person who invented the door-knock won the No-bell prize.",
|
||||
"I couldn't work out how to fasten my seatbelt. Then it clicked.",
|
||||
"Never trust atoms; they make up everything.",
|
||||
"Singing in the shower is all fun and games until you get shampoo in your mouth - Then it becomes a soap opera.",
|
||||
"I can't believe I got fired from the calendar factory. All I did was take a day off.",
|
||||
"To the guy who invented zero: Thanks for nothing!",
|
||||
"Enough with the cripple jokes! I just can't stand them.",
|
||||
"I've accidentally swallowed some Scrabble tiles. My next crap could spell disaster.",
|
||||
"How does Moses make his tea? Hebrews it.",
|
||||
"Did you hear about the guy who got hit in the head with a can of soda? He was lucky it was a soft drink.",
|
||||
"When William joined the army he disliked the phrase 'fire at will'.",
|
||||
"There was a sign on the lawn at a rehab center that said 'Keep off the Grass'.",
|
||||
"I wondered why the baseball was getting bigger. Then it hit me.",
|
||||
"I can hear music coming out of my printer. I think the paper's jamming again.",
|
||||
"I have a few jokes about unemployed people, but none of them work",
|
||||
"Want to hear a construction joke? I'm working on it",
|
||||
"I always take a second pair of pants when I go golfing, in case I get a hole in one.",
|
||||
"I couldn't remember how to throw a boomerang, but then it came back to me.",
|
||||
"I've decided that my wifi will be my valentine. IDK, we just have this connection.",
|
||||
"A prisoner's favorite punctuation mark is the period. It marks the end of his sentence.",
|
||||
"I used to go fishing with Skrillex, but he kept dropping the bass.",
|
||||
"Two antennae met on a roof and got married. The wedding was okay, but the reception was incredible.",
|
||||
"A book just fell on my head. I've only got my shelf to blame.",
|
||||
"I dropped my steak on the floor. Now it's ground beef.",
|
||||
"I used to have a fear of hurdles, but I got over it.",
|
||||
"The outcome of war does not prove who is right, but only who is left.",
|
||||
"Darth Vader tries not to burn his food, but it always comes out a little on the dark side.",
|
||||
"The store keeps calling me to buy more furniture, but all I wanted was a one night stand.",
|
||||
"This girl said she recognized me from the vegetarian club, but I'd never met herbivore.",
|
||||
"Police arrested two kids yesterday, one was drinking battery acid, the other was eating fireworks. They charged one and let the other one off...",
|
||||
"No more Harry Potter jokes guys. I'm Sirius.",
|
||||
"It was hard getting over my addiction to hokey pokey, but I've turned myself around.",
|
||||
"It takes a lot of balls to golf the way I do.",
|
||||
"Why did everyone want to hang out with the mushroom? Because he was a fungi.",
|
||||
"How much does a hipster weigh? An instagram.",
|
||||
"I used to be addicted to soap, but I'm clean now.",
|
||||
"When life gives you melons, you’re probably dyslexic.",
|
||||
"What's with all the blind jokes? I just don't see the point.",
|
||||
"If Apple made a car, would it have Windows?",
|
||||
"Need an ark? I Noah guy.",
|
||||
"The scarecrow won an award because he was outstanding in his field.",
|
||||
"What's the difference between a man in a tux on a bicycle, and a man in a sweatsuit on a trycicle? A tire.",
|
||||
"What do you do with a sick chemist? If you can't helium, and you can't curium, you'll just have to barium.",
|
||||
"I'm reading a book about anti-gravity. It's impossible to put down.",
|
||||
"Trying to write with a broken pencil is pointless.",
|
||||
"When TVs go on vacation, they travel to remote islands.",
|
||||
"I was going to tell a midget joke, but it's too short.",
|
||||
"Jokes about German sausage are the wurst.",
|
||||
"How do you organize a space party? You planet.",
|
||||
"Sleeping comes so naturally to me, I could do it with my eyes closed.",
|
||||
"I'm glad I know sign language; it's pretty handy.",
|
||||
"Atheism is a non-prophet organization.",
|
||||
"Velcro: What a rip-off!",
|
||||
"If they made a Minecraft movie, it would be a blockbuster.",
|
||||
"I don't trust people with graph paper. They're always plotting something",
|
||||
"I had a friend who was addicted to brake fluid. He says he can stop anytime.",
|
||||
"The form said I had Type A blood, but it was a Type O.",
|
||||
"I went to to the shop to buy eight Sprites - I came home and realised I'd picked 7Up.",
|
||||
"There was an explosion at a pie factory. 3.14 people died.",
|
||||
"A man drove his car into a tree and found out how a Mercedes bends.",
|
||||
"The experienced carpenter really nailed it, but the new guy screwed everything up.",
|
||||
"I didn't like my beard at first, but then it grew on me.",
|
||||
"Smaller babies may be delivered by stork, but the heavier ones need a crane.",
|
||||
"What's the definition of a will? It's a dead giveaway.",
|
||||
"I was going to look for my missing watch, but I could never find the time.",
|
||||
"I hate elevators, and I often take steps to avoid them.",
|
||||
"Did you hear about the guy whose whole left side was cut off? He's all right now.",
|
||||
"It's not that the man did not know how to juggle, he just didn't have the balls to do it.",
|
||||
"I used to be a loan shark, but I lost interest",
|
||||
"I don't trust these stairs; they're always up to something.",
|
||||
"My friend's bakery burned down last night. Now his business is toast.",
|
||||
"Don't trust people that do acupuncture; they're back stabbers.",
|
||||
"The man who survived mustard gas and pepper spray is now a seasoned veteran.",
|
||||
"Police were called to a daycare where a three-year-old was resisting a rest.",
|
||||
"When Peter Pan punches, they Neverland",
|
||||
"The shoemaker did not deny his apprentice anything he needed. He gave him his awl.",
|
||||
"I did a theatrical performance about puns. It was a play on words.",
|
||||
"Show me a piano falling down a mineshaft and I'll show you A-flat minor.",
|
||||
"Have you ever tried to eat a clock? It's very time consuming.",
|
||||
"There was once a cross-eyed teacher who couldn't control his pupils.",
|
||||
"A new type of broom came out and it is sweeping the nation.",
|
||||
"I relish the fact that you've mustard the strength to ketchup to me.",
|
||||
"I knew a woman who owned a taser. Man, was she stunning!",
|
||||
"What did the grape say when it got stepped on? Nothing - but it let out a little whine.",
|
||||
"It was an emotional wedding. Even the cake was in tiers.",
|
||||
"When a clock is hungry it goes back four seconds.",
|
||||
"The dead batteries were given out free of charge.",
|
||||
"Why are there no knock-knock jokes about America? Because freedom rings.",
|
||||
"When the cannibal showed up late to dinner, they gave him the cold shoulder.",
|
||||
"I should have been sad when my flashlight died, but I was delighted.",
|
||||
"Why don't tennis players ever get married? Love means nothing to them.",
|
||||
"Pterodactyls can't be heard going to the bathroom because the P is silent.",
|
||||
"Mermaids make calls on their shell phones.",
|
||||
"What do you call an aardvark with three feet? A yaardvark.",
|
||||
"Captain Kirk has three ears: A right ear, a left ear, and a final front ear.",
|
||||
"How do celebrities stay cool? They have a lot of fans.",
|
||||
"Without geometry, life is pointless.",
|
||||
"Did you hear about the cow who tried to jump over a barbed-wire fence? It ended in udder destruction.",
|
||||
"The truth may ring like a bell, but it is seldom ever tolled.",
|
||||
"I used to work for the IRS, but my job was too taxing.",
|
||||
"I used to be a programmer, but then I lost my drive.",
|
||||
"Pediatricians are doctors with little patients.",
|
||||
"I finally fired my masseuse today. She always rubbed me the wrong way.",
|
||||
"I stayed up all night wondering where the sun went. Then it dawned on me.",
|
||||
"What's the difference between a man and his dog? The man wears a suit; the dog just pants.",
|
||||
"A psychic midget who escapes from prison is a small medium at large.",
|
||||
"I've been to the dentist several times, so I know the drill.",
|
||||
"The roundest knight at King Arthur's round table was Sir Cumference. He acquired his size from too much pi.",
|
||||
"She was only a whiskey maker, but he loved her still.",
|
||||
"Male deer have buck teeth.",
|
||||
"Whiteboards are remarkable.",
|
||||
"Visitors in Cuba are always Havana good time.",
|
||||
"Why does electricity shock people? It doesn't know how to conduct itself.",
|
||||
"Lancelot had a scary dream about his horse. It was a knight mare.",
|
||||
"A tribe of cannibals captured a missionary and ate him. Afterward, they all had violent food poisoning. This just goes to show that you can't keep a good man down.",
|
||||
"Heaven for gamblers is a paradise.",
|
||||
"Old wheels aren't thrown away, they're just retired.",
|
||||
"Horses are very stable animals.",
|
||||
"Banks don't crash, they just lose their balance.",
|
||||
"The career of a skier can go downhill very fast.",
|
||||
"In democracy, it's your vote that counts. In feudalism, it's your count that votes.",
|
||||
"A sea lion is nothing but an ionized seal.",
|
||||
"The vegetables from my garden aren't that great. I guess you could say they're mediokra."
|
||||
}
|
||||
|
||||
function pun:action(msg)
|
||||
|
||||
utilities.send_reply(self, msg, puns[math.random(#puns)])
|
||||
|
||||
end
|
||||
|
||||
return pun
|
@ -1,52 +0,0 @@
|
||||
-- Never change this plugin. It was not meant to be changed.
|
||||
-- You may add reactions. You must never remove reactions.
|
||||
-- You must never restructure. You must never disable this plugin.
|
||||
-- - Drew, creator, a year later.
|
||||
|
||||
-- Nevermind, Brayden changed it.
|
||||
-- - Drew, just now.
|
||||
|
||||
local reactions = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
reactions.command = 'reactions'
|
||||
reactions.doc = '`Returns a list of "reaction" emoticon commands.`'
|
||||
|
||||
local mapping = {
|
||||
['shrug'] = '¯\\_(ツ)_/¯',
|
||||
['lenny'] = '( ͡° ͜ʖ ͡°)',
|
||||
['flip'] = '(╯°□°)╯︵ ┻━┻',
|
||||
['homo'] = '┌(┌ ^o^)┐',
|
||||
['look'] = 'ಠ_ಠ',
|
||||
['shots?'] = 'SHOTS FIRED',
|
||||
['facepalm'] = '(-‸ლ)'
|
||||
}
|
||||
|
||||
local help
|
||||
|
||||
function reactions:init(config)
|
||||
-- Generate a "help" message triggered by "/reactions".
|
||||
help = 'Reactions:\n'
|
||||
reactions.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('reactions').table
|
||||
for trigger,reaction in pairs(mapping) do
|
||||
help = help .. '• ' .. config.cmd_pat .. trigger:gsub('.%?', '') .. ': ' .. reaction .. '\n'
|
||||
table.insert(reactions.triggers, config.cmd_pat..trigger)
|
||||
table.insert(reactions.triggers, config.cmd_pat..trigger..'@'..self.info.username:lower())
|
||||
end
|
||||
end
|
||||
|
||||
function reactions:action(msg, config)
|
||||
if string.match(msg.text_lower, config.cmd_pat..'reactions') then
|
||||
utilities.send_message(self, msg.chat.id, help)
|
||||
return
|
||||
end
|
||||
for trigger,reaction in pairs(mapping) do
|
||||
if string.match(msg.text_lower, config.cmd_pat..trigger) then
|
||||
utilities.send_message(self, msg.chat.id, reaction)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return reactions
|
@ -1,56 +0,0 @@
|
||||
local shout = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
shout.command = 'shout <text>'
|
||||
|
||||
function shout:init(config)
|
||||
shout.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('shout', true).table
|
||||
shout.doc = [[```
|
||||
]]..config.cmd_pat..[[shout <text>
|
||||
Shouts something. Input may be the replied-to message.
|
||||
```]]
|
||||
end
|
||||
|
||||
function shout:action(msg)
|
||||
|
||||
local input = utilities.input(msg.text)
|
||||
if not input then
|
||||
if msg.reply_to_message and #msg.reply_to_message.text > 0 then
|
||||
input = msg.reply_to_message.text
|
||||
else
|
||||
utilities.send_message(self, msg.chat.id, shout.doc, true, msg.message_id, true)
|
||||
return
|
||||
end
|
||||
end
|
||||
input = utilities.trim(input)
|
||||
input = input:upper()
|
||||
|
||||
local output = ''
|
||||
local inc = 0
|
||||
local ilen = 0
|
||||
for match in input:gmatch(utilities.char.utf_8) do
|
||||
if ilen < 20 then
|
||||
ilen = ilen + 1
|
||||
output = output .. match .. ' '
|
||||
end
|
||||
end
|
||||
ilen = 0
|
||||
output = output .. '\n'
|
||||
for match in input:sub(2):gmatch(utilities.char.utf_8) do
|
||||
if ilen < 19 then
|
||||
local spacing = ''
|
||||
for _ = 1, inc do
|
||||
spacing = spacing .. ' '
|
||||
end
|
||||
inc = inc + 1
|
||||
ilen = ilen + 1
|
||||
output = output .. match .. ' ' .. spacing .. match .. '\n'
|
||||
end
|
||||
end
|
||||
output = '```\n' .. utilities.trim(output) .. '\n```'
|
||||
utilities.send_message(self, msg.chat.id, output, true, false, true)
|
||||
|
||||
end
|
||||
|
||||
return shout
|
@ -1,153 +0,0 @@
|
||||
local slap = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
slap.command = 'slap [target]'
|
||||
|
||||
function slap:init(config)
|
||||
slap.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('slap', true).table
|
||||
slap.doc = [[```
|
||||
]]..config.cmd_pat..[[slap [target]
|
||||
Slap somebody.
|
||||
```]]
|
||||
end
|
||||
|
||||
local slaps = {
|
||||
'VICTIM was shot by VICTOR.',
|
||||
'VICTIM was pricked to death.',
|
||||
'VICTIM walked into a cactus while trying to escape VICTOR.',
|
||||
'VICTIM drowned.',
|
||||
'VICTIM drowned whilst trying to escape VICTOR.',
|
||||
'VICTIM blew up.',
|
||||
'VICTIM was blown up by VICTOR.',
|
||||
'VICTIM hit the ground too hard.',
|
||||
'VICTIM fell from a high place.',
|
||||
'VICTIM fell off a ladder.',
|
||||
'VICTIM fell into a patch of cacti.',
|
||||
'VICTIM was doomed to fall by VICTOR.',
|
||||
'VICTIM was blown from a high place by VICTOR.',
|
||||
'VICTIM was squashed by a falling anvil.',
|
||||
'VICTIM went up in flames.',
|
||||
'VICTIM burned to death.',
|
||||
'VICTIM was burnt to a crisp whilst fighting VICTOR.',
|
||||
'VICTIM walked into a fire whilst fighting VICTOR.',
|
||||
'VICTIM tried to swim in lava.',
|
||||
'VICTIM tried to swim in lava while trying to escape VICTOR.',
|
||||
'VICTIM was struck by lightning.',
|
||||
'VICTIM was slain by VICTOR.',
|
||||
'VICTIM got finished off by VICTOR.',
|
||||
'VICTIM was killed by magic.',
|
||||
'VICTIM was killed by VICTOR using magic.',
|
||||
'VICTIM starved to death.',
|
||||
'VICTIM suffocated in a wall.',
|
||||
'VICTIM fell out of the world.',
|
||||
'VICTIM was knocked into the void by VICTOR.',
|
||||
'VICTIM withered away.',
|
||||
'VICTIM was pummeled by VICTOR.',
|
||||
'VICTIM was fragged by VICTOR.',
|
||||
'VICTIM was desynchronized.',
|
||||
'VICTIM was wasted.',
|
||||
'VICTIM was busted.',
|
||||
'VICTIM\'s bones are scraped clean by the desolate wind.',
|
||||
'VICTIM has died of dysentery.',
|
||||
'VICTIM fainted.',
|
||||
'VICTIM is out of usable Pokemon! VICTIM whited out!',
|
||||
'VICTIM is out of usable Pokemon! VICTIM blacked out!',
|
||||
'VICTIM whited out!',
|
||||
'VICTIM blacked out!',
|
||||
'VICTIM says goodbye to this cruel world.',
|
||||
'VICTIM got rekt.',
|
||||
'VICTIM was sawn in half by VICTOR.',
|
||||
'VICTIM died. I blame VICTOR.',
|
||||
'VICTIM was axe-murdered by VICTOR.',
|
||||
'VICTIM\'s melon was split by VICTOR.',
|
||||
'VICTIM was sliced and diced by VICTOR.',
|
||||
'VICTIM was split from crotch to sternum by VICTOR.',
|
||||
'VICTIM\'s death put another notch in VICTOR\'s axe.',
|
||||
'VICTIM died impossibly!',
|
||||
'VICTIM died from VICTOR\'s mysterious tropical disease.',
|
||||
'VICTIM escaped infection by dying.',
|
||||
'VICTIM played hot-potato with a grenade.',
|
||||
'VICTIM was knifed by VICTOR.',
|
||||
'VICTIM fell on his sword.',
|
||||
'VICTIM ate a grenade.',
|
||||
'VICTIM practiced being VICTOR\'s clay pigeon.',
|
||||
'VICTIM is what\'s for dinner!',
|
||||
'VICTIM was terminated by VICTOR.',
|
||||
'VICTIM was shot before being thrown out of a plane.',
|
||||
'VICTIM was not invincible.',
|
||||
'VICTIM has encountered an error.',
|
||||
'VICTIM died and reincarnated as a goat.',
|
||||
'VICTOR threw VICTIM off a building.',
|
||||
'VICTIM is sleeping with the fishes.',
|
||||
'VICTIM got a premature burial.',
|
||||
'VICTOR replaced all of VICTIM\'s music with Nickelback.',
|
||||
'VICTOR spammed VICTIM\'s email.',
|
||||
'VICTOR made VICTIM a knuckle sandwich.',
|
||||
'VICTOR slapped VICTIM with pure nothing.',
|
||||
'VICTOR hit VICTIM with a small, interstellar spaceship.',
|
||||
'VICTIM was quickscoped by VICTOR.',
|
||||
'VICTOR put VICTIM in check-mate.',
|
||||
'VICTOR RSA-encrypted VICTIM and deleted the private key.',
|
||||
'VICTOR put VICTIM in the friendzone.',
|
||||
'VICTOR slaps VICTIM with a DMCA takedown request!',
|
||||
'VICTIM became a corpse blanket for VICTOR.',
|
||||
'Death is when the monsters get you. Death comes for VICTIM.',
|
||||
'Cowards die many times before their death. VICTIM never tasted death but once.',
|
||||
'VICTIM died of hospital gangrene.',
|
||||
'VICTIM got a house call from Doctor VICTOR.',
|
||||
'VICTOR beheaded VICTIM.',
|
||||
'VICTIM got stoned...by an angry mob.',
|
||||
'VICTOR sued the pants off VICTIM.',
|
||||
'VICTIM was impeached.',
|
||||
'VICTIM was one-hit KO\'d by VICTOR.',
|
||||
'VICTOR sent VICTIM to /dev/null.',
|
||||
'VICTOR sent VICTIM down the memory hole.',
|
||||
'VICTIM was a mistake.',
|
||||
'"VICTIM was a mistake." - VICTOR',
|
||||
'VICTOR checkmated VICTIM in two moves.'
|
||||
}
|
||||
|
||||
-- optimize later
|
||||
function slap:action(msg)
|
||||
local input = utilities.input(msg.text)
|
||||
local victor_id = msg.from.id
|
||||
local victim_id = utilities.id_from_message(self, msg)
|
||||
-- IDs
|
||||
if victim_id then
|
||||
if victim_id == victor_id then
|
||||
victor_id = self.info.id
|
||||
end
|
||||
else
|
||||
if not input then
|
||||
victor_id = self.info.id
|
||||
victim_id = msg.from.id
|
||||
end
|
||||
end
|
||||
-- Names
|
||||
local victor_name, victim_name
|
||||
if input and not victim_id then
|
||||
victim_name = input
|
||||
else
|
||||
local victim_id_str = tostring(victim_id)
|
||||
if self.database.userdata[victim_id_str] and self.database.userdata[victim_id_str].nickname then
|
||||
victim_name = self.database.userdata[victim_id_str].nickname
|
||||
elseif self.database.users[victim_id_str] then
|
||||
victim_name = utilities.build_name(self.database.users[victim_id_str].first_name, self.database.users[victim_id_str].last_name)
|
||||
else
|
||||
victim_name = victim_id_str
|
||||
end
|
||||
end
|
||||
local victor_id_str = tostring(victor_id)
|
||||
if self.database.userdata[victor_id_str] and self.database.userdata[victor_id_str].nickname then
|
||||
victor_name = self.database.userdata[victor_id_str].nickname
|
||||
elseif self.database.users[victor_id_str] then
|
||||
victor_name = utilities.build_name(self.database.users[victor_id_str].first_name, self.database.users[victor_id_str].last_name)
|
||||
else
|
||||
victor_name = self.info.first_name
|
||||
end
|
||||
local output = utilities.char.zwnj .. slaps[math.random(#slaps)]:gsub('VICTIM', victim_name):gsub('VICTOR', victor_name)
|
||||
utilities.send_message(self, msg.chat.id, output)
|
||||
end
|
||||
|
||||
return slap
|
@ -1,52 +0,0 @@
|
||||
local whoami = {}
|
||||
|
||||
local utilities = require('otouto.utilities')
|
||||
|
||||
whoami.command = 'whoami'
|
||||
|
||||
function whoami:init(config)
|
||||
whoami.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('who', true):t('whoami').table
|
||||
whoami.doc = [[```
|
||||
Returns user and chat info for you or the replied-to message.
|
||||
Alias: ]]..config.cmd_pat..[[who
|
||||
```]]
|
||||
end
|
||||
|
||||
function whoami:action(msg)
|
||||
|
||||
if msg.reply_to_message then
|
||||
msg = msg.reply_to_message
|
||||
end
|
||||
|
||||
local from_name = utilities.build_name(msg.from.first_name, msg.from.last_name)
|
||||
|
||||
local chat_id = math.abs(msg.chat.id)
|
||||
if chat_id > 1000000000000 then
|
||||
chat_id = chat_id - 1000000000000
|
||||
end
|
||||
|
||||
local user = 'You are @%s, also known as *%s* `[%s]`'
|
||||
if msg.from.username then
|
||||
user = user:format(utilities.markdown_escape(msg.from.username), from_name, msg.from.id)
|
||||
else
|
||||
user = 'You are *%s* `[%s]`,'
|
||||
user = user:format(from_name, msg.from.id)
|
||||
end
|
||||
|
||||
local group = '@%s, also known as *%s* `[%s]`.'
|
||||
if msg.chat.type == 'private' then
|
||||
group = group:format(utilities.markdown_escape(self.info.username), self.info.first_name, self.info.id)
|
||||
elseif msg.chat.username then
|
||||
group = group:format(utilities.markdown_escape(msg.chat.username), msg.chat.title, chat_id)
|
||||
else
|
||||
group = '*%s* `[%s]`.'
|
||||
group = group:format(msg.chat.title, chat_id)
|
||||
end
|
||||
|
||||
local output = user .. ', and you are messaging ' .. group
|
||||
|
||||
utilities.send_message(self, msg.chat.id, output, true, msg.message_id, true)
|
||||
|
||||
end
|
||||
|
||||
return whoami
|
Reference in New Issue
Block a user