1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
# Time Zone Plugin for rbot
# (c) 2006 Ian Monroe <ian@monroe.nu>
# Licensed under MIT License.
require 'tzinfo'
class TimePlugin < Plugin
def help(plugin, topic="")
"time <time zone> to get the local time of a certain location. <time zone> can be <Continent/City> or <two character country code>. time <nick> to see the local time of that person if their time zone is set. time admin set <nick> <time zone> to set the time zone for another user. time [admin] reset [nick] to let the bot forget about the tzinfo about someone"
end
def initialize
super
# this plugin only wants to store strings
class << @registry
def store(val)
val
end
def restore(val)
val
end
end
end
def getTime(m, zone )
if zone.length == 2 then #country code
zone.upcase!
zone = 'GB' if zone == 'UK' #country doesn't know its own name
begin
nationZones = TZInfo::Country.get(zone).zone_identifiers
if nationZones.size == 1 then
zone = nationZones[0]
else
m.reply "#{zone} has the cities of #{nationZones.join( ', ' )}."
end
rescue TZInfo::InvalidCountryCode
m.reply "#{zone} is not a valid country code."
end
end
['/', '_'].each { |sp|
arr = Array.new
zone.split(sp).each{ |s|
s[0] = s[0,1].upcase
s[1, s.length] = s[1, s.length].downcase if sp == '/'
arr.push(s) }
zone = arr.join( sp )
}
TZInfo::Timezone.get( zone ).now
end
def showTime(m, params)
zone = params[:where].join('_')
if params[:where].size > 0 then
begin
m.reply "#{zone} - #{getTime( m, zone )}"
rescue TZInfo::InvalidTimezoneIdentifier
if @registry.has_key?( zone ) then
zone = @registry[ zone ]
m.reply "#{zone} - #{getTime( m, zone )}"
else
m.reply "#{zone} is an unknown time."
end
end
else
if @registry.has_key?( m.sourcenick) then
zone = @registry[ m.sourcenick ]
m.reply "#{m.sourcenick}: #{zone} - #{getTime( m, zone )}"
else
m.reply "#{m.sourcenick}: use time set <Continent/City> to set your timezone."
end
end
end
def setUserZone( m, params )
if params[:where].size > 0 then
s = setZone( m, m.sourcenick, params[:where].join('_') )
else
m.reply "Requires Continent/City or country code"
end
end
def resetUserZone( m, params )
s = resetZone( m, m.sourcenick)
end
def setAdminZone( m, params )
if params[:who] and params[:where].size > 0 then
s = setZone( m, params[:who], params[:where].join('_') )
else
m.reply "Requires a nick and the Continent/City or country code"
end
end
def resetAdminZone( m, params )
if params[:who]
s = resetZone( m, params[:who])
else
m.reply "Requires a nick"
end
end
def setZone( m, user, zone )
begin
getTime( m, zone )
rescue TZInfo::InvalidTimezoneIdentifier
m.reply "#{zone} is an invalid timezone. Format is Continent/City or a two character country code."
return
end
@registry[ user ] = zone
m.reply "Ok, I'll remember that #{user} is on the #{zone} timezone"
end
def resetZone( m, user )
@registry.delete(user)
m.reply "Ok, I've forgotten #{user}'s timezone"
end
end
plugin = TimePlugin.new
plugin.default_auth('admin', false)
plugin.map 'time set [time][zone] [to] *where', :action=> 'setUserZone', :defaults => {:where => false}
plugin.map 'time reset [time][zone]', :action=> 'resetUserZone'
plugin.map 'time admin set [time][zone] [for] :who [to] *where', :action=> 'setAdminZone', :defaults => {:who => false, :where => false}
plugin.map 'time admin reset [time][zone] [for] :who', :action=> 'resetAdminZone', :defaults => {:who => false}
plugin.map 'time *where', :action => 'showTime', :defaults => {:where => false}
|