rbot 0.9.10 → 0.9.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (706) hide show
  1. data/AUTHORS +22 -4
  2. data/COPYING +5 -18
  3. data/ChangeLog +396 -0
  4. data/README +23 -25
  5. data/REQUIREMENTS +58 -12
  6. data/Rakefile +215 -0
  7. data/bin/rbot +47 -25
  8. data/bin/rbot-remote +76 -0
  9. data/data/rbot/languages/french.lang +5 -5
  10. data/data/rbot/languages/german.lang +4 -4
  11. data/data/rbot/languages/italian.lang +53 -0
  12. data/data/rbot/languages/japanese.lang +43 -0
  13. data/data/rbot/languages/russian.lang +60 -60
  14. data/data/rbot/languages/traditional_chinese.lang +75 -0
  15. data/data/rbot/plugins/alias.rb +192 -0
  16. data/data/rbot/plugins/autoop.rb +74 -37
  17. data/data/rbot/plugins/autorejoin.rb +15 -5
  18. data/data/rbot/plugins/bans.rb +454 -150
  19. data/data/rbot/plugins/bash.rb +173 -31
  20. data/data/rbot/plugins/botsnack.rb +37 -0
  21. data/data/rbot/plugins/cal.rb +11 -2
  22. data/data/rbot/plugins/chanserv.rb +132 -0
  23. data/data/rbot/plugins/chucknorris.rb +2 -2
  24. data/data/rbot/plugins/chucknorris.yml.gz +0 -0
  25. data/data/rbot/plugins/debugger.rb +136 -0
  26. data/data/rbot/plugins/deepthoughts.rb +89 -95
  27. data/data/rbot/plugins/delicious.rb +109 -0
  28. data/data/rbot/plugins/dice.rb +77 -25
  29. data/data/rbot/plugins/dict.rb +243 -0
  30. data/data/rbot/plugins/dictclient.rb +211 -0
  31. data/data/rbot/plugins/digg.rb +2 -2
  32. data/data/rbot/plugins/excuse.rb +4 -4
  33. data/data/rbot/plugins/factoids.rb +506 -0
  34. data/data/rbot/plugins/figlet.rb +127 -18
  35. data/data/rbot/plugins/fish.rb +93 -33
  36. data/data/rbot/plugins/forecast.rb +40 -27
  37. data/data/rbot/plugins/fortune.rb +86 -11
  38. data/data/rbot/plugins/freshmeat.rb +46 -12
  39. data/data/rbot/plugins/games/azgame.rb +565 -0
  40. data/data/rbot/plugins/games/quiz.rb +961 -0
  41. data/data/rbot/plugins/games/roshambo.rb +62 -0
  42. data/data/rbot/plugins/{roulette.rb → games/roulette.rb} +58 -8
  43. data/data/rbot/plugins/games/shiritori.rb +485 -0
  44. data/data/rbot/plugins/games/uno.rb +1205 -0
  45. data/data/rbot/plugins/games/wheelfortune.rb +615 -0
  46. data/data/rbot/plugins/grouphug.rb +76 -22
  47. data/data/rbot/plugins/hl2.rb +97 -0
  48. data/data/rbot/plugins/host.rb +10 -1
  49. data/data/rbot/plugins/httpd.rb.disabled +1 -0
  50. data/data/rbot/plugins/imdb.rb +511 -47
  51. data/data/rbot/plugins/insult.rb +32 -37
  52. data/data/rbot/plugins/iplookup.rb +224 -224
  53. data/data/rbot/plugins/karma.rb +45 -21
  54. data/data/rbot/plugins/keywords.rb +258 -160
  55. data/data/rbot/plugins/lart.rb +126 -95
  56. data/data/rbot/plugins/lastfm.rb +421 -12
  57. data/data/rbot/plugins/linkbot.rb +75 -0
  58. data/data/rbot/plugins/markov.rb +103 -46
  59. data/data/rbot/plugins/math.rb +6 -5
  60. data/data/rbot/plugins/modes.rb +114 -0
  61. data/data/rbot/plugins/nickrecover.rb +97 -0
  62. data/data/rbot/plugins/nickserv.rb +111 -48
  63. data/data/rbot/plugins/nslookup.rb +15 -19
  64. data/data/rbot/plugins/plugin.header +11 -0
  65. data/data/rbot/plugins/quakeauth.rb +74 -11
  66. data/data/rbot/plugins/quotes.rb +189 -233
  67. data/data/rbot/plugins/reaction.rb +415 -0
  68. data/data/rbot/plugins/remind.rb +11 -15
  69. data/data/rbot/plugins/remotectl.rb +29 -0
  70. data/data/rbot/plugins/ri.rb +74 -0
  71. data/data/rbot/plugins/rot13.rb +16 -1
  72. data/data/rbot/plugins/rss.rb +1219 -585
  73. data/data/rbot/plugins/salut.rb +226 -0
  74. data/data/rbot/plugins/script.rb +184 -0
  75. data/data/rbot/plugins/search.rb +233 -0
  76. data/data/rbot/plugins/seen.rb +44 -40
  77. data/data/rbot/plugins/shortenurls.rb +93 -0
  78. data/data/rbot/plugins/slashdot.rb +49 -11
  79. data/data/rbot/plugins/spell.rb +37 -27
  80. data/data/rbot/plugins/theyfightcrime.rb +36 -39
  81. data/data/rbot/plugins/threat.rb +25 -22
  82. data/data/rbot/plugins/time.rb +135 -0
  83. data/data/rbot/plugins/topic.rb +107 -50
  84. data/data/rbot/plugins/translator.rb +360 -0
  85. data/data/rbot/plugins/tube.rb +28 -40
  86. data/data/rbot/plugins/twitter.rb +187 -0
  87. data/data/rbot/plugins/urban.rb +62 -53
  88. data/data/rbot/plugins/url.rb +193 -409
  89. data/data/rbot/plugins/usermodes.rb +26 -0
  90. data/data/rbot/plugins/wall.rb +60 -0
  91. data/data/rbot/plugins/weather.rb +254 -598
  92. data/data/rbot/plugins/wow.rb +41 -37
  93. data/data/rbot/plugins/wserver.rb +17 -25
  94. data/data/rbot/plugins/youtube.rb +237 -0
  95. data/data/rbot/templates/lart/{larts → larts-english} +0 -0
  96. data/data/rbot/templates/lart/larts-italian +25 -0
  97. data/data/rbot/templates/lart/larts-japanese +10 -0
  98. data/data/rbot/templates/lart/{praises → praises-english} +0 -0
  99. data/data/rbot/templates/lart/praises-italian +4 -0
  100. data/data/rbot/templates/lart/praises-japanese +3 -0
  101. data/data/rbot/templates/quiz/win_messages +11 -0
  102. data/data/rbot/templates/salut/salut-english +40 -0
  103. data/data/rbot/templates/salut/salut-french +29 -0
  104. data/data/rbot/templates/salut/salut-italian +51 -0
  105. data/data/rbot/templates/salut/salut-japanese +31 -0
  106. data/lib/rbot/botuser.rb +940 -0
  107. data/lib/rbot/config-compat.rb +23 -0
  108. data/lib/rbot/config.rb +211 -276
  109. data/lib/rbot/core/auth.rb +1063 -0
  110. data/lib/rbot/core/basics.rb +214 -0
  111. data/lib/rbot/core/config.rb +330 -0
  112. data/lib/rbot/core/filters_ui.rb +64 -0
  113. data/lib/rbot/core/irclog.rb +292 -0
  114. data/lib/rbot/core/remote.rb +401 -0
  115. data/lib/rbot/core/unicode.rb +91 -0
  116. data/lib/rbot/core/userdata.rb +200 -0
  117. data/lib/rbot/core/utils/extends.rb +444 -0
  118. data/lib/rbot/core/utils/filters.rb +154 -0
  119. data/lib/rbot/core/utils/httputil.rb +689 -0
  120. data/lib/rbot/core/utils/utils.rb +717 -0
  121. data/lib/rbot/dbhash.rb +30 -9
  122. data/lib/rbot/irc.rb +1966 -0
  123. data/lib/rbot/ircbot.rb +816 -675
  124. data/lib/rbot/ircsocket.rb +246 -232
  125. data/lib/rbot/language.rb +86 -8
  126. data/lib/rbot/load-gettext.rb +154 -0
  127. data/lib/rbot/maskdb.rb +162 -0
  128. data/lib/rbot/message.rb +392 -65
  129. data/lib/rbot/messagemapper.rb +438 -94
  130. data/lib/rbot/pkgconfig.rb +6 -0
  131. data/lib/rbot/plugins.rb +713 -172
  132. data/lib/rbot/post-config.rb +1 -0
  133. data/lib/rbot/rbotconfig.rb +31 -12
  134. data/lib/rbot/registry.rb +79 -48
  135. data/lib/rbot/rfc2812.rb +927 -519
  136. data/lib/rbot/timer.rb +232 -167
  137. data/po/en_US/rbot-alias.po +82 -0
  138. data/po/en_US/rbot-autoop.po +0 -0
  139. data/po/en_US/rbot-autorejoin.po +0 -0
  140. data/po/en_US/rbot-azgame.po +200 -0
  141. data/po/en_US/rbot-bans.po +0 -0
  142. data/po/en_US/rbot-bash.po +0 -0
  143. data/po/en_US/rbot-botsnack.po +0 -0
  144. data/po/en_US/rbot-cal.po +3 -0
  145. data/po/en_US/rbot-chanserv.po +0 -0
  146. data/po/en_US/rbot-chucknorris.po +0 -0
  147. data/po/en_US/rbot-debugger.po +0 -0
  148. data/po/en_US/rbot-deepthoughts.po +0 -0
  149. data/po/en_US/rbot-delicious.po +0 -0
  150. data/po/en_US/rbot-dice.po +0 -0
  151. data/po/en_US/rbot-dict.po +0 -0
  152. data/po/en_US/rbot-dictclient.po +124 -0
  153. data/po/en_US/rbot-digg.po +0 -0
  154. data/po/en_US/rbot-eightball.po +0 -0
  155. data/po/en_US/rbot-excuse.po +0 -0
  156. data/po/en_US/rbot-factoids.po +107 -0
  157. data/po/en_US/rbot-figlet.po +36 -0
  158. data/po/en_US/rbot-fish.po +0 -0
  159. data/po/en_US/rbot-forecast.po +0 -0
  160. data/po/en_US/rbot-fortune.po +0 -0
  161. data/po/en_US/rbot-freshmeat.po +0 -0
  162. data/po/en_US/rbot-grouphug.po +18 -0
  163. data/po/en_US/rbot-hl2.po +0 -0
  164. data/po/en_US/rbot-host.po +3 -0
  165. data/po/en_US/rbot-imdb.po +0 -0
  166. data/po/en_US/rbot-insult.po +0 -0
  167. data/po/en_US/rbot-iplookup.po +0 -0
  168. data/po/en_US/rbot-karma.po +0 -0
  169. data/po/en_US/rbot-keywords.po +24 -0
  170. data/po/en_US/rbot-lart.po +0 -0
  171. data/po/en_US/rbot-lastfm.po +172 -0
  172. data/po/en_US/rbot-linkbot.po +0 -0
  173. data/po/en_US/rbot-markov.po +20 -0
  174. data/po/en_US/rbot-math.po +0 -0
  175. data/po/en_US/rbot-modes.po +0 -0
  176. data/po/en_US/rbot-nickrecover.po +40 -0
  177. data/po/en_US/rbot-nickserv.po +104 -0
  178. data/po/en_US/rbot-nslookup.po +0 -0
  179. data/po/en_US/rbot-quakeauth.po +0 -0
  180. data/po/en_US/rbot-quiz.po +0 -0
  181. data/po/en_US/rbot-quotes.po +108 -0
  182. data/po/en_US/rbot-reaction.po +0 -0
  183. data/po/en_US/rbot-remind.po +0 -0
  184. data/po/en_US/rbot-remotectl.po +0 -0
  185. data/po/en_US/rbot-ri.po +0 -0
  186. data/po/en_US/rbot-roshambo.po +0 -0
  187. data/po/en_US/rbot-rot13.po +0 -0
  188. data/po/en_US/rbot-roulette.po +0 -0
  189. data/po/en_US/rbot-rss.po +20 -0
  190. data/po/en_US/rbot-salut.po +0 -0
  191. data/po/en_US/rbot-script.po +0 -0
  192. data/po/en_US/rbot-search.po +0 -0
  193. data/po/en_US/rbot-seen.po +0 -0
  194. data/po/en_US/rbot-shiritori.po +113 -0
  195. data/po/en_US/rbot-shortenurls.po +0 -0
  196. data/po/en_US/rbot-slashdot.po +0 -0
  197. data/po/en_US/rbot-spell.po +54 -0
  198. data/po/en_US/rbot-theyfightcrime.po +0 -0
  199. data/po/en_US/rbot-threat.po +0 -0
  200. data/po/en_US/rbot-time.po +0 -0
  201. data/po/en_US/rbot-topic.po +0 -0
  202. data/po/en_US/rbot-translator.po +77 -0
  203. data/po/en_US/rbot-tube.po +0 -0
  204. data/po/en_US/rbot-twitter.po +24 -0
  205. data/po/en_US/rbot-uno.po +512 -0
  206. data/po/en_US/rbot-urban.po +0 -0
  207. data/po/en_US/rbot-url.po +0 -0
  208. data/po/en_US/rbot-usermodes.po +0 -0
  209. data/po/en_US/rbot-wall.po +33 -0
  210. data/po/en_US/rbot-weather.po +0 -0
  211. data/po/en_US/rbot-wheelfortune.po +205 -0
  212. data/po/en_US/rbot-wow.po +0 -0
  213. data/po/en_US/rbot-wserver.po +0 -0
  214. data/po/en_US/rbot-youtube.po +58 -0
  215. data/po/en_US/rbot.po +1097 -0
  216. data/po/fr/rbot-alias.po +97 -0
  217. data/po/fr/rbot-autoop.po +0 -0
  218. data/po/fr/rbot-autorejoin.po +0 -0
  219. data/po/fr/rbot-azgame.po +204 -0
  220. data/po/fr/rbot-bans.po +0 -0
  221. data/po/fr/rbot-bash.po +0 -0
  222. data/po/fr/rbot-botsnack.po +0 -0
  223. data/po/fr/rbot-cal.po +3 -0
  224. data/po/fr/rbot-chanserv.po +0 -0
  225. data/po/fr/rbot-chucknorris.po +0 -0
  226. data/po/fr/rbot-debugger.po +0 -0
  227. data/po/fr/rbot-deepthoughts.po +0 -0
  228. data/po/fr/rbot-delicious.po +0 -0
  229. data/po/fr/rbot-dice.po +0 -0
  230. data/po/fr/rbot-dict.po +0 -0
  231. data/po/fr/rbot-dictclient.po +134 -0
  232. data/po/fr/rbot-digg.po +0 -0
  233. data/po/fr/rbot-eightball.po +0 -0
  234. data/po/fr/rbot-excuse.po +0 -0
  235. data/po/fr/rbot-factoids.po +111 -0
  236. data/po/fr/rbot-figlet.po +37 -0
  237. data/po/fr/rbot-fish.po +0 -0
  238. data/po/fr/rbot-forecast.po +0 -0
  239. data/po/fr/rbot-fortune.po +0 -0
  240. data/po/fr/rbot-freshmeat.po +0 -0
  241. data/po/fr/rbot-grouphug.po +18 -0
  242. data/po/fr/rbot-hl2.po +0 -0
  243. data/po/fr/rbot-host.po +3 -0
  244. data/po/fr/rbot-imdb.po +0 -0
  245. data/po/fr/rbot-insult.po +0 -0
  246. data/po/fr/rbot-iplookup.po +0 -0
  247. data/po/fr/rbot-karma.po +0 -0
  248. data/po/fr/rbot-keywords.po +24 -0
  249. data/po/fr/rbot-lart.po +0 -0
  250. data/po/fr/rbot-lastfm.po +172 -0
  251. data/po/fr/rbot-linkbot.po +0 -0
  252. data/po/fr/rbot-markov.po +20 -0
  253. data/po/fr/rbot-math.po +0 -0
  254. data/po/fr/rbot-modes.po +0 -0
  255. data/po/fr/rbot-nickrecover.po +36 -0
  256. data/po/fr/rbot-nickserv.po +116 -0
  257. data/po/fr/rbot-nslookup.po +0 -0
  258. data/po/fr/rbot-quakeauth.po +0 -0
  259. data/po/fr/rbot-quiz.po +0 -0
  260. data/po/fr/rbot-quotes.po +138 -0
  261. data/po/fr/rbot-reaction.po +0 -0
  262. data/po/fr/rbot-remind.po +0 -0
  263. data/po/fr/rbot-remotectl.po +0 -0
  264. data/po/fr/rbot-ri.po +0 -0
  265. data/po/fr/rbot-roshambo.po +0 -0
  266. data/po/fr/rbot-rot13.po +0 -0
  267. data/po/fr/rbot-roulette.po +0 -0
  268. data/po/fr/rbot-rss.po +20 -0
  269. data/po/fr/rbot-salut.po +0 -0
  270. data/po/fr/rbot-script.po +0 -0
  271. data/po/fr/rbot-search.po +0 -0
  272. data/po/fr/rbot-seen.po +0 -0
  273. data/po/fr/rbot-shiritori.po +119 -0
  274. data/po/fr/rbot-shortenurls.po +0 -0
  275. data/po/fr/rbot-slashdot.po +0 -0
  276. data/po/fr/rbot-spell.po +56 -0
  277. data/po/fr/rbot-theyfightcrime.po +0 -0
  278. data/po/fr/rbot-threat.po +0 -0
  279. data/po/fr/rbot-time.po +0 -0
  280. data/po/fr/rbot-topic.po +0 -0
  281. data/po/fr/rbot-translator.po +90 -0
  282. data/po/fr/rbot-tube.po +0 -0
  283. data/po/fr/rbot-twitter.po +24 -0
  284. data/po/fr/rbot-uno.po +521 -0
  285. data/po/fr/rbot-urban.po +0 -0
  286. data/po/fr/rbot-url.po +0 -0
  287. data/po/fr/rbot-usermodes.po +0 -0
  288. data/po/fr/rbot-wall.po +33 -0
  289. data/po/fr/rbot-weather.po +0 -0
  290. data/po/fr/rbot-wheelfortune.po +255 -0
  291. data/po/fr/rbot-wow.po +0 -0
  292. data/po/fr/rbot-wserver.po +0 -0
  293. data/po/fr/rbot-youtube.po +64 -0
  294. data/po/fr/rbot.po +1133 -0
  295. data/po/it/rbot-alias.po +82 -0
  296. data/po/it/rbot-autoop.po +0 -0
  297. data/po/it/rbot-autorejoin.po +0 -0
  298. data/po/it/rbot-azgame.po +186 -0
  299. data/po/it/rbot-bans.po +0 -0
  300. data/po/it/rbot-bash.po +0 -0
  301. data/po/it/rbot-botsnack.po +0 -0
  302. data/po/it/rbot-cal.po +3 -0
  303. data/po/it/rbot-chanserv.po +0 -0
  304. data/po/it/rbot-chucknorris.po +0 -0
  305. data/po/it/rbot-debugger.po +0 -0
  306. data/po/it/rbot-deepthoughts.po +0 -0
  307. data/po/it/rbot-delicious.po +0 -0
  308. data/po/it/rbot-dice.po +0 -0
  309. data/po/it/rbot-dict.po +0 -0
  310. data/po/it/rbot-dictclient.po +111 -0
  311. data/po/it/rbot-digg.po +0 -0
  312. data/po/it/rbot-eightball.po +0 -0
  313. data/po/it/rbot-excuse.po +0 -0
  314. data/po/it/rbot-factoids.po +110 -0
  315. data/po/it/rbot-figlet.po +36 -0
  316. data/po/it/rbot-fish.po +0 -0
  317. data/po/it/rbot-forecast.po +0 -0
  318. data/po/it/rbot-fortune.po +0 -0
  319. data/po/it/rbot-freshmeat.po +0 -0
  320. data/po/it/rbot-grouphug.po +18 -0
  321. data/po/it/rbot-hl2.po +0 -0
  322. data/po/it/rbot-host.po +3 -0
  323. data/po/it/rbot-imdb.po +0 -0
  324. data/po/it/rbot-insult.po +0 -0
  325. data/po/it/rbot-iplookup.po +0 -0
  326. data/po/it/rbot-karma.po +0 -0
  327. data/po/it/rbot-keywords.po +24 -0
  328. data/po/it/rbot-lart.po +0 -0
  329. data/po/it/rbot-lastfm.po +172 -0
  330. data/po/it/rbot-linkbot.po +0 -0
  331. data/po/it/rbot-markov.po +20 -0
  332. data/po/it/rbot-math.po +0 -0
  333. data/po/it/rbot-modes.po +0 -0
  334. data/po/it/rbot-nickrecover.po +36 -0
  335. data/po/it/rbot-nickserv.po +104 -0
  336. data/po/it/rbot-nslookup.po +0 -0
  337. data/po/it/rbot-quakeauth.po +0 -0
  338. data/po/it/rbot-quiz.po +0 -0
  339. data/po/it/rbot-quotes.po +108 -0
  340. data/po/it/rbot-reaction.po +0 -0
  341. data/po/it/rbot-remind.po +0 -0
  342. data/po/it/rbot-remotectl.po +0 -0
  343. data/po/it/rbot-ri.po +0 -0
  344. data/po/it/rbot-roshambo.po +0 -0
  345. data/po/it/rbot-rot13.po +0 -0
  346. data/po/it/rbot-roulette.po +0 -0
  347. data/po/it/rbot-rss.po +20 -0
  348. data/po/it/rbot-salut.po +0 -0
  349. data/po/it/rbot-script.po +0 -0
  350. data/po/it/rbot-search.po +0 -0
  351. data/po/it/rbot-seen.po +0 -0
  352. data/po/it/rbot-shiritori.po +102 -0
  353. data/po/it/rbot-shortenurls.po +0 -0
  354. data/po/it/rbot-slashdot.po +0 -0
  355. data/po/it/rbot-spell.po +54 -0
  356. data/po/it/rbot-theyfightcrime.po +0 -0
  357. data/po/it/rbot-threat.po +0 -0
  358. data/po/it/rbot-time.po +0 -0
  359. data/po/it/rbot-topic.po +0 -0
  360. data/po/it/rbot-translator.po +77 -0
  361. data/po/it/rbot-tube.po +0 -0
  362. data/po/it/rbot-twitter.po +24 -0
  363. data/po/it/rbot-uno.po +564 -0
  364. data/po/it/rbot-urban.po +0 -0
  365. data/po/it/rbot-url.po +0 -0
  366. data/po/it/rbot-usermodes.po +0 -0
  367. data/po/it/rbot-wall.po +33 -0
  368. data/po/it/rbot-weather.po +0 -0
  369. data/po/it/rbot-wheelfortune.po +251 -0
  370. data/po/it/rbot-wow.po +0 -0
  371. data/po/it/rbot-wserver.po +0 -0
  372. data/po/it/rbot-youtube.po +64 -0
  373. data/po/it/rbot.po +1127 -0
  374. data/po/ja/rbot-alias.po +82 -0
  375. data/po/ja/rbot-autoop.po +0 -0
  376. data/po/ja/rbot-autorejoin.po +0 -0
  377. data/po/ja/rbot-azgame.po +194 -0
  378. data/po/ja/rbot-bans.po +0 -0
  379. data/po/ja/rbot-bash.po +0 -0
  380. data/po/ja/rbot-botsnack.po +0 -0
  381. data/po/ja/rbot-cal.po +3 -0
  382. data/po/ja/rbot-chanserv.po +0 -0
  383. data/po/ja/rbot-chucknorris.po +0 -0
  384. data/po/ja/rbot-debugger.po +0 -0
  385. data/po/ja/rbot-deepthoughts.po +0 -0
  386. data/po/ja/rbot-delicious.po +0 -0
  387. data/po/ja/rbot-dice.po +0 -0
  388. data/po/ja/rbot-dict.po +0 -0
  389. data/po/ja/rbot-dictclient.po +111 -0
  390. data/po/ja/rbot-digg.po +0 -0
  391. data/po/ja/rbot-eightball.po +0 -0
  392. data/po/ja/rbot-excuse.po +0 -0
  393. data/po/ja/rbot-factoids.po +107 -0
  394. data/po/ja/rbot-figlet.po +36 -0
  395. data/po/ja/rbot-fish.po +0 -0
  396. data/po/ja/rbot-forecast.po +0 -0
  397. data/po/ja/rbot-fortune.po +0 -0
  398. data/po/ja/rbot-freshmeat.po +0 -0
  399. data/po/ja/rbot-grouphug.po +18 -0
  400. data/po/ja/rbot-hl2.po +0 -0
  401. data/po/ja/rbot-host.po +3 -0
  402. data/po/ja/rbot-imdb.po +0 -0
  403. data/po/ja/rbot-insult.po +0 -0
  404. data/po/ja/rbot-iplookup.po +0 -0
  405. data/po/ja/rbot-karma.po +0 -0
  406. data/po/ja/rbot-keywords.po +24 -0
  407. data/po/ja/rbot-lart.po +0 -0
  408. data/po/ja/rbot-lastfm.po +172 -0
  409. data/po/ja/rbot-linkbot.po +0 -0
  410. data/po/ja/rbot-markov.po +20 -0
  411. data/po/ja/rbot-math.po +0 -0
  412. data/po/ja/rbot-modes.po +0 -0
  413. data/po/ja/rbot-nickrecover.po +36 -0
  414. data/po/ja/rbot-nickserv.po +104 -0
  415. data/po/ja/rbot-nslookup.po +0 -0
  416. data/po/ja/rbot-quakeauth.po +0 -0
  417. data/po/ja/rbot-quiz.po +0 -0
  418. data/po/ja/rbot-quotes.po +108 -0
  419. data/po/ja/rbot-reaction.po +0 -0
  420. data/po/ja/rbot-remind.po +0 -0
  421. data/po/ja/rbot-remotectl.po +0 -0
  422. data/po/ja/rbot-ri.po +0 -0
  423. data/po/ja/rbot-roshambo.po +0 -0
  424. data/po/ja/rbot-rot13.po +0 -0
  425. data/po/ja/rbot-roulette.po +0 -0
  426. data/po/ja/rbot-rss.po +20 -0
  427. data/po/ja/rbot-salut.po +0 -0
  428. data/po/ja/rbot-script.po +0 -0
  429. data/po/ja/rbot-search.po +0 -0
  430. data/po/ja/rbot-seen.po +0 -0
  431. data/po/ja/rbot-shiritori.po +115 -0
  432. data/po/ja/rbot-shortenurls.po +0 -0
  433. data/po/ja/rbot-slashdot.po +0 -0
  434. data/po/ja/rbot-spell.po +54 -0
  435. data/po/ja/rbot-theyfightcrime.po +0 -0
  436. data/po/ja/rbot-threat.po +0 -0
  437. data/po/ja/rbot-time.po +0 -0
  438. data/po/ja/rbot-topic.po +0 -0
  439. data/po/ja/rbot-translator.po +77 -0
  440. data/po/ja/rbot-tube.po +0 -0
  441. data/po/ja/rbot-twitter.po +24 -0
  442. data/po/ja/rbot-uno.po +512 -0
  443. data/po/ja/rbot-urban.po +0 -0
  444. data/po/ja/rbot-url.po +0 -0
  445. data/po/ja/rbot-usermodes.po +0 -0
  446. data/po/ja/rbot-wall.po +33 -0
  447. data/po/ja/rbot-weather.po +0 -0
  448. data/po/ja/rbot-wheelfortune.po +205 -0
  449. data/po/ja/rbot-wow.po +0 -0
  450. data/po/ja/rbot-wserver.po +0 -0
  451. data/po/ja/rbot-youtube.po +58 -0
  452. data/po/ja/rbot.po +999 -0
  453. data/po/rbot-alias.pot +83 -0
  454. data/po/rbot-autoop.pot +0 -0
  455. data/po/rbot-autorejoin.pot +0 -0
  456. data/po/rbot-azgame.pot +187 -0
  457. data/po/rbot-bans.pot +0 -0
  458. data/po/rbot-bash.pot +0 -0
  459. data/po/rbot-botsnack.pot +0 -0
  460. data/po/rbot-cal.pot +21 -0
  461. data/po/rbot-chanserv.pot +0 -0
  462. data/po/rbot-chucknorris.pot +0 -0
  463. data/po/rbot-debugger.pot +0 -0
  464. data/po/rbot-deepthoughts.pot +0 -0
  465. data/po/rbot-delicious.pot +0 -0
  466. data/po/rbot-dice.pot +0 -0
  467. data/po/rbot-dict.pot +0 -0
  468. data/po/rbot-dictclient.pot +112 -0
  469. data/po/rbot-digg.pot +0 -0
  470. data/po/rbot-eightball.pot +0 -0
  471. data/po/rbot-excuse.pot +0 -0
  472. data/po/rbot-factoids.pot +108 -0
  473. data/po/rbot-figlet.pot +37 -0
  474. data/po/rbot-fish.pot +0 -0
  475. data/po/rbot-forecast.pot +0 -0
  476. data/po/rbot-fortune.pot +0 -0
  477. data/po/rbot-freshmeat.pot +0 -0
  478. data/po/rbot-grouphug.pot +36 -0
  479. data/po/rbot-hl2.pot +0 -0
  480. data/po/rbot-host.pot +21 -0
  481. data/po/rbot-imdb.pot +0 -0
  482. data/po/rbot-insult.pot +0 -0
  483. data/po/rbot-iplookup.pot +0 -0
  484. data/po/rbot-karma.pot +0 -0
  485. data/po/rbot-keywords.pot +25 -0
  486. data/po/rbot-lart.pot +0 -0
  487. data/po/rbot-lastfm.pot +190 -0
  488. data/po/rbot-linkbot.pot +0 -0
  489. data/po/rbot-markov.pot +21 -0
  490. data/po/rbot-math.pot +0 -0
  491. data/po/rbot-modes.pot +0 -0
  492. data/po/rbot-nickrecover.pot +37 -0
  493. data/po/rbot-nickserv.pot +105 -0
  494. data/po/rbot-nslookup.pot +0 -0
  495. data/po/rbot-quakeauth.pot +0 -0
  496. data/po/rbot-quiz.pot +0 -0
  497. data/po/rbot-quotes.pot +109 -0
  498. data/po/rbot-reaction.pot +0 -0
  499. data/po/rbot-remind.pot +0 -0
  500. data/po/rbot-remotectl.pot +0 -0
  501. data/po/rbot-ri.pot +0 -0
  502. data/po/rbot-roshambo.pot +0 -0
  503. data/po/rbot-rot13.pot +0 -0
  504. data/po/rbot-roulette.pot +0 -0
  505. data/po/rbot-rss.pot +21 -0
  506. data/po/rbot-salut.pot +0 -0
  507. data/po/rbot-script.pot +0 -0
  508. data/po/rbot-search.pot +0 -0
  509. data/po/rbot-seen.pot +0 -0
  510. data/po/rbot-shiritori.pot +103 -0
  511. data/po/rbot-shortenurls.pot +0 -0
  512. data/po/rbot-slashdot.pot +0 -0
  513. data/po/rbot-spell.pot +55 -0
  514. data/po/rbot-theyfightcrime.pot +0 -0
  515. data/po/rbot-threat.pot +0 -0
  516. data/po/rbot-time.pot +0 -0
  517. data/po/rbot-topic.pot +0 -0
  518. data/po/rbot-translator.pot +78 -0
  519. data/po/rbot-tube.pot +0 -0
  520. data/po/rbot-twitter.pot +25 -0
  521. data/po/rbot-uno.pot +513 -0
  522. data/po/rbot-urban.pot +0 -0
  523. data/po/rbot-url.pot +0 -0
  524. data/po/rbot-usermodes.pot +0 -0
  525. data/po/rbot-wall.pot +33 -0
  526. data/po/rbot-weather.pot +0 -0
  527. data/po/rbot-wheelfortune.pot +206 -0
  528. data/po/rbot-wow.pot +0 -0
  529. data/po/rbot-wserver.pot +0 -0
  530. data/po/rbot-youtube.pot +59 -0
  531. data/po/rbot.pot +1004 -0
  532. data/po/zh_CN/rbot-alias.po +82 -0
  533. data/po/zh_CN/rbot-autoop.po +0 -0
  534. data/po/zh_CN/rbot-autorejoin.po +0 -0
  535. data/po/zh_CN/rbot-azgame.po +186 -0
  536. data/po/zh_CN/rbot-bans.po +0 -0
  537. data/po/zh_CN/rbot-bash.po +0 -0
  538. data/po/zh_CN/rbot-botsnack.po +0 -0
  539. data/po/zh_CN/rbot-cal.po +3 -0
  540. data/po/zh_CN/rbot-chanserv.po +0 -0
  541. data/po/zh_CN/rbot-chucknorris.po +0 -0
  542. data/po/zh_CN/rbot-debugger.po +0 -0
  543. data/po/zh_CN/rbot-deepthoughts.po +0 -0
  544. data/po/zh_CN/rbot-delicious.po +0 -0
  545. data/po/zh_CN/rbot-dice.po +0 -0
  546. data/po/zh_CN/rbot-dict.po +0 -0
  547. data/po/zh_CN/rbot-dictclient.po +111 -0
  548. data/po/zh_CN/rbot-digg.po +0 -0
  549. data/po/zh_CN/rbot-eightball.po +0 -0
  550. data/po/zh_CN/rbot-excuse.po +0 -0
  551. data/po/zh_CN/rbot-factoids.po +107 -0
  552. data/po/zh_CN/rbot-figlet.po +36 -0
  553. data/po/zh_CN/rbot-fish.po +0 -0
  554. data/po/zh_CN/rbot-forecast.po +0 -0
  555. data/po/zh_CN/rbot-fortune.po +0 -0
  556. data/po/zh_CN/rbot-freshmeat.po +0 -0
  557. data/po/zh_CN/rbot-grouphug.po +18 -0
  558. data/po/zh_CN/rbot-hl2.po +0 -0
  559. data/po/zh_CN/rbot-host.po +3 -0
  560. data/po/zh_CN/rbot-imdb.po +0 -0
  561. data/po/zh_CN/rbot-insult.po +0 -0
  562. data/po/zh_CN/rbot-iplookup.po +0 -0
  563. data/po/zh_CN/rbot-karma.po +0 -0
  564. data/po/zh_CN/rbot-keywords.po +24 -0
  565. data/po/zh_CN/rbot-lart.po +0 -0
  566. data/po/zh_CN/rbot-lastfm.po +172 -0
  567. data/po/zh_CN/rbot-linkbot.po +0 -0
  568. data/po/zh_CN/rbot-markov.po +20 -0
  569. data/po/zh_CN/rbot-math.po +0 -0
  570. data/po/zh_CN/rbot-modes.po +0 -0
  571. data/po/zh_CN/rbot-nickrecover.po +36 -0
  572. data/po/zh_CN/rbot-nickserv.po +104 -0
  573. data/po/zh_CN/rbot-nslookup.po +0 -0
  574. data/po/zh_CN/rbot-quakeauth.po +0 -0
  575. data/po/zh_CN/rbot-quiz.po +0 -0
  576. data/po/zh_CN/rbot-quotes.po +108 -0
  577. data/po/zh_CN/rbot-reaction.po +0 -0
  578. data/po/zh_CN/rbot-remind.po +0 -0
  579. data/po/zh_CN/rbot-remotectl.po +0 -0
  580. data/po/zh_CN/rbot-ri.po +0 -0
  581. data/po/zh_CN/rbot-roshambo.po +0 -0
  582. data/po/zh_CN/rbot-rot13.po +0 -0
  583. data/po/zh_CN/rbot-roulette.po +0 -0
  584. data/po/zh_CN/rbot-rss.po +20 -0
  585. data/po/zh_CN/rbot-salut.po +0 -0
  586. data/po/zh_CN/rbot-script.po +0 -0
  587. data/po/zh_CN/rbot-search.po +0 -0
  588. data/po/zh_CN/rbot-seen.po +0 -0
  589. data/po/zh_CN/rbot-shiritori.po +102 -0
  590. data/po/zh_CN/rbot-shortenurls.po +0 -0
  591. data/po/zh_CN/rbot-slashdot.po +0 -0
  592. data/po/zh_CN/rbot-spell.po +54 -0
  593. data/po/zh_CN/rbot-theyfightcrime.po +0 -0
  594. data/po/zh_CN/rbot-threat.po +0 -0
  595. data/po/zh_CN/rbot-time.po +0 -0
  596. data/po/zh_CN/rbot-topic.po +0 -0
  597. data/po/zh_CN/rbot-translator.po +77 -0
  598. data/po/zh_CN/rbot-tube.po +0 -0
  599. data/po/zh_CN/rbot-twitter.po +24 -0
  600. data/po/zh_CN/rbot-uno.po +512 -0
  601. data/po/zh_CN/rbot-urban.po +0 -0
  602. data/po/zh_CN/rbot-url.po +0 -0
  603. data/po/zh_CN/rbot-usermodes.po +0 -0
  604. data/po/zh_CN/rbot-wall.po +33 -0
  605. data/po/zh_CN/rbot-weather.po +0 -0
  606. data/po/zh_CN/rbot-wheelfortune.po +205 -0
  607. data/po/zh_CN/rbot-wow.po +0 -0
  608. data/po/zh_CN/rbot-wserver.po +0 -0
  609. data/po/zh_CN/rbot-youtube.po +58 -0
  610. data/po/zh_CN/rbot.po +1006 -0
  611. data/po/zh_TW/rbot-alias.po +82 -0
  612. data/po/zh_TW/rbot-autoop.po +0 -0
  613. data/po/zh_TW/rbot-autorejoin.po +0 -0
  614. data/po/zh_TW/rbot-azgame.po +186 -0
  615. data/po/zh_TW/rbot-bans.po +0 -0
  616. data/po/zh_TW/rbot-bash.po +0 -0
  617. data/po/zh_TW/rbot-botsnack.po +0 -0
  618. data/po/zh_TW/rbot-cal.po +3 -0
  619. data/po/zh_TW/rbot-chanserv.po +0 -0
  620. data/po/zh_TW/rbot-chucknorris.po +0 -0
  621. data/po/zh_TW/rbot-debugger.po +0 -0
  622. data/po/zh_TW/rbot-deepthoughts.po +0 -0
  623. data/po/zh_TW/rbot-delicious.po +0 -0
  624. data/po/zh_TW/rbot-dice.po +0 -0
  625. data/po/zh_TW/rbot-dict.po +0 -0
  626. data/po/zh_TW/rbot-dictclient.po +111 -0
  627. data/po/zh_TW/rbot-digg.po +0 -0
  628. data/po/zh_TW/rbot-eightball.po +0 -0
  629. data/po/zh_TW/rbot-excuse.po +0 -0
  630. data/po/zh_TW/rbot-factoids.po +107 -0
  631. data/po/zh_TW/rbot-figlet.po +36 -0
  632. data/po/zh_TW/rbot-fish.po +0 -0
  633. data/po/zh_TW/rbot-forecast.po +0 -0
  634. data/po/zh_TW/rbot-fortune.po +0 -0
  635. data/po/zh_TW/rbot-freshmeat.po +0 -0
  636. data/po/zh_TW/rbot-grouphug.po +18 -0
  637. data/po/zh_TW/rbot-hl2.po +0 -0
  638. data/po/zh_TW/rbot-host.po +3 -0
  639. data/po/zh_TW/rbot-imdb.po +0 -0
  640. data/po/zh_TW/rbot-insult.po +0 -0
  641. data/po/zh_TW/rbot-iplookup.po +0 -0
  642. data/po/zh_TW/rbot-karma.po +0 -0
  643. data/po/zh_TW/rbot-keywords.po +24 -0
  644. data/po/zh_TW/rbot-lart.po +0 -0
  645. data/po/zh_TW/rbot-lastfm.po +172 -0
  646. data/po/zh_TW/rbot-linkbot.po +0 -0
  647. data/po/zh_TW/rbot-markov.po +20 -0
  648. data/po/zh_TW/rbot-math.po +0 -0
  649. data/po/zh_TW/rbot-modes.po +0 -0
  650. data/po/zh_TW/rbot-nickrecover.po +36 -0
  651. data/po/zh_TW/rbot-nickserv.po +104 -0
  652. data/po/zh_TW/rbot-nslookup.po +0 -0
  653. data/po/zh_TW/rbot-quakeauth.po +0 -0
  654. data/po/zh_TW/rbot-quiz.po +0 -0
  655. data/po/zh_TW/rbot-quotes.po +108 -0
  656. data/po/zh_TW/rbot-reaction.po +0 -0
  657. data/po/zh_TW/rbot-remind.po +0 -0
  658. data/po/zh_TW/rbot-remotectl.po +0 -0
  659. data/po/zh_TW/rbot-ri.po +0 -0
  660. data/po/zh_TW/rbot-roshambo.po +0 -0
  661. data/po/zh_TW/rbot-rot13.po +0 -0
  662. data/po/zh_TW/rbot-roulette.po +0 -0
  663. data/po/zh_TW/rbot-rss.po +20 -0
  664. data/po/zh_TW/rbot-salut.po +0 -0
  665. data/po/zh_TW/rbot-script.po +0 -0
  666. data/po/zh_TW/rbot-search.po +0 -0
  667. data/po/zh_TW/rbot-seen.po +0 -0
  668. data/po/zh_TW/rbot-shiritori.po +102 -0
  669. data/po/zh_TW/rbot-shortenurls.po +0 -0
  670. data/po/zh_TW/rbot-slashdot.po +0 -0
  671. data/po/zh_TW/rbot-spell.po +54 -0
  672. data/po/zh_TW/rbot-theyfightcrime.po +0 -0
  673. data/po/zh_TW/rbot-threat.po +0 -0
  674. data/po/zh_TW/rbot-time.po +0 -0
  675. data/po/zh_TW/rbot-topic.po +0 -0
  676. data/po/zh_TW/rbot-translator.po +77 -0
  677. data/po/zh_TW/rbot-tube.po +0 -0
  678. data/po/zh_TW/rbot-twitter.po +24 -0
  679. data/po/zh_TW/rbot-uno.po +512 -0
  680. data/po/zh_TW/rbot-urban.po +0 -0
  681. data/po/zh_TW/rbot-url.po +0 -0
  682. data/po/zh_TW/rbot-usermodes.po +0 -0
  683. data/po/zh_TW/rbot-wall.po +33 -0
  684. data/po/zh_TW/rbot-weather.po +0 -0
  685. data/po/zh_TW/rbot-wheelfortune.po +205 -0
  686. data/po/zh_TW/rbot-wow.po +0 -0
  687. data/po/zh_TW/rbot-wserver.po +0 -0
  688. data/po/zh_TW/rbot-youtube.po +58 -0
  689. data/po/zh_TW/rbot.po +1034 -0
  690. data/setup.rb +800 -574
  691. metadata +723 -108
  692. data/data/rbot/contrib/plugins/figlet.rb +0 -20
  693. data/data/rbot/contrib/plugins/ri.rb +0 -83
  694. data/data/rbot/plugins/demauro.rb +0 -95
  695. data/data/rbot/plugins/google.rb +0 -53
  696. data/data/rbot/plugins/opme.rb +0 -19
  697. data/data/rbot/plugins/roshambo.rb +0 -54
  698. data/data/rbot/plugins/rubyurl.rb +0 -39
  699. data/data/rbot/plugins/tinyurl.rb +0 -39
  700. data/data/rbot/plugins/xmlrpc.rb.disabled +0 -52
  701. data/data/rbot/templates/levels.rbot +0 -32
  702. data/data/rbot/templates/users.rbot +0 -1
  703. data/lib/rbot/auth.rb +0 -314
  704. data/lib/rbot/channel.rb +0 -54
  705. data/lib/rbot/httputil.rb +0 -309
  706. data/lib/rbot/utils.rb +0 -83
