Guest User

Untitled

a guest
Jun 21st, 2018
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.43 KB | None | 0 0
  1. require 'rubygems'
  2. require 'xmpp4r'
  3. require "iconv"
  4. require "nkf"
  5. require "kconv"
  6. require "uri"
  7.  
  8. /*
  9. # in nadokarc (NADOKA_Config)
  10. BotFiles = [
  11. 'irchat'
  12. ]
  13.  
  14. BotConfig = [
  15. {
  16. :name => :irchat,
  17. :user => "server_account@example.com",
  18. :pass => "please-write-your-password",
  19. :patterns => ["Trapezoid", "とらぺ", "トラペ" ,"おおたけ", "はると", "悠人", "ハルト"],
  20. :channels => ["#reply@tig", "trapezoid"],
  21. :target => "target_device_account@example.com",
  22. :def_channel => "#twitter@t",
  23. :nkf => "w8",
  24. :in_encoding => "jis",
  25. :out_encoding => "utf8",
  26. },
  27. ]
  28. */
  29.  
  30. class IRChatMessage
  31. attr_reader :prefix, :ch, :body
  32. def initialize(prefix, ch, body)
  33. @prefix = prefix
  34. @ch = ch
  35. @body = body
  36. end
  37. end
  38.  
  39. class IRCLog
  40. attr_reader :data
  41. def initialize(max_line)
  42. @max_line = max_line
  43. @data = []
  44. end
  45.  
  46. def add(message)
  47. @data.push message
  48. @data.shift if @data.size > @max_line
  49. end
  50.  
  51. def [](i)
  52. @data[i]
  53. end
  54. end
  55.  
  56. class TypeableMap
  57. DEFAULT_POINTER = "a"
  58. def initialize(size = 3)
  59. super()
  60. @size = size
  61. @hash = {}
  62. @pointer = DEFAULT_POINTER
  63. end
  64.  
  65. def insert(value)
  66. if @pointer.succ.length > @size then
  67. @pointer = DEFAULT_POINTER
  68. else
  69. @pointer.succ!
  70. end
  71.  
  72. @hash[@pointer] = value
  73. puts "TypableMap: " + @pointer.to_s + " => " + convert_str(@hash[@pointer].ch) + " , " + convert_str(@hash[@pointer].body)
  74. end
  75.  
  76. def <<(value)
  77. insert(value)
  78. return @pointer
  79. end
  80.  
  81. def [](key)
  82. @hash[key]
  83. end
  84.  
  85. def last
  86. [@pointer, @hash[@pointer]]
  87. end
  88.  
  89. def reset
  90. @hash = {}
  91. @pointer = DEFAULT_POINTER
  92. end
  93. end
  94.  
  95. class IRChat < Nadoka::NDK_Bot
  96. def connect_jabber(user, password)
  97. begin
  98. connection = Jabber::Client.new(Jabber::JID.new(user))
  99. connection.connect('talk.google.com', 5222)
  100. connection.auth(password)
  101. connection.send(Jabber::Presence.new.set_show(:chat))
  102.  
  103. connection.add_message_callback do |message|
  104. params = message.body.split(" ")
  105. cmd = params.shift
  106.  
  107. case cmd
  108. when "say"
  109. command_say(params.shift, params.join(" "))
  110. when "get"
  111. command_get(params.shift)
  112. when "join"
  113. command_join(params.shift)
  114. when "leave"
  115. command_leave(params.shift)
  116. else
  117. command_default(message.body)
  118. end
  119. end
  120.  
  121. puts "connected to google talk"
  122.  
  123. return connection
  124. rescue => e
  125. puts "ExceptionError: in connect_jabber"
  126. p e
  127. puts e.backtrace
  128. return nil
  129. end
  130. end
  131.  
  132. def jabber
  133. if (@jabber == nil) || @jabber.is_disconnected?
  134. puts "reconnecting..."
  135. @jabber = connect_jabber @user, @password
  136. end
  137.  
  138. @jabber
  139. end
  140.  
  141. def bot_initialize
  142. @typeable_map = TypeableMap.new
  143. @pickers = []
  144. @post_queue = []
  145. @jabber_queue = []
  146.  
  147. @last_msg = nil
  148. @irclog = Hash.new do |hash, key|
  149. hash[key] = IRCLog.new(10)
  150. end
  151.  
  152. @jabber_mutex = Mutex.new
  153.  
  154. @ch_patterns = []
  155. @default_ch_patterns = @bot_config[:channels] || []
  156. @default_patterns = @bot_config[:patterns] || []
  157.  
  158. add_picker_callback do |m|
  159. result = false
  160. @default_patterns.each do |s|
  161. pattern = Regexp.new(s, Regexp::IGNORECASE, "s")
  162. if pattern =~ convert_str(m.body) then
  163. result = true
  164. end
  165. end
  166.  
  167. result
  168. end
  169.  
  170. add_picker_callback do |m|
  171. result = false
  172. @default_ch_patterns.each do |s|
  173. pattern = Regexp.new(s, Regexp::IGNORECASE, "s")
  174. if pattern =~ convert_str(m.ch) then
  175. result = true
  176. end
  177. end
  178.  
  179. result
  180. end
  181.  
  182. add_picker_callback do |m|
  183. result = false
  184. @ch_patterns.each do |s|
  185. pattern = Regexp.new(s, Regexp::IGNORECASE, "s")
  186. if pattern =~ convert_str(m.ch) then
  187. result = true
  188. end
  189. end
  190.  
  191. result
  192. end
  193.  
  194. @user, @password = @bot_config[:user], @bot_config[:pass]
  195. @target = @bot_config[:target] || "target_device_account@example.com"
  196. @jabber = connect_jabber @user, @password
  197.  
  198. puts "irchat loaded"
  199. end
  200.  
  201. def command_leave(ch)
  202. unless ch
  203. @ch_patterns = []
  204. post_jabber(@target, "leave all channels")
  205. return
  206. end
  207.  
  208. @ch_patterns.delete(convert_str(ch))
  209. post_jabber(@target, "#{ch.toutf8} leaved.")
  210. end
  211.  
  212. def command_join(ch)
  213. @ch_patterns.push convert_str(ch) unless @ch_patterns.include? convert_str(ch)
  214. post_jabber(@target, "#{ch.toutf8} joined.")
  215. end
  216.  
  217. def command_get(ch)
  218. log = if @typeable_map[ch] then
  219. @irclog[@typeable_map[ch].ch]
  220. else
  221. @irclog[convert_str(ch)]
  222. end
  223.  
  224. if log.data.size == 0 then
  225. post_jabber(@target, "#{ch.toutf8} channel not found.")
  226. return
  227. end
  228.  
  229. log.data.each do |message|
  230. puts convert_str(message.body)
  231. post_jabber(@target, "[#{message.ch.toutf8}]#{message.prefix.nick.toutf8}: #{message.body.toutf8}")
  232. sleep(1)
  233. end
  234. end
  235.  
  236. def command_say(map, body)
  237. target = if @typeable_map[map] then
  238. convert_str(@typeable_map[map].ch)
  239. elsif @irclog[convert_str(map)].data.size > 0
  240. convert_str(map)
  241. else
  242. nil
  243. end
  244.  
  245. if target then
  246. @post_queue.push IRChatMessage.new("", target, body)
  247. post_jabber(@target, "send to #{target.toutf8}")
  248. else
  249. post_jabber(@target, "invalid typable map.")
  250. end
  251. end
  252.  
  253. def command_default(body)
  254. puts "PrePost: #{@last_msg ? @last_msg.ch : "dummy(#twitter@t)"} / #{body}"
  255. @post_queue.push IRChatMessage.new("", @last_msg ? @last_msg.ch : "#twitter@t", body)
  256. end
  257.  
  258. def on_topic(prefix, ch, topic)
  259. ch = NKF.nkf @bot_config[:nkf], ch
  260. topic = NKF.nkf @bot_config[:nkf], topic
  261. end
  262.  
  263. def on_timer(time)
  264. if @post_queue.size == 0 then
  265. @post_queue = []
  266. else
  267. message = @post_queue.shift
  268. puts "Post: #{message.ch} / #{message.body}"
  269. send_privmsg(message.ch, message.body) unless message.body.index(/^\[#/)
  270. end
  271.  
  272. @jabber_mutex.synchronize do
  273. jabber.send(Jabber::Presence.new.set_show(:chat)) if jabber
  274. end
  275. end
  276.  
  277. def on_privmsg(prefix, ch, msg)
  278. ch = NKF.nkf @bot_config[:nkf], ch
  279. msg = NKF.nkf @bot_config[:nkf], msg
  280.  
  281. message = IRChatMessage.new(prefix, ch, msg)
  282.  
  283. if @pickers.any?{|picker| picker.call(message) == true} then
  284. pointer = (@typeable_map << message)
  285.  
  286. unless @last_msg && (@last_msg.body == message.body) && (@last_msg.prefix.nick == message.prefix.nick)
  287. post_jabber(@target, "[#{message.ch.toutf8} (#{pointer})]\n#{message.prefix.nick}: #{message.body.toutf8}")
  288. end
  289.  
  290. @last_msg = message
  291. end
  292.  
  293. @irclog[ch].add(message)
  294.  
  295. on_timer(nil)
  296.  
  297. false
  298. end
  299.  
  300. def send_notice(ch, msg)
  301. super(NKF.nkf(@bot_config[:nkf],ch), NKF.nkf(@bot_config[:nkf],msg))
  302. end
  303.  
  304. def send_privmsg(ch, msg)
  305. super(NKF.nkf(@bot_config[:nkf],ch), NKF.nkf(@bot_config[:nkf],msg))
  306. end
  307.  
  308. def post_jabber(to, message)
  309. jabber_message = Jabber::Message.new(to, message)
  310. jabber_message.type = :chat
  311.  
  312. @jabber_mutex.synchronize do
  313. puts "post to jabber"
  314. jabber.send(jabber_message) if jabber
  315. end
  316. end
  317.  
  318. def add_picker_callback(&picker)
  319. @pickers << picker
  320. end
  321.  
  322. def convert_str(str)
  323. case @bot_config[:nkf]
  324. when "j"
  325. str.tojis
  326. when "s"
  327. str.tosjis
  328. when "e"
  329. str.toeucjp
  330. when "w"
  331. str.toutf8
  332. when "w8"
  333. str.toutf8
  334. when "w16"
  335. str.toutf16
  336. when "w32"
  337. str.toutf32
  338. else
  339. str.tojis
  340. end
  341.  
  342. return str
  343. end
  344. end
Add Comment
Please, Sign In to add comment