/sprink.ooc

http://github.com/tsion/sprink · Unknown · 99 lines · 89 code · 10 blank · 0 comment · 0 complexity · 6800a2bff6df5e4a6863675a8a359da0 MD5 · raw file

  1. use spry, curl, xml
  2. import spry/[IRC, Message, Prefix]
  3. import curl/[Curl, Highlevel]
  4. import xml/[Xml, XPath]
  5. import structs/[List, ArrayList], text/StringTokenizer
  6. main: func (args: ArrayList<String>) {
  7. if(args size != 4) {
  8. "usage: sprink <nick> <server> <port>" println()
  9. return -1
  10. }
  11. bot := IRC new(args[1], "sprink", "a spry little IRC bot", args[2], args[3] toInt())
  12. bot on("send", |irc, msg|
  13. ">> " print()
  14. msg toString() println()
  15. )
  16. bot on("all", |irc, msg|
  17. msg toString() println()
  18. )
  19. bot on("001", |irc, msg|
  20. irc join("#programming,#offtopic,#bots,#minecraft")
  21. )
  22. bot on("PRIVMSG", |irc, msg|
  23. target := msg params[0]
  24. if(target startsWith?('#'))
  25. irc runCallback("channel message", msg)
  26. else
  27. irc runCallback("private message", msg)
  28. )
  29. bot on("channel message", |irc, msg|
  30. channel := msg params[0]
  31. if(msg params[1] startsWith?(irc nickname)) {
  32. words := msg params[1] split(' ', 3)
  33. first := words[1]
  34. match first {
  35. case "!channels" =>
  36. buf := Buffer new()
  37. for(c in irc channels)
  38. buf append(c) .append(' ')
  39. irc privmsg(channel, msg prefix nick + ": " + buf toString())
  40. case "!ping" =>
  41. irc privmsg(channel, msg prefix nick + ": pong")
  42. case "!join" =>
  43. chan := words[2]
  44. if(irc channels contains?(chan)) {
  45. irc privmsg(channel, msg prefix nick + ": I'm already in " + chan + ".")
  46. } else {
  47. irc join(chan)
  48. irc privmsg(channel, msg prefix nick + ": Consider it done.")
  49. }
  50. case "!part" =>
  51. chan := words[2]
  52. if(irc channels contains?(chan)) {
  53. irc part(chan)
  54. irc privmsg(channel, msg prefix nick + ": Consider it done.")
  55. } else {
  56. irc privmsg(channel, msg prefix nick + ": I'm not in " + chan + ".")
  57. }
  58. case =>
  59. code := msg params[1] split(' ', 2)[1]
  60. result := frinkEval(code)
  61. if(result) {
  62. if(result size > 450)
  63. result = result[0..444] + " (...)"
  64. irc privmsg(channel, msg prefix nick + ": " + result)
  65. } else {
  66. irc privmsg(channel, msg prefix nick + ": No results found on " + frinkUrl(code))
  67. }
  68. }
  69. }
  70. )
  71. bot run()
  72. }
  73. frinkUrl: func (code: String) -> String {
  74. "http://futureboy.us/fsp/frink.fsp?fromVal=" + Curl escape(code)
  75. }
  76. frinkEval: func (code: String) -> String {
  77. code = "B := byte; b := bit;" + code
  78. url := frinkUrl(code)
  79. request := HTTPRequest new(url) .perform()
  80. doc := HtmlDoc new(request getString(), "frink.fsp")
  81. resultList := doc evalXPath("//a[@name=\"results\"]")
  82. if(resultList size > 0 && resultList[0]@ children && resultList[0]@ children@ content) {
  83. resultNode := resultList[0]
  84. result := resultNode@ children@ content toString()
  85. result
  86. } else {
  87. null
  88. }
  89. }