@@ -1,36 +1,90 @@
1
- # Plugin for the Ruby IRC bot (http://linuxbrit.co.uk/rbot/)
2
- # (c) 2005 Mark Kretschmann <markey@web.de>
3
- # Licensed under GPL V2.
1
+ #-- vim:sw=2:et
2
+ #++
3
+ #
4
+ # :title: Grouphug Plugin for rbot
5
+ #
6
+ # Author:: Mark Kretschmann <markey@web.de>
7
+ # Author:: Casey Link <unnamedrambler@gmail.com>
8
+ # Copyright:: (C) 2005 Mark Kretschmann
9
+ # Copyright:: (C) 2008 Casey Link
10
+ # License:: GPL v2
4
11
 
5
- require "net/http"
12
+ class GrouphugPlugin < Plugin
13
+ REG = Regexp.new('<div class="content">\s*<p>(.*?)</p>\s+</div>', Regexp::MULTILINE)
14
+ REGPOST = Regexp.new('title>(.*?) \| Group Hug')
15
+ def initialize
16
+ super
17
+ @confessions = Array.new
18
+ end
6
19
 
20
+ def help( plugin, topic="" )
21
+ return _("Grouphug plugin. Confess! Usage: 'confess' for random confession, 'confess <number>' for specific one, 'confess <confession>' to share your own confession. Confessions must be at least 10 words.")
22
+ end
7
23
 
