ceiling_cat 0.0.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/ceiling_cat CHANGED
@@ -23,4 +23,4 @@ else
23
23
  else
24
24
  puts "Couldn't find a Chatfile at #{file}! Create one at `./Chatfile`, provide a path to one, or run `ceiling_cat setup`"
25
25
  end
26
- end
26
+ end
data/lib/ceiling_cat.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # General
2
- %w{version setup connection errors event user room plugins/base services/campfire storage/base storage/hash storage/yaml}.each do |file|
2
+ %w{version setup connection errors event user room plugins/base services/campfire services/irc storage/base storage/hash storage/yaml}.each do |file|
3
3
  require "ceiling_cat/#{file}"
4
4
  end
@@ -31,13 +31,21 @@ module CeilingCat
31
31
  end
32
32
 
33
33
  def list_users
34
- members = room.list_of_users_in_room(:type => "member")
35
- reply "#{members} #{pluralize(members.size, "is a", "are")} #{pluralize(members.size, "registered user")}."
34
+ members = room.users_in_room(:type => "member")
35
+ if members.size > 0
36
+ reply "#{room.list_of_users_in_room(:type => "member")} #{pluralize(members.size, "is a", "are")} #{pluralize(members.size, "registered user")}."
37
+ else
38
+ reply "There are no registered users in the room at this time."
39
+ end
36
40
  end
37
41
 
38
42
  def list_guests
39
- guests = room.list_of_users_in_room(:type => "guest")
40
- reply "#{guests} #{pluralize(members.size, "is a", "are")} #{pluralize(members.size, "guest")}."
43
+ guests = room.users_in_room(:type => "guest")
44
+ if guests.size > 0
45
+ reply "#{room.list_of_users_in_room(:type => "guest")} #{pluralize(guests.size, "is a", "are")} #{pluralize(guests.size, "guest")}."
46
+ else
47
+ reply "There are no guests in the room at this time."
48
+ end
41
49
  end
42
50
  end
43
51
  end
@@ -66,11 +66,11 @@ module CeilingCat
66
66
 
67
67
  def list_of_users_in_room(type=nil)
68
68
  users = users_in_room(type)
69
- last_user = users.pop
70
- if users.size > 0
71
- return users.collect{|user| user["name"] }.join(", ") + " and #{ last_user["name"]}"
72
- else
73
- return last_user["name"]
69
+ if users.size > 1
70
+ last_user = users.pop
71
+ return users.collect{|user| user.name }.join(", ") + " and #{ last_user.name}"
72
+ elsif users.size == 1
73
+ return users.first.name
74
74
  end
75
75
  end
76
76
  end
@@ -72,17 +72,18 @@ module CeilingCat
72
72
  @users_in_room = @campfire_room.users
73
73
  end
74
74
 
75
- @users_in_room.find_all do |user|
76
- unless is_me?(CeilingCat::User.new(user[:name], :id => user[:id], :role => user[:type]))
75
+ @users_in_room.collect{ |user_in_room|
76
+ user = CeilingCat::User.new(user_in_room[:name], :id => user_in_room[:id], :role => user_in_room[:type])
77
+ unless is_me?(user)
77
78
  if opts[:type].present?
78
- if user[:type].to_s.downcase == opts[:type].downcase
79
- CeilingCat::User.new(user[:name], :id => user[:id], :role => user[:type])
79
+ if user.role.to_s.downcase == opts[:type].downcase
80
+ user
80
81
  end
81
82
  else
82
- CeilingCat::User.new(user[:name], :id => user[:id], :role => user[:type])
83
+ user
83
84
  end
84
85
  end
85
- end
86
+ }
86
87
  end
87
88
 
88
89
  def say(something_to_say)
