# -*- coding: utf-8 -*- require 'xmpp4r/message' require_relative '../module_base' module Lain module Modules class Topic < Base def on_message(muc, message) return unless /\A!topic\b/ =~ message.body if /\A!topic\s*(?:\ss(?:how)?.*)?\Z/ =~ message.body show_topic(muc, message) elsif /\A!topic\s+a(?:dd)?\s+(.+)\Z/ =~ message.body add_topic(muc, message, $~[1].strip) elsif /\A!topic\s+d(?:el(?:ete)?)?\s+(\d+)\Z/ =~ message.body del_topic(muc, message, $~[1].to_i) end end def commands { '!topic [s[how]]' => 'show topics (with IDs)', '!topic a[dd] ' => 'add a topic to the topic line', '!topic d[el[ete]] ' => 'remove topic ' } end private def current_topic(muc) topic = muc.subject return [] if topic.nil? topic.split('|').map { |s| s.strip } end def set_topic(muc, topic) muc.subject = topic.join(" | ") end def topic_list(topic) topic.each_with_index.map { |t, i| "[#{i}] #{t}" }.join("\n") end def show_topic(muc, message) topic = current_topic muc if topic.empty? muc.send(Jabber::Message.new(muc.room, "No topic set.")) return end muc.send(Jabber::Message.new(muc.room, "Current topics:\n" + topic_list(topic))) end def add_topic(muc, message, text) topic = current_topic muc topic.unshift text set_topic(muc, topic) muc.send(Jabber::Message.new(muc.room, "New topics:\n" + topic_list(topic))) end def del_topic(muc, message, id) topic = current_topic muc begin topic.delete_at id rescue end set_topic(muc, topic) muc.send(Jabber::Message.new(muc.room, "New topics:\n" + topic_list(topic))) end end end end