8
- class GrouphugPlugin < Plugin
9
- def help( plugin, topic="" )
10
- "Grouphug plugin. Confess! Usage: 'confess' for random confession, 'confess <number>' for specific one."
24
+ def post_confession(m, params)
25
+ c = params[:confession]
26
+ if c.length < 10
27
+ diff = 10 - c.length
28
+ m.reply _("Confession must be at least 10 words. You need %{m} more.") % {:m => diff}
29
+ return
30
+ end
31
+ uri = "http://beta.grouphug.us/confess"
32
+ form_id = "form_id=confession_node_form"
33
+ op = "op=Submit"
34
+ changed = "changed="
35
+ body = "body=#{c}"
36
+ msg = [form_id,body,changed,op].join("&")
37
+
38
+ response = bot.httputil.post(uri, msg)
39
+ debug response.body
40
+ if response.class == Net::HTTPOK
41
+ num = response.body.scan(REGPOST)
42
+ m.reply _("Confession posted: http://beta.grouphug.us/confessions/%{n}") % {:n => num}
43
+ else
44
+ m.reply _("I couldn't share your confession.")
11
45
  end
46
+ end
12
47
 
13
- def privmsg( m )
14
- path = "/random"
15
- path = "/confessions/#{m.params()}" if m.params()
16
- begin
17
- data = bot.httputil.get(URI.parse("http://grouphug.us/#{path}"))
18
48
 
