ctucx.git: ctucxbot

[nimlang] A telegram bot

commit b507c33d462b27d17206b12e2fccd9e7b8afb19c
parent b479ace35d57cf60d85abf5bc9588cda971516c9
Author: Milan Pässler <me@pbb.lc>
Date: Sat, 25 Jan 2020 00:05:18 +0100

add httpstatuscode cmd
2 files changed, 204 insertions(+), 1 deletion(-)
A
src/cmd/httpstatuscode.nim
|
202
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
M
src/ctucxbot.nim
|
3
++-
diff --git a/src/cmd/httpstatuscode.nim b/src/cmd/httpstatuscode.nim
@@ -0,0 +1,202 @@
+import tables
+
+const codes = {
+  "1xx": ("Informational response", false),
+  "100": ("Continue", true),
+  "101": ("Switching Protocols", true),
+  "102": ("Processing", false),
+  "103": ("Checkpoint", false),
+  "2xx": ("Success", false),
+  "200": ("Ok", true),
+  "201": ("Created", true),
+  "202": ("Accepted", true),
+  "203": ("Non-Authoritative Information", false),
+  "204": ("No Content", true),
+  "205": ("Reset Content", false),
+  "206": ("Partial Content", true),
+  "207": ("Multi-Status", true),
+  "208": ("Already Reported", false),
+  "218": ("This is fine", false),
+  "226": ("IM Used", false),
+  "3xx": ("Redirection", false),
+  "300": ("Multiple Choices", true),
+  "301": ("Moved Permanently", true),
+  "302": ("Found (Moved Temporarily)", true),
+  "303": ("See Other", true),
+  "304": ("Not Modified", true),
+  "305": ("Use Proxy", true),
+  "306": ("Switch Proxy", false),
+  "307": ("Temporary Redirect", true),
+  "308": ("Permanent Redirect", false),
+  "4xx": ("Client errors", false),
+  "400": ("Bad Request", true),
+  "401": ("Unauthorized", true),
+  "402": ("Payment Required", true),
+  "403": ("Forbidden", true),
+  "404": ("Not Found", true),
+  "405": ("Method Not Allowed", true),
+  "406": ("Not Acceptable", true),
+  "407": ("Proxy Authentication Required", false),
+  "408": ("Request Timeout", true),
+  "409": ("Conflict", true),
+  "410": ("Gone", true),
+  "411": ("Length Required", true),
+  "412": ("Precondition Failed", true),
+  "413": ("Request Entity Too Large", true),
+  "414": ("URI Too Long", true),
+  "415": ("Unsupported Media Type", true),
+  "416": ("Requested range not satisfiable", true),
+  "417": ("Expectation Failed", true),
+  "418": ("I’m a teapot", true),
+  "419": ("Page Expired", false),
+  "420": ("Enhance Your Calm", true),
+  "421": ("Misdirected Request", true),
+  "422": ("Unprocessable Entity", true),
+  "423": ("Locked", true),
+  "424": ("Failed Dependency", true),
+  "425": ("Unordered Collection", true),
+  "426": ("Upgrade Required", true),
+  "428": ("Precondition Required", false),
+  "429": ("Too Many Requests", true),
+  "431": ("Request Header Fields Too Large", true),
+  "440": ("Login Time-out", false),
+  "444": ("No Response", true),
+  "449": ("The request should be retried after doing the appropriate action", false),
+  "450": ("Blocked by Windows Parental Controls", true),
+  "451": ("Unavailable For Legal Reasons", true),
+  "494": ("Request header too large", false),
+  "495": ("SSL Certificate Error", false),
+  "496": ("SSL Certificate Required", false),
+  "497": ("HTTP Request Sent to HTTPS Port", false),
+  "499": ("Client Closed Request ", false),
+  "5xx": ("Server errors", false),
+  "500": ("Internal Server Error", true),
+  "501": ("Not Implemented", false),
+  "502": ("Bad Gateway", true),
+  "503": ("Service Unavailable", true),
+  "504": ("Gateway Timeout", true),
+  "505": ("HTTP Version not supported", false),
+  "506": ("Variant Also Negotiates", true),
+  "507": ("Insufficient Storage", true),
+  "508": ("Loop Detected", true),
+  "509": ("Bandwidth Limit Exceeded", true),
+  "510": ("Not Extended", true),
+  "511": ("Network Authentication Required", true),
+  "520": ("Unknown Error", false),
+  "521": ("Web Server Is Down", false),
+  "522": ("Connection Timed Out", false),
+  "523": ("Origin Is Unreachable", false),
+  "524": ("A Timeout Occurred", false),
+  "525": ("SSL Handshake Failed", false),
+  "526": ("Invalid SSL Certificate", false),
+  "527": ("Railgun Error", false),
+  "530": ("Site is frozen/Origin DNS Error", false),
+  "598": ("(Informal convention) Network read timeout error", false),
+  "599": ("Network connect timeout error", true),
+  "666": ("Number of the Beast", false),
+  "7xx": ("Other", false),
+  "70x": ("Inexcusable", false),
+  "701": ("Meh", false),
+  "702": ("Emacs", false),
+  "703": ("Explosion", false),
+  "704": ("Goto Fail", false),
+  "705": ("I wrote the code and missed the necessary validation by an oversight (see 795)", false),
+  "706": ("Delete Your Account", false),
+  "707": ("Can’t quit vi", false),
+  "71x": ("Novelty Implementations", false),
+  "710": ("PHP", false),
+  "711": ("Convenience Store", false),
+  "712": ("NoSQL", false),
+  "718": ("I am not a teapot", false),
+  "719": ("Haskell", false),
+  "72x": ("Edge Cases", false),
+  "720": ("Unpossible", false),
+  "721": ("Known unknowns", false),
+  "722": ("Unknown unknowns", false),
+  "723": ("Tricky", false),
+  "724": ("This line should be unreachable", false),
+  "725": ("It works on my machine", false),
+  "726": ("It’s a feature, not a bug", false),
+  "727": ("32 bits is plenty", false),
+  "728": ("It works in my timezone", false),
+  "73x": ("Fucking", false),
+  "730": ("Fucking npm", false),
+  "731": ("Fucking Rubygems", false),
+  "732": ("Fucking Unic�de", false),
+  "733": ("Fucking Deadlocks", false),
+  "734": ("Fucking Deferreds", false),
+  "735": ("Fucking IE", false),
+  "736": ("Fucking Race Conditions", false),
+  "737": ("FuckThreadsing ", false),
+  "738": ("Fucking Exactly-once Delivery", false),
+  "739": ("Fucking Windows", false),
+  "74x": ("Reserved for meritocracy related bullshit", false),
+  "75x": ("Syntax Errors", false),
+  "750": ("Didn’t bother to compile it", false),
+  "753": ("Syntax Error", false),
+  "754": ("Too many semi-colons", false),
+  "755": ("Not enough semi-colons", false),
+  "756": ("Insufficiently polite", false),
+  "757": ("Excessively polite", false),
+  "759": ("Unexpected \"T_PAAMAYIM_NEKUDOTAYIM\"", false),
+  "76x": ("Substance-Affected Developer", false),
+  "761": ("Hungover", false),
+  "762": ("Stoned", false),
+  "763": ("Under-Caffeinated", false),
+  "764": ("Over-Caffeinated", false),
+  "765": ("Railscamp", false),
+  "766": ("Sober", false),
+  "767": ("Drunk", false),
+  "768": ("Accidentally Took Sleeping Pills Instead Of Migraine Pills During Crunch Week", false),
+  "77x": ("Predictable Problems", false),
+  "771": ("Cached for too long", false),
+  "772": ("Not cached long enough", false),
+  "773": ("Not cached at all", false),
+  "774": ("Why was this cached?", false),
+  "775": ("Out of cash", false),
+  "776": ("Error on the Exception", false),
+  "777": ("Coincidence", false),
+  "778": ("Off By One Error", false),
+  "779": ("Off By Too Many To Count Error", false),
+  "78x": ("Somebody Else’s Problem", false),
+  "780": ("Project owner not responding", false),
+  "781": ("Operations", false),
+  "782": ("QA", false),
+  "783": ("It was a customer request, honestly", false),
+  "784": ("Management, obviously", false),
+  "785": ("TPS Cover Sheet not attached", false),
+  "786": ("Try it now", false),
+  "787": ("Further Funding Required", false),
+  "788": ("Designer’s final designs weren’t", false),
+  "789": ("Not my department", false),
+  "79x": ("Internet crashed", false),
+  "791": ("The Internet shut down due to copyright restrictions", false),
+  "792": ("Climate change driven catastrophic weather event", false),
+  "793": ("Zombie Apocalypse", false),
+  "794": ("Someone let PG near a REPL", false),
+  "795": ("#heartbleed (see 705)", false),
+  "796": ("Some DNS fuckery idno", false),
+  "797": ("This is the last page of the Internet.  Go back", false),
+  "798": ("I checked the db backups cupboard and the cupboard was bare", false),
+  "799": ("End of the world", false),
+  "9xx": ("Proprietary Error", false)
+}.toTable
+
+proc httpstatuscodeCommand(bot: Telebot, command: Command) {.async.} =
+  let code = codes.getOrDefault(command.params, ("I don't know about this status code", false))
+  if code[1]: # hazcat
+    var tmpFile = getCurrentDir() & "/data/tmp/" & $(toUnix(getTime())) & ".jpg"
+    var httpClient = newAsyncHttpClient()
+    await httpClient.downloadFile("https://http.cat/" & command.params & ".jpg", tmpFile)
+
+    var message = newPhoto(command.message.chat.id, "file://" & tmpFile)
+    message.replyToMessageId = command.message.messageId
+    discard await bot.send(message)
+
+    removeFile(tmpFile)
+
+    discard await bot.send(newMessage(command.message.chat.id, code[0]))
+  else:
+    var message = newMessage(command.message.chat.id, code[0])
+    message.replyToMessageId = command.message.messageId
+    discard await bot.send(message)
diff --git a/src/ctucxbot.nim b/src/ctucxbot.nim
@@ -1,5 +1,5 @@
 import asyncdispatch, telebot, options, strutils, random, os, re, unicode
-include cmd/[animalpics, daysuntilcongress, debuginfo, help, stats, unixtime, utc, uptime, yesorno, whoami, invitelinks, sarcasm]
+include cmd/[animalpics, daysuntilcongress, debuginfo, help, stats, unixtime, utc, uptime, yesorno, whoami, invitelinks, sarcasm, httpstatuscode]
 
 proc ctrlcHandler() {.noconv.} =
   quit()

@@ -99,6 +99,7 @@ if getEnv("API_KEY") != "":
   bot.onCommand("whoami", whoamiCommand)
   bot.onCommand("invitelinks", invitelinksCommand)
   bot.onCommand("s", sarcasmCommand)
+  bot.onCommand("httpstatuscode", httpstatuscodeCommand)
   bot.poll(timeout=300)
 
 else: