ceiling_cat 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,19 +1,19 @@
1
1
  module CeilingCat
2
2
  class Connection
3
3
  attr_accessor :config
4
-
4
+
5
5
  def initialize(config)
6
- @config=config
6
+ @config = config
7
7
  @config.storage ||= CeilingCat::Storage::Hash
8
8
  end
9
-
9
+
10
10
  def plugins
11
11
  self.config.plugins
12
12
  end
13
-
13
+
14
14
  def storage
15
15
  self.config.storage
16
16
  end
17
-
17
+
18
18
  end
19
19
  end
@@ -1,17 +1,12 @@
1
1
  module CeilingCat
2
- class Error < StandardError
2
+ class Error < StandardError; end
3
3
 
4
- def initialize(message)
5
- super message
6
- end
7
- end
8
-
9
4
  # Gem Specific Errors
10
- class CeilingCatError < StandardError; end
11
-
5
+ class CeilingCatError < CeilingCat::Error; end
6
+
12
7
  class UnsupportedChatServiceError < CeilingCatError; end
13
-
8
+
14
9
  class NotImplementedError < CeilingCatError; end
15
-
10
+
16
11
  class ReloadException < CeilingCatError; end
17
12
  end
@@ -2,17 +2,16 @@ module CeilingCat
2
2
  class Event
3
3
  attr_accessor :room, :body, :user, :type, :time
4
4
 
5
- def initialize(room, body,user,opts={})
5
+ def initialize(room, body, user, opts={})
6
6
  @room = room
7
7
  @body = body.to_s.strip
8
8
  @user = user
9
9
  @type = opts[:type]
10
10
  @time = opts[:time] || Time.now
11
11
  end
12
-
13
- def handle
12
+
13
+ def handle
14
14
  @room.plugins.each do |plugin|
15
- puts "running #{plugin}"
16
15
  begin
17
16
  response = plugin.new(self).handle
18
17
  break if response.present?
@@ -21,7 +20,7 @@ module CeilingCat
21
20
  end
22
21
  end
23
22
  end
24
-
23
+
25
24
  def type # assume that all messages are just text unless the specific room type overrides it.
26
25
  @type || :chat
27
26
  end
@@ -29,7 +29,7 @@ module CeilingCat
29
29
  messages << "Run commands with '![command]' or '#{room.me.name}: [command]'"
30
30
  reply messages
31
31
  end
32
-
32
+
33
33
  def list_users
34
34
  members = room.users_in_room(:type => "member")
35
35
  if members.size > 0
@@ -38,7 +38,7 @@ module CeilingCat
38
38
  reply "There are no registered users in the room at this time."
39
39
  end
40
40
  end
41
-
41
+
42
42
  def list_guests
43
43
  guests = room.users_in_room(:type => "guest")
44
44
  if guests.size > 0
@@ -12,6 +12,7 @@ module CeilingCat
12
12
  begin
13
13
  if command[:public] || user.is_registered?
14
14
  self.send command[:method]
15
+ return true
15
16
  end
16
17
  rescue => e
17
18
  reply "There was an error: #{$!}"
@@ -47,11 +48,11 @@ module CeilingCat
47
48
  def room
48
49
  event.room
49
50
  end
50
-
51
+
51
52
  def store
52
53
  self.class.store
53
54
  end
54
-
55
+
55
56
  def self.store
56
57
  CeilingCat::Setup.config ? CeilingCat::Setup.config.storage : CeilingCat::Storage::Hash
57
58
  end
@@ -67,7 +68,7 @@ module CeilingCat
67
68
  def reply(message)
68
69
  room.say(message)
69
70
  end
70
-
71
+
71
72
  def words
72
73
  body.split
73
74
  end
@@ -79,11 +80,11 @@ module CeilingCat
79
80
  def body_without_nick(text=body)