19
- reg = Regexp.new( '(<td class="conf-text")(.*?)(<p>)(.*?)(</p>)', Regexp::MULTILINE )
20
- confession = reg.match( data )[4]
21
- confession.gsub!( /<.*?>/, "" ) # Remove html tags
22
- confession.gsub!( "\t", "" ) # Remove tab characters
49
+ def confess(m, params)
50
+ opts = { :cache => false }
51
+ path = "random"
52
+ begin
53
+ # Fetch a specific question - separate from cache
54
+ if params[:num]
55
+ path = "confessions/#{params[:num]}"
56
+ opts.delete(:cache)
57
+ data = @bot.httputil.get("http://grouphug.us/#{path}", opts)
23
58
 
24
- @bot.say(m.replyto, confession)
25
- rescue
26
- m.reply "failed to connect to grouphug.us"
59
+ res = data.scan(REG)
60
+ confession = res[0][0].ircify_html
61
+ confession = "no confession ##{params[:num]} found" if confession.empty? and params[:num]
62
+ m.reply confession
63
+ else # Cache random confessions
64
+ if @confessions.empty?
65
+ data = @bot.httputil.get("http://grouphug.us/#{path}", opts)
66
+ res = data.scan(REG)
67
+ res.each do |quote|
68
+ @confessions << quote[0].ircify_html
69
+ end
27
70
  end
