summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2013-01-02 02:16:57 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2013-01-02 02:16:57 +0100
commit58649c9843707c5d8b4211d07535fcf51421ebec (patch)
treecddf384e3dfb113899bfdb7cd3dc7903f49d3ae9
parentdceabdbb7ede39694ecac9e71b36124e4123e741 (diff)
downloadlain-58649c9843707c5d8b4211d07535fcf51421ebec.tar
lain-58649c9843707c5d8b4211d07535fcf51421ebec.zip
Add Topic module
-rw-r--r--bot.rb4
-rw-r--r--modules/Credits.rb5
-rw-r--r--modules/DDate.rb5
-rw-r--r--modules/Fortune.rb5
-rw-r--r--modules/Help.rb5
-rw-r--r--modules/Topic.rb76
6 files changed, 86 insertions, 14 deletions
diff --git a/bot.rb b/bot.rb
index 524bb02..6a4065b 100644
--- a/bot.rb
+++ b/bot.rb
@@ -1,5 +1,5 @@
require 'xmpp4r'
-require 'xmpp4r/muc/helper/mucclient'
+require 'xmpp4r/muc/helper/simplemucclient'
require_relative 'sasl'
@@ -34,7 +34,7 @@ module Lain
@mucs = {}
Config::Rooms.each { |r|
- muc = Jabber::MUC::MUCClient.new(@cl)
+ muc = Jabber::MUC::SimpleMUCClient.new(@cl)
@mucs[r] = muc
muc.add_message_callback { |msg|
diff --git a/modules/Credits.rb b/modules/Credits.rb
index 190c284..972a13d 100644
--- a/modules/Credits.rb
+++ b/modules/Credits.rb
@@ -7,10 +7,9 @@ module Lain
module Modules
class Credits < Base
def on_message(muc, message)
- return unless message.type == :groupchat
- return unless /!credits\b/ =~ message.body
+ return unless /\A!credits\b/ =~ message.body
- muc.send(Jabber::Message.new(message.to, "\nLain (レイン) #{Version}\n\n -- hacked by NeoRaider"))
+ muc.send(Jabber::Message.new(muc.room, "\nLain (レイン) #{Version}\n\n -- coded by NeoRaider"))
end
def commands
diff --git a/modules/DDate.rb b/modules/DDate.rb
index 3c9f3e1..317bf67 100644
--- a/modules/DDate.rb
+++ b/modules/DDate.rb
@@ -6,10 +6,9 @@ module Lain
module Modules
class DDate < Base
def on_message(muc, message)
- return unless message.type == :groupchat
- return unless /!ddate\b/ =~ message.body
+ return unless /\A!ddate\b/ =~ message.body
- muc.send(Jabber::Message.new(message.to, IO.popen("ddate").read.chomp))
+ muc.send(Jabber::Message.new(muc.room, IO.popen("ddate").read.chomp))
end
def commands
diff --git a/modules/Fortune.rb b/modules/Fortune.rb
index f8b237a..85a5cba 100644
--- a/modules/Fortune.rb
+++ b/modules/Fortune.rb
@@ -6,10 +6,9 @@ module Lain
module Modules
class Fortune < Base
def on_message(muc, message)
- return unless message.type == :groupchat
- return unless /!fortune\b/ =~ message.body
+ return unless /\A!fortune\b/ =~ message.body
- muc.send(Jabber::Message.new(message.to, "\n" + IO.popen(@config['command']).read.chomp))
+ muc.send(Jabber::Message.new(muc.room, "\n" + IO.popen(@config['command']).read.chomp))
end
def commands
diff --git a/modules/Help.rb b/modules/Help.rb
index 84d9a9e..7c27689 100644
--- a/modules/Help.rb
+++ b/modules/Help.rb
@@ -6,10 +6,9 @@ module Lain
module Modules
class Help < Base
def on_message(muc, message)
- return unless message.type == :groupchat
- return unless /!help\b/ =~ message.body
+ return unless /\A!help\b/ =~ message.body
- muc.send(Jabber::Message.new(message.to, "Commands:" + @lain.commands.reduce('') { |s, cmd| "#{s}\n#{cmd[0]}: #{cmd[1]}" }))
+ muc.send(Jabber::Message.new(muc.room, "Commands:" + @lain.commands.reduce('') { |s, cmd| "#{s}\n#{cmd[0]}: #{cmd[1]}" }))
end
def commands
diff --git a/modules/Topic.rb b/modules/Topic.rb
new file mode 100644
index 0000000..14bd9c4
--- /dev/null
+++ b/modules/Topic.rb
@@ -0,0 +1,76 @@
+# -*- 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] <topic>' => 'add a topic to the topic line',
+ '!topic d[el[ete]] <ID>' => 'remove topic <ID>'
+ }
+ 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