Guest User

Untitled

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