28
- end
71
+ confession = @confessions.pop
72
+ m.reply confession
73
+ end
74
+ rescue
75
+ m.reply "failed to connect to grouphug.us"
76
+ end
77
+ end
29
78
  end
30
79
 
31
80
 
32
81
  plugin = GrouphugPlugin.new
33
82
 
34
- plugin.register("grouphug")
35
- plugin.register("confess")
83
+ plugin.default_auth('create', false)
84
+
85
+ plugin.map "grouphug [:num]",
86
+ :thread => true, :action => :confess, :requirements => { :num => /\d+/ }
87
+ plugin.map "confess [:num]",
88
+ :thread => true, :action => :confess, :requirements => { :num => /\d+/ }
89
+ plugin.map "confess *confession", :thread => true, :action => :post_confession, :auth_path => 'create'
36
90
 
@@ -0,0 +1,97 @@
1
+ #-- vim:sw=2:et
2
+ #++
3
+ #
4
+ # :title: Half-Life 2 plugin for rbot
5
+ #
6
+ # Author:: Ole Christian Rynning <oc@rynning.no>
7
+ # Author:: Andrew Northall <cubehat@gmail.com>
8
+ # Copyright:: (C) 2006 Ole Christian Rynning & Andrew Northall
9
+ # License:: GPL v2
10
+ #
11
+ # Simple Half-Life 2 (Source Engine) plugin to query online
12
+ # servers to see if its online and kicking and how many users.
13
+ #
14
+ # Added 2 seconds timeout to the response. And sockets are now
15
+ # closing properly.
16
+ #
17
+ # Server presets can be added by using 'hl2 add name addr:port'
18
+ # and 'hl2 del name'. Once presets are added they are accessed
19
+ # as 'hl2 name'.
20
+
21
+ require 'socket'
22
+ require 'timeout'
23
+
24
+ class HL2Plugin < Plugin
25
+
26
+ A2S_INFO = "\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00"
27
+
28
+ TIMEOUT = 2
29
+
30
+ def a2s_info(addr, port)
31
+ socket = UDPSocket.new()
32
+ begin
33
+ socket.send(A2S_INFO, 0, addr, port.to_i)
34
+ response = nil
35
+
36
+ timeout(TIMEOUT) do
37
+ response = socket.recvfrom(1400,0)
38
+ end
39
+ rescue Exception => e
40
+ error e
41
+ end
42
+
43
+ socket.close()
44
+ response ? response.first.unpack("iACZ*Z*Z*Z*sCCCaaCCZ*") : nil
45
+ end
46
+
47
+ def help(plugin, topic="")
48
+ case topic
49
+ when ""
50
+ return "hl2 'server:port'/'preset name' => show basic information about the given server. See also 'hl2 add' and 'hl2 del'"
51
+ when "add"
52
+ return "hl2 add 'name' 'server:port' => add a preset."
53
+ when "del"
54
+ return "hl2 del 'name' => remove a preset."
55
+ end
56
+ end
57
+
58
+ def hl2(m, params)
59
+ addr, port = params[:conn_str].split(':')
60
+ if port == nil
61
+ @registry.each_key do
62
+ |key|
63
+ if addr.downcase == key.downcase
64
+ addr, port = @registry[key]
65
+ end
66
+ end
67
+ end
68
+ m.reply "invalid server" if port == nil
69
+ return if port == nil
70
+ info = a2s_info(addr, port)
71
+ if info
72
+ m.reply "#{info[3]} (#{info[6]}): #{info[8]}/#{info[9]} - #{info[4]}"
73
+ else
74
+ m.reply "Couldn't connect to #{params[:conn_str]}"
75
+ end
76
+ end
77
+
78
+ def add_server(m, params)
79
+ @registry[params[:name]] = params[:conn_str].split(':')
80
+ m.okay
81
+ end
82
+
83
+ def rem_server(m, params)
84
+ if @registry.has_key?(params[:name]) == false
85
+ m.reply "but i don't know it!"
86
+ return
87
+ end
88
+ @registry.delete params[:name]
89
+ m.okay
90
+ end
91
+ end
92
+
93
+ plugin = HL2Plugin.new
94
+ plugin.default_auth('edit', false)
95
+ plugin.map 'hl2 :conn_str', :thread => true
96
+ plugin.map 'hl2 add :name :conn_str', :thread => true, :action => :add_server, :auth_path => 'edit'
97
+ plugin.map 'hl2 del :name', :thread => true, :action => :rem_server, :auth_path => 'edit'
@@ -1,13 +1,22 @@
1
1
  class HostPlugin < Plugin
