forked from TimWSpence/discord-sched-bot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbot.rb
170 lines (146 loc) · 3.49 KB
/
bot.rb
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
require 'discordrb'
require 'securerandom'
require 'time'
$command_prefix = :sched
$store = {}
class Event
attr_reader :id, :name, :time, :accepted, :declined, :maybe
def initialize(id, name, time)
@id = id
@name = name
@time = time
@accepted = []
@declined = []
@maybe = []
end
def to_s
"#{@id}: #{@name} scheduled for #{@time}"
end
def responses
<<~EOF
Yes: #{@accepted.map(&:username).join(', ')}
No: #{@declined.map(&:username).join(', ')}
Maybe: #{@maybe.map(&:username).join(', ')}
EOF
end
def accept(user)
remove_user_from_lists(user)
@accepted.push(user)
end
def decline(user)
remove_user_from_lists(user)
@declined.push(user)
end
def maybe(user)
remove_user_from_lists(user)
@maybe.push(user)
end
private
def remove_user_from_lists(user)
@accepted.delete_if {|u| u.id == user.id }
@declined.delete_if {|u| u.id == user.id }
@maybe.delete_if {|u| u.id == user.id }
end
end
def handle_create(event, args)
id = SecureRandom.uuid
name = args[1]
time = Time.parse(args[2..-1].join(' '))
if time < Time.now
event.respond "Cannot create an event in the past"
else
$store[id] = Event.new(id, name, time)
event.respond "New event #{name} scheduled for #{time}"
end
end
def handle_list(event, args)
$store.delete_if { |key, value| value.time < Time.now }
if $store.empty?
event.respond "There are no events currently scheduled"
else
event.respond $store.values.join("\n")
end
end
def handle_yes(event, args)
handle_missing(event, args) do |scheduled|
scheduled.accept(event.user)
nil
end
end
def handle_no(event, args)
handle_missing(event, args) do |scheduled|
scheduled.decline(event.user)
nil
end
end
def handle_maybe(event, args)
handle_missing(event, args) do |scheduled|
scheduled.maybe(event.user)
nil
end
end
def handle_delete(event, args)
handle_missing(event, args) do |scheduled|
$store.delete(scheduled.id)
nil
end
end
def handle_responses(event, args)
handle_missing(event, args) do |scheduled|
scheduled.responses
end
end
def handle_missing(event, args, &block)
event_id = args[1]
scheduled = $store[event_id]
if scheduled
event.respond block[scheduled]
else
event.respond "No event found with id #{event_id}"
end
end
def handle_help(event, args)
event.respond <<~EOF
Usage: !#{$command_prefix} <COMMAND> <ARGS>
where <COMMAND> one of:
list
list all registered future events
create name time
Create a new event at the given time
delete id
Delete the event with the given id
accept|yes id
Register for the event with the given id
decline|no id
Decline the event with the given id
maybe
Sit on the fence for the event with the given id (Don't be that guy!)
responses
List the responses to the event (yes, no, maybe)
EOF
end
bot = Discordrb::Commands::CommandBot.new token: '', client_id: 1, prefix: '!'
puts "This bot's invite URL is #{bot.invite_url}."
puts 'Click on it to invite it to your server.'
bot.command $command_prefix do |event, *args|
case args.first
when 'create'
handle_create(event, args)
when 'delete'
handle_delete(event, args)
when 'list'
handle_list(event, args)
when /accept|yes/
handle_yes(event, args)
when /decline|no/
handle_no(event, args)
when 'maybe'
handle_maybe(event, args)
when 'help'
handle_help(event, args)
when 'responses'
handle_responses(event, args)
else event.respond "Command not recognised"
end
end
bot.run