@@ -0,0 +1,3 @@
1
+ %w{connection room event}.each do |file|
2
+ require "ceiling_cat/services/irc/#{file}"
3
+ end
@@ -0,0 +1,24 @@
1
+ require 'irc-socket'
2
+
3
+ module CeilingCat
4
+ module IRC
5
+ class Connection < CeilingCat::Connection
6
+ attr_accessor :irc
7
+
8
+ def initialize(config)
9
+ super
10
+ end
11
+
12
+ def irc
13
+ return @irc if @irc
14
+ server = @server || 'irc.freenode.org'
15
+ port = @port || 6667
16
+ @irc = IRCSocket.new(server)
17
+ end
18
+
19
+ def total_user_count
20
+ 1000
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ module CeilingCat
2
+ module IRC
3
+ class Event < CeilingCat::Event
4
+
5
+ def type
6
+ case @type
7
+ when "EnterMessage", :entrance
8
+ :entrance
9
+ when "TextMessage", :chat
10
+ :chat
11
+ when "LeaveMessage", "KickMessage", :exit
12
+ :exit
13
+ end
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,113 @@
1
+ module CeilingCat
2
+ module IRC
3
+ class Room < CeilingCat::Room
4
+ attr_accessor :user_names, :ops_names
5
+
6
+ def initialize(opts={})
7
+ super
8
+ @ops_names = []
9
+ end
10
+
11
+ def irc
12
+ @connection.irc
13
+ end
14
+
15
+ def watch
16
+ puts "Watching room..."
17
+ irc.connect
18
+ if irc.connected?
19
+ irc.nick config.nickname
20
+ irc.pass config.password if config.password.present?
21
+ irc.user config.nickname, "+B", "*", config.nickname
22
+
23
+ while line = irc.read
24
+ # Join a channel after MOTD
25
+ if line.split[1] == '376'
26
+ irc.join config.room
27
+ elsif line.split[1] == "353"
28
+ @user_names = line.match(/:.+\s353\s.+[\s@]?\s#.+\s:(.+)/i)[1].split
29
+ irc.privmsg "chanserv", "access #{config.room} list"
30
+ elsif match = line.match(/:.+\sNOTICE.+:\d\s+(\w+)\s+\+(\w+)/)
31
+ @ops_names << match[1] if match[2].include?("O")
32
+ @ops_names.uniq!
33
+ end
34
+
35
+ puts "Received: #{line}"
36
+ begin
37
+ if message = message_parts(line)
38
+ user = CeilingCat::User.new(message[:name], :role => user_role(message[:name]))
39
+ if !is_me?(user)
40
+ event = CeilingCat::Campfire::Event.new(self, message[:body], user, :type => message[:type])
41
+ event.handle
42
+ end
43
+ end
44
+ rescue => e
45
+ raise e
46
+ end
47
+ end
48
+ end
49
+ rescue Interrupt
50
+ puts "Leaving room..."
51
+ irc.part("#{config.room}")
52
+ rescue => e
53
+ puts e.message
54
+ puts e.backtrace.join("\n")
55
+ retry
56
+ end
57
+
58
+ def say(something_to_say)
59
+ Array(something_to_say).each do |line|
60
+ irc.privmsg config.room, line
61
+ end
62
+ end
63
+
64
+ def users_in_room(opts={})
65
+ @user_names.collect {|user_name|
66
+ user_name = user_name.sub(/^@/,"")
67
+ user = CeilingCat::User.new(user_name, :role => user_role(user_name))
68
+ unless is_me?(user)
69
+ if opts[:type].present?
70
+ if user.role.to_s.downcase == opts[:type].downcase
71
+ user
72
+ end
73
+ else
74
+ user
75
+ end
76
+ end
77
+ }.compact
78
+ end
79
+
80
+ def user_role(name)
81
+ if @ops_names.include?(name)
82
+ "member"
83
+ else
84
+ "guest"
85
+ end
86
+ end
87
+
88
+ def is_me?(user)
89
+ user.name == me.name
90
+ end
91
+
92
+ def me
93
+ @me ||= CeilingCat::User.new(config.nickname, :role => "member")
94
+ end
95
+
96
+ def message_parts(message)
97
+ if message =~ /\sPRIVMSG\s/
98
+ parts = message.match /^:(.+?)!(.+?)@(.+?)\sPRIVMSG\s(#.+):(.+)/i
99
+ return {:name => parts[1], :body => parts[5], :type => :chat}
100
+ elsif message =~ /\sJOIN\s/
101
+ parts = message.match /^:(.+?)!(.+?)@(.+?)\s(.+)\s:(#.+)/i
102
+ return {:name => parts[1], :body => nil, :type => :entrance}
103
+ elsif message =~ /PING\s/
104
+ puts "Sent: PONG"
105
+ irc.pong message.match(/PING\s:(.+)/)[1]
106
+ return nil
107
+ else
108
+ return nil
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -38,6 +38,10 @@ module CeilingCat
38
38
  connection = CeilingCat::Campfire::Connection.new(self.config)
39
39
  room = CeilingCat::Campfire::Room.new(:connection => connection, :room_name => self.config.room)
40
40
  room.watch
41
+ when 'irc'
42
+ connection = CeilingCat::IRC::Connection.new(self.config)
43
+ room = CeilingCat::IRC::Room.new(:connection => connection, :room_name => self.config.room)
44
+ room.watch
41
45
  else
42
46
  raise CeilingCat::UnsupportedChatServiceError.new("#{self.config.service} is not a supported chat service.")
43
47
  end
@@ -4,8 +4,8 @@ module CeilingCat
4
4
 
5
5
  def initialize(name, opts={})
6
6
  @name = name
7
- @id = opts[:id]
8
- @role = opts[:role]
7
+ @id = opts[:id] || rand(10000000)
8
+ @role = opts[:role] || "guest"
9
9
  end
10
10
 
11
11
  def to_s
@@ -1,3 +1,3 @@
1
1
  module CeilingCat
2
- VERSION = "0.0.9"
2
+ VERSION = "0.1.0"
3
3
  end
data/setup/Chatfile CHANGED
@@ -4,11 +4,19 @@ require 'ceiling_cat/plugins/calc'
4
4
  require 'ceiling_cat/plugins/greeter'
5
5
 
6
6
  CeilingCat::Setup.configure do |config|
7
+ # Campfire Settings. Only use one service per chatfile
7
8
  config.service = 'campfire'
8
9
  config.subdomain = 'username'
9
10
  config.token = '12345abcde' # The API token of the account Ceiling Cat will use. Available at https://<subdomain>.campfirenow.com/member/edit
10
11
  config.room = 'Test Room'
11
12
  config.ssl = true
13
+
14
+ # IRC Settings. Only use one service per chatfile
15
+ # config.service = 'irc'
16
+ # config.server = 'irc.freenode.org'
17
+ # config.nick = 'nickname'
18
+ # config.password = 'Q7Af6laDKza2SOM'
19
+ # config.room = '#my_room'
12
20
 
13
21
  config.plugins = [CeilingCat::Plugin::About,
14
22
  CeilingCat::Plugin::Greeter,
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: 13
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 9
10
- version: 0.0.9
10
+ version: 0.1.0
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-08-26 00:00:00 Z
18
+ date: 2011-08-30 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: tinder
@@ -66,9 +66,25 @@ dependencies:
66
66
  type: :runtime
67
67
  version_requirements: *id003
68
68
  - !ruby/object:Gem::Dependency
69
- name: rspec
69
+ name: irc-socket
70
70
  prerelease: false
71
71
  requirement: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - "="
75
+ - !ruby/object:Gem::Version
76
+ hash: 21
77
+ segments:
78
+ - 1
79
+ - 0
80
+ - 1
81
+ version: 1.0.1
82
+ type: :runtime
83
+ version_requirements: *id004
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ prerelease: false
87
+ requirement: &id005 !ruby/object:Gem::Requirement
72
88
  none: false
73
89
  requirements:
74
90
  - - "="
@@ -80,11 +96,11 @@ dependencies:
80
96
  - 0
81
97
  version: 2.6.0
82
98
  type: :development
83
- version_requirements: *id004
99
+ version_requirements: *id005
84
100
  - !ruby/object:Gem::Dependency
85
101
  name: ruby-debug
86
102
  prerelease: false
87
- requirement: &id005 !ruby/object:Gem::Requirement
103
+ requirement: &id006 !ruby/object:Gem::Requirement
88
104
  none: false
89
105
  requirements:
90
106
  - - ">="
@@ -94,11 +110,11 @@ dependencies:
94
110
  - 0
95
111
  version: "0"
96
112
  type: :development
97
- version_requirements: *id005
113
+ version_requirements: *id006
98
114
  - !ruby/object:Gem::Dependency
99
115
  name: fakeweb
100
116
  prerelease: false
101
- requirement: &id006 !ruby/object:Gem::Requirement
117
+ requirement: &id007 !ruby/object:Gem::Requirement
102
118
  none: false
103
119
  requirements:
104
120
  - - ">="
@@ -108,7 +124,7 @@ dependencies:
108
124
  - 0
109
125
  version: "0"
110
126
  type: :development
111
- version_requirements: *id006
127
+ version_requirements: *id007
112
128
  description: Ceiling Cat is watching you chat. A Campfire chat bot!
113
129
  email:
114
130
  - chris@zencoder.com
@@ -144,6 +160,10 @@ files:
144
160
  - lib/ceiling_cat/services/campfire/connection.rb
145
161
  - lib/ceiling_cat/services/campfire/event.rb
146
162
  - lib/ceiling_cat/services/campfire/room.rb
163
+ - lib/ceiling_cat/services/irc.rb
164
+ - lib/ceiling_cat/services/irc/connection.rb
165
+ - lib/ceiling_cat/services/irc/event.rb
166
+ - lib/ceiling_cat/services/irc/room.rb
147
167
  - bin/ceiling_cat
148
168
  homepage: http://zencoder.com
149
169
  licenses: []