2
+ Config.register Config::StringValue.new('host.path',
3
+ :default => 'host',
4
+ :desc => _('Path to the host program'))
5
+
2
6
  def help(plugin, topic="")
3
7
  "host <domain> => query nameserver about domain names and zones for <domain>"
4
8
  end
9
+
10
+ def host_path
11
+ @bot.config["host.path"]
12
+ end
13
+
5
14
  def privmsg(m)
6
15
  unless(m.params =~ /^(\w|-|\.)+$/)
7
16
  m.reply "incorrect usage: " + help(m.plugin)
8
17
  return
9
18
  end
10
- m.reply Utils.safe_exec("host", m.params)
19
+ m.reply Utils.safe_exec(host_path, m.params)
11
20
  end
12
21
  end
13
22
  plugin = HostPlugin.new
@@ -23,6 +23,7 @@ class HttpPlugin < Plugin
23
23
  end
24
24
  def cleanup
25
25
  @http_server.shutdown
26
+ super
26
27
  end
27
28
  def help(plugin, topic="")
28
29
  "no help yet"
@@ -1,92 +1,556 @@
1
- # IMDB plugin for RubyBot
2
- # (c) 2005 Arnaud Cornet <arnaud.cornet@gmail.com>
3
- # Licensed under MIT License.
4
-
5
- require 'net/http'
6
- require 'cgi'
7
- require 'uri/common'
1
+ #-- vim:sw=2:et
2
+ #++
3
+ #
4
+ # :title: IMDB plugin for rbot
5
+ #
6
+ # Author:: Arnaud Cornet <arnaud.cornet@gmail.com>
7
+ # Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
8
+ #
9
+ # Copyright:: (C) 2005 Arnaud Cornet
10
+ # Copyright:: (C) 2007 Giuseppe Bilotta
11
+ #
12
+ # License:: MIT license
8
13
 
9
14
  class Imdb
15
+ IMDB = "http://us.imdb.com"
16
+ TITLE_OR_NAME_MATCH = /<a href="(\/(?:title|name)\/(?:tt|nm)[0-9]+\/?)[^"]*"(?:[^>]*)>([^<]*)<\/a>/
17
+ TITLE_MATCH = /<a href="(\/title\/tt[0-9]+\/?)[^"]*"(?:[^>]*)>([^<]*)<\/a>/
18
+ NAME_MATCH = /<a href="(\/name\/nm[0-9]+\/?)[^"]*"(?:[^>]*)>([^<]*)<\/a>/
19
+ CREDIT_NAME_MATCH = /#{NAME_MATCH}<\/td><td[^>]+> \.\.\. <\/td><td[^>]+>(.+?)<\/td>/
20
+ FINAL_ARTICLE_MATCH = /, ([A-Z]\S{0,2})$/
21
+
22
+ MATCHER = {
23
+ :title => TITLE_MATCH,
24
+ :name => NAME_MATCH,
25
+ :both => TITLE_OR_NAME_MATCH
26
+ }
27
+
10
28
  def initialize(bot)
11
29
  @bot = bot
12
30
  end
13
31
 
14
- def search(rawstr)
15
- str = URI.escape(rawstr)
16
- @http = @bot.httputil.get_proxy(URI.parse("http://us.imdb.com/find?q=#{str}"))
17
- @http.start
32
+ def search(rawstr, rawopts={})
33
+ str = CGI.escape(rawstr)
34
+ str << ";site=aka" if @bot.config['imdb.aka']
35
+ opts = rawopts.dup
36
+ opts[:type] = :both unless opts[:type]
37
+ return do_search(str, opts)
38
+ end
39
+
40
+ def do_search(str, opts={})
41
+ resp = nil
18
42
  begin
19
- resp, data = @http.get("/find?q=#{str}", "User-Agent" => "Mozilla/5.0")
20
- rescue Net::ProtoRetriableError => detail
21
- head = detail.data
22
- if head.code == "301" or head.code == "302"
23
- return head['location'].gsub(/http:\/\/us.imdb.com/, "").gsub(/\?.*/, "")
24
- end
43
+ resp = @bot.httputil.get_response(IMDB + "/find?q=#{str}",
44
+ :max_redir => -1)
45
+ rescue Exception => e
46
+ error e.message
47
+ warning e.backtrace.join("\n")
48
+ return nil
25
49
  end
50
+
51
+
52
+ matcher = MATCHER[opts[:type]]
53
+
26
54
  if resp.code == "200"