80
81
  text.sub(/^#{room.me.name}:?\s*/i,'').strip
81
82
  end
82
-
83
+
83
84
  def body_without_nick_or_command(command,text=body)
84
85
  body_without_command(command, body_without_nick(text).sub(/^#{command}/i,"!#{command}"))
85
86
  end
86
-
87
+
87
88
  def pluralize(n, singular, plural=nil)
88
89
  if n == 1
89
90
  "#{singular}"
@@ -1,22 +1,22 @@
1
1
  module CeilingCat
2
2
  module Plugin
3
- class Calc < CeilingCat::Plugin::Base
3
+ class Calc < CeilingCat::Plugin::Base
4
4
  def self.commands
5
5
  [{:command => "calculate", :description => "Performs basic math functions - '!calculate 7*5'", :method => "calculate", :public => true}]
6
6
  end
7
-
7
+
8
8
  def self.description
9
9
  "A basic calculator, for all your mathin' needs!"
10
10
  end
11
-
11
+
12
12
  def self.name
13
13
  "Calculator"
14
14
  end
15
-
15
+
16
16
  def self.public?
17
17
  true
18
18
  end
19
-
19
+
20
20
  def calculate
21
21
  begin
22
22
  math = body.gsub(/[^\d+-\/*\(\)\.]/,"") # Removing anything but numbers, operators, and parens
@@ -2,15 +2,13 @@ module CeilingCat
2
2
  module Plugin
3
3
  class CallAndResponse < CeilingCat::Plugin::Base
4
4
  def handle
5
- if event.type == :chat
5
+ if !super && event.type == :chat
6
6
  if match = self.class.list.find{|car| body =~ Regexp.new(car[:call],true) }
7
7
  response = [match[:response]].flatten # Support old responses which are strings, not arrays
8
8
  reply response[Kernel.rand(response.size)]
9
9
  return nil
10
10
  end
11
- super
12
11
  end
13
-
14
12
  end
15
13
 
16
14
  def self.commands
@@ -13,7 +13,7 @@ module CeilingCat
13
13
  user_count = room.connection.total_user_count
14
14
  max_users = room.connection.config.max_users || 100
15
15
  if room.plugin_installed?("notifo") && user_count > max_users-2
16
- room.plugin("notifo").new(@event).deliver("#{user_count} of #{max_users} max connections to Campfire.")
16
+ room.plugin("notifo").new(@event).deliver("#{user_count} of #{max_users} max connections to Campfire.")
17
17
  end
18
18
  end
19
19
  super
@@ -45,4 +45,3 @@ module CeilingCat
45
45
  end
46
46
  end
47
47
  end
48
-
@@ -7,7 +7,7 @@ module CeilingCat
7
7
  [{:command => "today", :description => "Find out if there's anything special about today.", :method => "about", :public => true},
8
8
  {:command => "add holiday", :description => "Add a holiday - '!add holiday 1/19/2011'", :method => "add_to_holidays"}]
9
9
  end
10
-
10
+
11
11
  def about(date=Date.today)
12
12
  begin
13
13
  if self.class.is_a_holiday?(date)
@@ -21,11 +21,11 @@ module CeilingCat
21
21
  reply "Sorry, that's not a valid date."
22
22
  end
23
23
  end
24
-
24
+
25
25
  def self.description
26
26
  "Holidays and times you shouldn't expect to see us in chat."
27
27
  end
28
-
28
+
29
29
  def add_to_holidays
30
30
  date = body_without_command("add holiday")
31
31
  if date.empty?
@@ -39,7 +39,7 @@ module CeilingCat
39
39
  end
40
40
  end
41
41
  end
42
-
42
+
43
43
  def self.is_a_weekend?(date=Date.today)
44
44
  if is_a_date?(date)
45
45
  date = Date.parse(date.to_s)
@@ -48,11 +48,11 @@ module CeilingCat
48
48
  raise NotADateError
49
49
  end
50
50
  end
51
-
51
+
52
52
  def self.holidays
53
53
  store["holidays"] ||= []
54
54
  end
55
-
55
+
56
56
  def self.add_to_holidays(days)
57
57
  dates = Array(days).collect do |day|
58
58
  if is_a_date?(day)
@@ -73,10 +73,10 @@ module CeilingCat
73
73
  raise NotADateError
74
74
  end
75
75
  end
76
-
76
+
77
77
  store["holidays"] = holidays - dates
78
78
  end
79
-
79
+
80
80
  def self.is_a_holiday?(date=Date.today)
81
81
  if is_a_date?(date)
82
82
  holidays.include? Date.parse(date.to_s)
@@ -84,7 +84,7 @@ module CeilingCat
84
84
  raise NotADateError
85
85
  end
86
86
  end
87
-
87
+
88
88
  def self.is_a_date?(date_string)
89
89
  begin
90
90
  return true if Date.parse(date_string.to_s)
@@ -17,11 +17,11 @@ module CeilingCat
17
17
  super
18
18
  end
19
19
  end
20
-
20
+
21
21
  def self.name
22
22
  "Greeter"
23
23
  end
24
-
24
+
25
25
  def self.description
26
26
  "Welcomes visitors and memebrs to chat."
27
27
  end
@@ -0,0 +1,76 @@
1
+ module CeilingCat
2
+ module Plugin
3
+ class Messages < CeilingCat::Plugin::Base
4
+ # See lib/ceiling_cat/plugins/base.rb for the methods available by default.
5
+ # Plugins are run in the order they are listed in the Chatfile.
6
+ # When a plugin returns anything other than nil the plugin execution chain is halted.
7
+ # If you want your plugin to do something but let the remaining plugins execute, return nil at the end of your method.
8
+
9
+ # handle manages a plugin's entire interaction with an event.
10
+ # If you only want to execute commands - "![command]" - leave handle alone (or remove it and define commands below)
11
+ def handle
12
+ if event.type == :entrance
13
+ messages = []
14
+ messages_for_user = self.class.messages_for(user.name)
15
+ if messages_for_user.size > 0
16
+ messages << "Hey #{user.name}! I have a message to deliver to you:"
17
+ messages += messages_for_user.collect{|message| "From #{message[:from]}: #{message[:body]}"}
18
+ reply messages
19
+ end
20
+ self.class.remove(messages_for_user)
21
+ false
22
+ else
23
+ super
24
+ end
25
+ end
26
+
27
+ # If you want the plugin to run when certain text is sent use commands instead of handle.
28
+ # Ceiling Cat will watch for "![command]" or "[name]: [command" and execute the method for that command.
29
+ def self.commands
30
+ [{:command => "message for", :description => "Leave a message for someone. i.e. '!message for John Doe: You forgot to lock the door after work last night.'", :method => "save_message", :public => true}]
31
+ end
32
+
33
+ def self.description
34
+ "A plugin called Messages"
35
+ end
36
+
37
+ def self.name
38
+ "Messages"
39
+ end
40
+
41
+ def self.public?
42
+ false
43
+ end
44
+
45
+ def save_message
46
+ recipient,*body = body_without_nick_or_command("message for").split(":")
47
+ if room.users_in_room.any?{|user| user.name == recipient.strip}
48
+ reply "Why leave that messsage? #{recipient.strip} is here!"
49
+ else
50
+ self.class.add(:to => recipient.strip, :from => user.name, :body => body.join(":").strip)
51
+ reply "Message saved! I'll deliver it the next time #{recipient.strip} is around."
52
+ end
53
+ end
54
+
55
+ def self.add(opts={})
56
+ return false unless opts[:to] && opts[:from] && opts[:body]
57
+ store["messages"] ||= []
58
+ store["messages"] = (store["messages"] + [{:to => opts[:to], :from => opts[:from], :body => opts[:body]}]).uniq
59
+ end
60
+
61
+ def self.remove(*messages)
62
+ store["messages"] ||= []
63
+ store["messages"] = store["messages"].reject{ |message| messages.flatten.include?(message) }
64
+ end
65
+
66
+ def self.list
67
+ store["messages"] ||= []
68
+ end
69
+
70
+ def self.messages_for(name)
71
+ store["messages"] ||= []
72
+ store["messages"].find_all{ |message| message[:to].downcase == name.downcase }
73
+ end
74
+ end
75
+ end
76
+ end
@@ -1,34 +1,46 @@
1
1
  require 'httparty'
2
2
 
3
3
  module CeilingCat
4
+ class NotifoNotConfiguredError < CeilingCatError; end
5
+
4
6
  module Plugin
5
7
  class Notifo < CeilingCat::Plugin::Base
6
8
  def self.commands
7
- [{:command => "notifo", :description => "Send a message with Notifo - '!notifo Hey, get in here!'.", :method => "deliver"},
9
+ [{:command => "notifo", :description => "Send a message with Notifo - '!notifo user: Hey, get in here!'. 'user:' is optional, and will go to everyone if not passed.", :method => "deliver"},
8
10
  {:command => "add notifo users", :description => "Add users to get Notifos - '!add notifo users username1 username2'.", :method => "add_users"},
9
11
  {:command => "remove notifo users", :description => "Add users to get Notifos - '!remove notifo users username1 username2'.", :method => "remove_users"},
10
12
  {:command => "list notifo users", :description => "List users who get Notifos - '!list notifo users'.", :method => "list_users"}]
11
13
  end
12
14
 
13
- def deliver(message=nil)
14
- message ||= body_without_nick_or_command("notifo")
15
+ def deliver(message=nil,user=nil)
16
+ body_parts = body_without_nick_or_command("notifo").scan(/^((\w+):)?(.+)$/)[0]
17
+ message ||= body_parts[2].strip
18
+ user ||= body_parts[1]
19
+
20
+ users = user ? Array(user.strip) : Array(store["notifo_users"])
21
+ users.each do |user|
22
+ CeilingCat::Plugin::Notifo.deliver(user,message)
23
+ end
24
+ end
25
+
26
+ def self.deliver(user,message)
15
27
  if active?
16
- Array(store["notifo_users"]).each do |user|
17
- HTTParty.post("https://api.notifo.com/v1/send_notification",
18
- :body => { :to => user, :msg => message },
19
- :basic_auth => {:username => store["notifo_credentials"][:username], :password => store["notifo_credentials"][:api_secret]})
20
- end
28
+ HTTParty.post("https://api.notifo.com/v1/send_notification",
29
+ :body => { :to => user, :msg => message },
30
+ :basic_auth => {:username => store["notifo_credentials"][:username], :password => store["notifo_credentials"][:api_secret]})
31
+ else
32
+ raise NotifoNotConfiguredError
21
33
  end
22
34
  end
23
35
 
24
36
  def self.active?
25
- if store["notifo_credentials"] && store["notifo_credentials"][:username].present? && store["notifo_credentials"][:api_secret].present? && Array(store["notifo_users"]).size > 0
37
+ if store["notifo_credentials"] && store["notifo_credentials"][:username].present? && store["notifo_credentials"][:api_secret].present?
26
38
  true
27
39
  else
28
40
  false
29
41
  end
30
42
  end
31
-
43
+
32
44
  def active?
33
45
  self.class.active?
34
46
  end
@@ -45,7 +57,7 @@ module CeilingCat
45
57
  store["notifo_users"] ||= []
46
58
  store["notifo_users"] = (Array(store["notifo_users"]) + Array(users)).uniq
47
59
  end
48
-
60
+
49
61
  def self.remove_users(users)
50
62
  store["notifo_users"] ||= []
51
63
  store["notifo_users"] = (Array(store["notifo_users"]) - Array(users)).uniq
@@ -0,0 +1,29 @@
1
+ module CeilingCat
2
+ module Plugin
3
+ class TWSS < CeilingCat::Plugin::Base
4
+ RESPONSES = ["That's what she said!", "Uh, that's what she said!", "TWSS", "TWSS!"]
5
+
6
+ class << self; attr_accessor :threshold; end # add a class attr_accessor for the TWSS threshold
7
+ self.threshold = 0.5
8
+
9
+ def handle
10
+ TWSS.threshold = self.class.threshold
11
+ if event.type == :chat && TWSS(body)
12
+ reply RESPONSES[Kernel.rand(RESPONSES.size)]
13
+ end
14
+ end
15
+
16
+ def self.description
17
+ "TWSS via Bayes classifier"
18
+ end
19
+
20
+ def self.name
21
+ "TWSS"
22
+ end
23
+
24
+ def self.public?
25
+ false
26
+ end
27
+ end
28
+ end
29
+ end
@@ -11,7 +11,7 @@ module CeilingCat
11
11
  def campfire
12
12
  @campfire = Tinder::Campfire.new(self.config.subdomain, :token => self.config.token, :ssl => self.config.ssl)
13
13
  end
14
-
14
+
15
15
  def total_user_count
16
16
  users = 0
17
17
  @campfire.rooms.each do |room|
@@ -1,7 +1,7 @@
1
1
  module CeilingCat
2
2
  module Campfire
3
3
  class Event < CeilingCat::Event
4
-
4
+
5
5
  def type
6
6
  case @type
7
7
  when "EnterMessage", :entrance
@@ -12,7 +12,7 @@ module CeilingCat
12
12
  :exit
13
13
  end
14
14
  end
15
-
15
+
16
16
  end
17
17
  end
18
18
  end
@@ -1,7 +1,7 @@
1
1
  module CeilingCat
2
2
  module IRC
3
3
  class Event < CeilingCat::Event
4
-
4
+
5
5
  def type
6
6
  case @type
7
7
  when "EnterMessage", :entrance
@@ -12,7 +12,7 @@ module CeilingCat
12
12
  :exit
13
13
  end
14
14
  end
15
-
15
+
16
16
  end
17
17
  end
18
18
  end
@@ -19,7 +19,7 @@ module CeilingCat
19
19
  irc.nick config.nickname
20
20
  irc.pass config.password if config.password.present?
21
21
  irc.user config.nickname, "+B", "*", config.nickname
22
-
22
+
23
23
  while line = irc.read
24
24
  # Join a channel after MOTD
25
25
  if line.split[1] == '376'
@@ -31,7 +31,7 @@ module CeilingCat
31
31
  @ops_names << match[1] if match[2].include?("O")
32
32
  @ops_names.uniq!
33
33
  end
34
-
34
+
35
35
  puts "Received: #{line}"
36
36
  begin
37
37
  if message = message_parts(line)
@@ -60,7 +60,7 @@ module CeilingCat
60
60
  irc.privmsg config.room, line
61
61
  end
62
62
  end
63
-
63
+
64
64
  def users_in_room(opts={})
65
65
  @user_names.collect {|user_name|
66
66
  user_name = user_name.sub(/^@/,"")
@@ -76,7 +76,7 @@ module CeilingCat
76
76
  end
77
77
  }.compact
78
78
  end
79
-
79
+
80
80
  def user_role(name)
81
81
  if @ops_names.include?(name)
82
82
  "member"
@@ -84,7 +84,7 @@ module CeilingCat
84
84
  "guest"
85
85
  end
86
86
  end
87
-
87
+
88
88
  def is_me?(user)
89
89
  user.name == me.name
90
90
  end
@@ -92,7 +92,7 @@ module CeilingCat
92
92
  def me
93
93
  @me ||= CeilingCat::User.new(config.nickname, :role => "member")
94
94
  end
95
-
95
+
96
96
  def message_parts(message)
97
97
  if message =~ /\sPRIVMSG\s/
98
98
  parts = message.match /^:(.+?)!(.+?)@(.+?)\sPRIVMSG\s(#.+):(.+)/i
@@ -2,16 +2,16 @@ require 'ostruct'
2
2
 
3
3
  module CeilingCat
4
4
  class Setup
5
-
5
+
6
6
  attr_accessor :config
7
-
7
+
8
8
  class << self
9
9
  # Class-level config. This is set by the +configure+ class method,
10
10
  # and is used if no configuration is passed to the +initialize+
11
11
  # method.
12
12
  attr_accessor :config
13
13
  end
14
-
14
+
15
15
  # Configures the connection at the class level. When the +ceiling_cat+ bin
16
16
  # file is loaded, it evals the file referenced by the first
17
17
  # command-line parameter. This file can configure the connection
@@ -27,11 +27,11 @@ module CeilingCat
27
27
  def config=(config)
28
28
  @config = config.kind_of?(Hash) ? OpenStruct.new(config) : config
29
29
  end
30
-
30
+
31
31
  def initialize(_config = nil)
32
32
  self.config = _config || self.class.config
33
33
  end
34
-
34
+
35
35
  def connect
36
36
  case self.config.service.downcase
37
37
  when 'campfire'
@@ -46,6 +46,6 @@ module CeilingCat
46
46
  raise CeilingCat::UnsupportedChatServiceError.new("#{self.config.service} is not a supported chat service.")
47
47
  end
48
48
  end
49
-
49
+
50
50
  end
51
51
  end
@@ -14,7 +14,7 @@ module CeilingCat
14
14
  @file
15
15
  end
16
16
 
17
- # Sets the key +k+ to the value +v+
17
+ # Sets the key +k+ to the value +v+
18
18
  def []=(k, v)
19
19
  internal[k] = v
20
20
  persist!
@@ -7,11 +7,11 @@ module CeilingCat
7
7
  @id = opts[:id] || rand(10000000)
8
8
  @role = opts[:role] || "guest"
9
9
  end
10
-
10
+
11
11
  def to_s
12
12
  short_name
13
13
  end
14
-
14
+
15
15
  def short_name
16
16
  @name.to_s.split.compact.first
17
17
  end
@@ -1,3 +1,3 @@
1
1
  module CeilingCat
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -17,11 +17,11 @@ CeilingCat::Setup.configure do |config|
17
17
  # config.nick = 'nickname'
18
18
  # config.password = 'Q7Af6laDKza2SOM'
19
19
  # config.room = '#my_room'
20
-
20
+
21
21
  config.plugins = [CeilingCat::Plugin::About,
22
22
  CeilingCat::Plugin::Greeter,
23
23
  CeilingCat::Plugin::Calc]
24
-
24
+
25
25
  # Some plugins require storage
26
26
  CeilingCat::Storage::Yaml.file = "ceilingcat.yml"
27
27
  config.storage = CeilingCat::Storage::Yaml
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ceiling_cat
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 3
10
- version: 0.1.3
9
+ - 4
10
+ version: 0.1.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Chris Warren
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-07 00:00:00 Z
18
+ date: 2011-09-23 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: tinder
@@ -82,9 +82,25 @@ dependencies:
82
82
  type: :runtime
83
83
  version_requirements: *id004
84
84
  - !ruby/object:Gem::Dependency
85
- name: rspec
85
+ name: twss
86
86
  prerelease: false
87
87
  requirement: &id005 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ~>
91
+ - !ruby/object:Gem::Version
92
+ hash: 21
93
+ segments:
94
+ - 0
95
+ - 0
96
+ - 5
97
+ version: 0.0.5
98
+ type: :runtime
99
+ version_requirements: *id005
100
+ - !ruby/object:Gem::Dependency
101
+ name: rspec
102
+ prerelease: false
103
+ requirement: &id006 !ruby/object:Gem::Requirement
88
104
  none: false
89
105
  requirements:
90
106
  - - "="
@@ -96,11 +112,11 @@ dependencies:
96
112
  - 0
97
113
  version: 2.6.0
98
114
  type: :development
99
- version_requirements: *id005
115
+ version_requirements: *id006
100
116
  - !ruby/object:Gem::Dependency
101
117
  name: ruby-debug
102
118
  prerelease: false
103
- requirement: &id006 !ruby/object:Gem::Requirement
119
+ requirement: &id007 !ruby/object:Gem::Requirement
104
120
  none: false
105
121
  requirements:
106
122
  - - ">="
@@ -110,11 +126,11 @@ dependencies:
110
126
  - 0
111
127
  version: "0"
112
128
  type: :development
113
- version_requirements: *id006
129
+ version_requirements: *id007
114
130
  - !ruby/object:Gem::Dependency
115
131
  name: fakeweb
116
132
  prerelease: false
117
- requirement: &id007 !ruby/object:Gem::Requirement
133
+ requirement: &id008 !ruby/object:Gem::Requirement
118
134
  none: false
119
135
  requirements:
120
136
  - - ">="
@@ -124,8 +140,8 @@ dependencies:
124
140
  - 0
125
141
  version: "0"
126
142
  type: :development
127
- version_requirements: *id007
128
- description: Ceiling Cat is watching you chat. A Campfire chat bot!
143
+ version_requirements: *id008
144
+ description: Ceiling Cat is watching you chat. A Campfire and IRC chat bot!
129
145
  email:
130
146
  - chris@zencoder.com
131
147
  executables:
@@ -135,35 +151,37 @@ extensions: []
135
151
  extra_rdoc_files: []
136
152
 
137
153
  files:
138
- - lib/ceiling_cat.rb
139
- - lib/ceiling_cat/setup.rb
140
- - lib/ceiling_cat/version.rb
141
154
  - lib/ceiling_cat/connection.rb
142
155
  - lib/ceiling_cat/errors.rb
143
156
  - lib/ceiling_cat/event.rb
144
- - lib/ceiling_cat/user.rb
145
- - lib/ceiling_cat/room.rb
146
- - lib/ceiling_cat/storage/base.rb
147
- - setup/Chatfile
148
- - setup/Rakefile
149
- - lib/ceiling_cat/plugins/base.rb
150
157
  - lib/ceiling_cat/plugins/about.rb
158
+ - lib/ceiling_cat/plugins/base.rb
151
159
  - lib/ceiling_cat/plugins/calc.rb
152
160
  - lib/ceiling_cat/plugins/call_and_response.rb
153
161
  - lib/ceiling_cat/plugins/campfire_account_monitor.rb
154
162
  - lib/ceiling_cat/plugins/days.rb
155
163
  - lib/ceiling_cat/plugins/greeter.rb
164
+ - lib/ceiling_cat/plugins/messages.rb
156
165
  - lib/ceiling_cat/plugins/notifo.rb
157
- - lib/ceiling_cat/storage/hash.rb
158
- - lib/ceiling_cat/storage/yaml.rb
159
- - lib/ceiling_cat/services/campfire.rb
166
+ - lib/ceiling_cat/plugins/twss.rb
167
+ - lib/ceiling_cat/room.rb
160
168
  - lib/ceiling_cat/services/campfire/connection.rb
161
169
  - lib/ceiling_cat/services/campfire/event.rb
162
170
  - lib/ceiling_cat/services/campfire/room.rb
163
- - lib/ceiling_cat/services/irc.rb
171
+ - lib/ceiling_cat/services/campfire.rb
164
172
  - lib/ceiling_cat/services/irc/connection.rb
165
173
  - lib/ceiling_cat/services/irc/event.rb
166
174
  - lib/ceiling_cat/services/irc/room.rb
175
+ - lib/ceiling_cat/services/irc.rb
176
+ - lib/ceiling_cat/setup.rb
177
+ - lib/ceiling_cat/storage/base.rb
178
+ - lib/ceiling_cat/storage/hash.rb
179
+ - lib/ceiling_cat/storage/yaml.rb
180
+ - lib/ceiling_cat/user.rb
181
+ - lib/ceiling_cat/version.rb
182
+ - lib/ceiling_cat.rb
183
+ - setup/Chatfile
184
+ - setup/Rakefile
167
185
  - bin/ceiling_cat
168
186
  homepage: http://zencoder.com
169
187
  licenses: []
@@ -194,9 +212,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
212
  requirements: []
195
213
 
196
214
  rubyforge_project:
197
- rubygems_version: 1.8.7
215
+ rubygems_version: 1.8.8
198
216
  signing_key:
199
217
  specification_version: 3
200
- summary: Ceiling Cat is watching you chat. A Campfire chat bot.
218
+ summary: Ceiling Cat is watching you chat. A Campfire and IRC chat bot.
201
219
  test_files: []
202
220