27
- m = /<a href="(\/title\/tt[0-9]+\/?)[^"]*"(:?[^>]*)>([^<]*)<\/a>/.match(resp.body)
28
- if m
29
- url = m[1]
30
- title = m[2]
31
- return url
55
+ m = []
56
+ m << matcher.match(resp.body) if @bot.config['imdb.popular']
57
+ if resp.body.match(/\(Exact Matches\)<\/b>/) and @bot.config['imdb.exact']
58
+ m << matcher.match($')
59
+ end
60
+ m.compact!
61
+ unless m.empty?
62
+ return m.map { |mm|
63
+ mm[1]
64
+ }.uniq
32
65
  end
33
66
  elsif resp.code == "302"
34
- return resp['location'].gsub(/http:\/\/us.imdb.com/, "").gsub(/\?.*/, "")
67
+ debug "automatic redirection"
68
+ new_loc = resp['location'].gsub(IMDB, "")
69
+ if new_loc.match(/\/find\?q=(.*)/)
70
+ return do_search($1, opts)
71
+ else
72
+ return [new_loc.gsub(/\?.*/, "")]
73
+ end
35
74
  end
36
75
  return nil
37
76
  end
38
77
 
39
- def info(rawstr)
40
- sr = search(rawstr)
41
- if !sr
78
+ def info(rawstr, opts={})
79
+ debug opts.inspect
80
+ urls = search(rawstr, opts)
81
+ debug urls
82
+ if urls.nil_or_empty?
42
83
  debug "IMDB: search returned NIL"
43
84
  return nil
44
85
  end
45
- resp, data = @http.get(sr, "User-Agent" =>
46
- "Mozilla/5.0 (compatible; Konqueror/3.1; Linux)")
86
+ results = []
87
+ urls.each { |sr|
88
+ type = sr.match(/^\/([^\/]+)\//)[1].downcase.intern rescue nil
89
+ case type
90
+ when :title
91
+ results << info_title(sr, opts)
92
+ when :name
93
+ results << info_name(sr, opts)
94
+ else
95
+ results << "#{sr}"
96
+ end
97
+ }
98
+ return results
99
+ end
100
+
101
+ def grab_info(info, body)
102
+ /<div class="info">\s+<h5>#{info}:<\/h5>\s+(.*?)<\/div>/mi.match(body)[1] rescue nil
103
+ end
104
+
105
+ def fix_article(org_tit)
106
+ title = org_tit.dup
107
+ debug title.inspect
108
+ if title.match(/^"(.*)"$/)
109
+ return "\"#{fix_article($1)}\""
110
+ end
111
+ if @bot.config['imdb.fix_article'] and title.gsub!(FINAL_ARTICLE_MATCH, '')
112
+ art = $1.dup
113
+ debug art.inspect
114
+ if art[-1,1].match(/[A-Za-z]/)
115
+ art << " "
116
+ end
117
+ return art + title
118
+ end
119
+ return title
120
+ end
121
+
122
+ def info_title(sr, opts={})
123
+ resp = nil
124
+ begin
125
+ resp = @bot.httputil.get_response(IMDB + sr, :max_redir => -1)
126
+ rescue Exception => e
127
+ error e.message
128
+ warning e.backtrace.join("\n")
129
+ return nil
130
+ end
131
+
132
+ info = []
133
+
47
134
  if resp.code == "200"
48
135
  m = /<title>([^<]*)<\/title>/.match(resp.body)
49
136
  return nil if !m
50
- title = CGI.unescapeHTML(m[1])
137
+ title_date = m[1]
138
+ pre_title, date, extra = title_date.scan(/^(.*)\((\d\d\d\d(?:\/[IV]+)?)\)\s*(.+)?$/).first
139
+ pre_title.strip!
140
+ title = fix_article(pre_title.ircify_html)
51
141
 
52
- m = /<b>([0-9.]+)\/10<\/b> \(([0-9,]+) votes?\)/.match(resp.body)
53
- return nil if !m
54
- score = m[1]
55
- votes = m[2]
142
+ dir = nil
143
+ data = grab_info(/Directors?/, resp.body)
144
+ if data
145
+ dir = data.scan(NAME_MATCH).map { |url, name|
146
+ name.ircify_html
147
+ }.join(', ')
148
+ end
149
+
150
+ country = nil
151
+ data = grab_info(/Country/, resp.body)
152
+ if data
153
+ country = data.ircify_html.gsub(' / ','/')
154
+ end
155
+
156
+ info << [title, "(#{country}, #{date})", extra, dir ? "[#{dir}]" : nil, opts[:nourl] ? nil : ": http://www.imdb.com#{sr}"].compact.join(" ")
157
+
158
+ return info if opts[:title_only]
159
+
160
+ if opts[:characters]
161
+ info << resp.body.scan(CREDIT_NAME_MATCH).map { |url, name, role|
162
+ "%s: %s" % [name, role.ircify_html]
163
+ }.join('; ')
164
+ return info
165
+ end
166
+
167
+ ratings = "no votes"
168
+ m = /<b>([0-9.]+)\/10<\/b>\n?\r?\s+<small>\(<a href="ratings">([0-9,]+) votes?<\/a>\)<\/small>/.match(resp.body)
169
+ if m
170
+ ratings = "#{m[1]}/10 (#{m[2]} voters)"
171
+ end
56
172
 
57
173
  genre = Array.new
58
174
  resp.body.scan(/<a href="\/Sections\/Genres\/[^\/]+\/">([^<]+)<\/a>/) do |gnr|
59
175
  genre << gnr
60
176
  end
61
- return ["http://us.imdb.com" + sr, title, score, votes,
62
- genre]
177
+
178
+ plot = nil
179
+ data = grab_info(/Plot (?:Outline|Summary)/, resp.body)
180
+ if data
181
+ plot = "Plot: " + data.ircify_html.gsub(/\s+more$/,'')
182
+ end
183
+
184
+ info << ["Ratings: " << ratings, "Genre: " << genre.join('/') , plot].compact.join(". ")
185
+
186
+ return info
63
187
  end
64
188
  return nil
65
189
  end
190
+
191
+ def info_name(sr, opts={})
192
+ resp = nil
193
+ begin
194
+ resp = @bot.httputil.get_response(IMDB + sr, :max_redir => -1)
195
+ rescue Exception => e
196
+ error e.message
197
+ warning e.backtrace.join("\n")
198
+ return nil
199
+ end
200
+
201
+ info = []
202
+
203
+ if resp.code == "200"
204
+ m = /<title>([^<]*)<\/title>/.match(resp.body)
205
+ return nil if !m
206
+ name = m[1]
207
+
208
+ info << "#{name}"
209
+ info.last << " : http://www.imdb.com#{sr}" unless opts[:nourl]
210
+
211
+ return info if opts[:name_only]
212
+
213
+ if opts[:movies_by_year]
214
+ filmoyear = @bot.httputil.get(IMDB + sr + "filmoyear")
215
+ if filmoyear
216
+ info << filmoyear.scan(/#{TITLE_MATCH} \((\d\d\d\d)\)[^\[\n]*((?:\s+\[[^\]]+\](?:\s+\([^\[<]+\))*)+)\s+</)
217
+ end
218
+ return info
219
+ end
220
+
221
+ birth = nil
222
+ data = grab_info("Date of Birth", resp.body)
223
+ if data
224
+ birth = "Birth: #{data.ircify_html.gsub(/\s+more$/,'')}"
225
+ end
226
+
227
+ death = nil
228
+ data = grab_info("Date of Death", resp.body)
229
+ if data
230
+ death = "Death: #{data.ircify_html.gsub(/\s+more$/,'')}"
231
+ end
232
+
233
+ info << [birth, death].compact.join('. ') if birth or death
234
+
235
+ movies = {}
236
+
237
+ filmorate = nil
238
+ begin
239
+ filmorate = @bot.httputil.get(IMDB + sr + "filmorate")
240
+ rescue Exception
241
+ end
242
+
243
+ if filmorate
244
+ filmorate.scan(/<div class="filmo">.*?<a href="\/title.*?<\/div>/m) { |str|
245
+ what = str.match(/<a name="[^"]+">([^<]+)<\/a>/)[1] rescue nil
246
+ next unless what
247
+ movies[what] = str.scan(TITLE_MATCH)[0..2].map { |url, tit|
248
+ fix_article(tit.ircify_html)
249
+ }
250
+ }
251
+ end
252
+
253
+ preferred = ['Actor', 'Director']
254
+ if resp.body.match(/Jump to filmography as:&nbsp;(.*?)<\/div>/)
255
+ txt = $1
256
+ preferred = txt.scan(/<a[^>]+>([^<]+)<\/a>/)[0..2].map { |pref|
257
+ pref.first
258
+ }
259
+ end
260
+
261
+ unless movies.empty?
262
+ all_keys = movies.keys.sort
263
+ debug all_keys.inspect
264
+ keys = []
265
+ preferred.each { |key|
266
+ keys << key if all_keys.include? key
267
+ }
268
+ keys = all_keys if keys.empty?
269
+ ar = []
270
+ keys.each { |key|
271
+ ar << key.dup
272
+ ar.last << ": " + movies[key].join('; ')
273
+ }
274
+ info << ar.join('. ')
275
+ end
276
+ return info
277
+
278
+ end
279
+ return nil
280
+ end
281
+
282
+ def year_movies(urls, years_txt_org, role_req)
283
+ years_txt = years_txt_org.dup
284
+ years_txt.sub!(/^'/,'')
285
+ years_txt = "9#{years_txt}" if years_txt.match(/^\d\ds?$/)
286
+ years_txt = "1#{years_txt}" if years_txt.match(/^\d\d\ds?$/)
287
+
288
+ years = []
289
+ case years_txt
290
+ when /^\d\d\d\d$/
291
+ years << years_txt
292
+ when /^(\d\d\d\d)s$/
293
+ base = $1.to_i
294
+ base.upto(base+9) { |year|
295
+ years << year.to_s
296
+ }
297
+ end
298
+
299
+ urls.map { |url|
300
+ info = info_name(url, :movies_by_year => true)
301
+
302
+ debug info.inspect
303
+
304
+ name_url = info.first
305
+ data = info[1]
306
+
307
+ movies = []
308
+ # Sort by pre-title putting movies before TV series
309
+ data.sort { |a, b|
310
+ aclip = a[1][0,5]
311
+ bclip = b[1][0,5]
312
+ quot = '&#34;'
313
+ (aclip == quot ? 1 : -1) <=> (bclip == quot ? 1 : -1)
314
+ }.each { |url, pre_title, year, pre_roles|
315
+ next unless years.include?(year)
316
+ title = fix_article(pre_title.ircify_html)
317
+ if title[0] == ?" and not @bot.config['imdb.tv_series_in_movies']
318
+ next
319
+ end
320
+ title << " (#{year})" unless years.length == 1
321
+ role_array = []
322
+ pre_roles.strip.scan(/\[([^\]]+)\]((?:\s+\([^\[]+\))+)?/) { |txt, comm|
323
+ role = nil
324
+ extra = nil
325
+ if txt.match(/^(.*)\s+\.\.\.\.\s+(.*)$/)
326
+ role = $1
327
+ extra = "(#{$2.ircify_html})"
328
+ else
329
+ role = txt
330
+ end
331
+ next if role_req and not role.match(/^#{role_req}/i)
332
+ if comm
333
+ extra ||= ""
334
+ extra += comm.ircify_html if comm
335
+ end
336
+ role_array << [role, extra]
337
+ }
338
+ next if role_req and role_array.empty?
339
+
340
+ roles = role_array.map { |ar|
341
+ if role_req
342
+ ar[1] # works for us both if it's nil and if it's something
343
+ else
344
+ ar.compact.join(" ")
345
+ end
346
+ }.compact.join(', ')
347
+ roles = nil if roles.empty?
348
+ movies << [roles, title].compact.join(": ")
349
+ }
350
+
351
+ if movies.empty?
352
+ [name_url, nil]
353
+ else
354
+ [name_url, movies.join(" | ")]
355
+ end
356
+ }
357
+ end
358
+
359
+ def name_in_movie(name_urls, movie_urls)
360
+ info = []
361
+ movie_urls.each { |movie|
362
+ title_info = info_title(movie, :title_only => true)
363
+ valid = []
364
+
365
+ data = @bot.httputil.get(IMDB + movie + "fullcredits")
366
+ data.scan(CREDIT_NAME_MATCH).each { |url, name, role|
367
+ valid << [url, name.ircify_html, role.ircify_html] if name_urls.include?(url)
368
+ }
369
+ valid.each { |url, name, role|
370
+ info << "%s : %s was %s in %s" % [name, IMDB + url, role, title_info]
371
+ }
372
+ }
373
+ return info
374
+ end
375
+
376
+
66
377
  end
67
378
 
68
379
  class ImdbPlugin < Plugin
380
+ Config.register Config::BooleanValue.new('imdb.aka',
381
+ :default => true,
382
+ :desc => "Look for IMDB matches also in translated titles and other 'also known as' information")
383
+ Config.register Config::BooleanValue.new('imdb.popular',
384
+ :default => true,
385
+ :desc => "Display info on popular IMDB entries matching the request closely")
386
+ Config.register Config::BooleanValue.new('imdb.exact',
387
+ :default => true,
388
+ :desc => "Display info on IMDB entries matching the request exactly")
389
+ Config.register Config::BooleanValue.new('imdb.fix_article',
390
+ :default => false,
391
+ :desc => "Try to detect an article placed at the end and move it in front of the title")
392
+ Config.register Config::BooleanValue.new('imdb.tv_series_in_movies',
393
+ :default => false,
394
+ :desc => "Whether searching movies by person/year should also return TV series")
395
+
69
396
  def help(plugin, topic="")
70
- "imdb <string> => search http://www.imdb.org for <string>"
397
+ case plugin
398
+ when "movies"
399
+ "movies by <who> in <years> [as <role>] => display the movies in the <years> where which <who> was <role>; <role> can be one of actor, actress, director or anything: if it's omitted, the role is defined by the prefix: \"movies by ...\" implies director, \"movies with ...\" implies actor or actress; the years can be specified as \"in the 60s\" or as \"in 1953\""
400
+ when /characters?/
401
+ "character played by <who> in <movie> => show the character played by <who> in movie <movie>. characters in <movie> => show the actors and characters in movie <movie>"
402
+ else
403
+ "imdb <string> => search http://www.imdb.org for <string>: prefix <string> with 'name' or 'title' if you only want to search for people or films respectively, e.g.: imdb name ed wood. see also movies and characters"
404
+ end
71
405
  end
72
406
 
73
- def privmsg(m)
74
- unless(m.params && m.params.length > 0)
75
- m.reply "incorrect usage: " + help(m.plugin)
407
+ attr_reader :i
408
+
409
+ TITLE_URL = %r{^http://(?:[^.]+\.)?imdb.com(/title/tt\d+/)}
410
+ NAME_URL = %r{^http://(?:[^.]+\.)?imdb.com(/name/nm\d+/)}
411
+ def imdb_filter(s)
412
+ loc = Utils.check_location(s, TITLE_URL)
413
+ if loc
414
+ sr = loc.first.match(TITLE_URL)[1]
415
+ extra = $2 # nothign for the time being, could be fullcredits or whatever
416
+ res = i.info_title(sr, :nourl => true, :characters => (extra == 'fullcredits'))
417
+ debug res
418
+ if res
419
+ return {:title => res.first, :content => res.last}
420
+ else
421
+ return nil
422
+ end
423
+ end
424
+ loc = Utils.check_location(s, NAME_URL)
425
+ if loc
426
+ sr = loc.first.match(NAME_URL)[1]
427
+ extra = $2 # nothing for the time being, could be filmoyear or whatever
428
+ res = i.info_name(sr, :nourl => true, :movies_by_year => (extra == 'filmoyear'))
429
+ debug res
430
+ if res
431
+ name = res.shift
432
+ return {:title => name, :content => res.join(". ")}
433
+ else
434
+ return nil
435
+ end
436
+ end
437
+ return nil
438
+ end
439
+
440
+ def initialize
441
+ super
442
+ @i = Imdb.new(@bot)
443
+ @bot.register_filter(:imdb, :htmlinfo) { |s| imdb_filter(s) }
444
+ end
445
+
446
+ # Find a person or movie on IMDB. A :type (name/title, default both) can be
447
+ # specified to limit the search to either.
448
+ #
449
+ def imdb(m, params)
450
+ if params[:movie]
451
+ movie = params[:movie].to_s
452
+ info = i.info(movie, :type => :title, :characters => true)
453
+ else
454
+ what = params[:what].to_s
455
+ type = params[:type].intern
456
+ info = i.info(what, :type => type)
457
+ if !info
458
+ m.reply "nothing found for #{what}"
459
+ return nil
460
+ end
461
+ end
462
+ if info.length == 1
463
+ m.reply Utils.decode_html_entities(info.first.join("\n"))
464
+ else
465
+ m.reply info.map { |si|
466
+ Utils.decode_html_entities si.join(" | ")
467
+ }.join("\n")
468
+ end
469
+ end
470
+
471
+ # Find the movies with a participation of :who in the year :year
472
+ # TODO: allow year to be either a year or a decade ('[in the] 1960s')
473
+ #
474
+ def movies(m, params)
475
+ who = params[:who].to_s
476
+ years = params[:years]
477
+ role = params[:role]
478
+ if role and role.downcase == 'anything'
479
+ role = nil
480
+ elsif not role
481
+ case params[:prefix].intern
482
+ when :with
483
+ role = /actor|actress/i
484
+ when :by
485
+ role = 'director'
486
+ end
487
+ end
488
+
489
+ name_urls = i.search(who, :type => :name)
490
+ unless name_urls
491
+ m.reply "nothing found about #{who}, sorry"
76
492
  return
77
493
  end
78
494
 
79
- i = Imdb.new(@bot)
80
- info = i.info(m.params)
81
- if !info
82
- m.reply "Nothing found for #{m.params}"
83
- return nil
495
+ movie_urls = i.year_movies(name_urls, years, role)
496
+ debug movie_urls.inspect
497
+ debug movie_urls[0][1]
498
+
499
+ if movie_urls.length == 1 and movie_urls[0][1]
500
+ m.reply movie_urls.join("\n")
501
+ else
502
+ m.reply movie_urls.map { |si|
503
+ si[1] = "no movies in #{years}" unless si[1]
504
+ Utils.decode_html_entities si.join(" | ")
505
+ }.join("\n")
506
+ end
507
+ end
508
+
509
+ # Find the character played by :who in :movie
510
+ #
511
+ def character(m, params)
512
+ who = params[:who].to_s
513
+ movie = params[:movie].to_s
514
+
515
+ name_urls = i.search(who, :type => :name)
516
+ unless name_urls
517
+ m.reply "nothing found about #{who}, sorry"
518
+ return
519
+ end
520
+
521
+ movie_urls = i.search(movie, :type => :title)
522
+ unless movie_urls
523
+ m.reply "nothing found about #{who}, sorry"
524
+ return
525
+ end
526
+
527
+ info = i.name_in_movie(name_urls, movie_urls)
528
+ if info.empty?
529
+ m.reply "nothing found about #{who} in #{movie}, sorry"
530
+ else
531
+ m.reply info.join("\n")
532
+ end
533
+ end
534
+
535
+ # Report the characters in movie :movie
536
+ #
537
+ def characters(m, params)
538
+ movie = params[:movie].to_s
539
+
540
+ urls = i.search(movie, :type => :title)
541
+ unless urls
542
+ m.reply "nothing found about #{movie}"
84
543
  end
85
- m.reply "#{info[1]} : #{info[0]}"
86
- m.reply "Ratings: #{info[2]}/10 (#{info[3]} voters). Genre: #{info[4].join('/')}"
544
+
87
545
  end
546
+
88
547
  end
89
548
 
90
549
  plugin = ImdbPlugin.new
91
- plugin.register("imdb")
550
+
551
+ plugin.map "imdb [:type] *what", :requirements => { :type => /name|title/ }, :defaults => { :type => 'both' }
552
+ plugin.map "movies :prefix *who in [the] :years [as :role]", :requirements => { :prefix => /with|by|from/, :years => /'?\d+s?/ }
553
+ plugin.map "character [played] by *who in *movie"
554
+ plugin.map "character of *who in *movie"
555
+ plugin.map "characters in *movie", :action => :imdb
92
556