telegram_meetup_bot 0.1.5 → 0.1.6
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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/config_samples/responses.yml +2 -0
- data/lib/telegram_meetup_bot/calendar.rb +16 -2
- data/lib/telegram_meetup_bot/commands_handler.rb +5 -1
- data/lib/telegram_meetup_bot/handler_helper.rb +13 -1
- data/lib/telegram_meetup_bot/initializers/responses_loader.rb +1 -1
- data/lib/telegram_meetup_bot/storage.rb +1 -1
- data/lib/telegram_meetup_bot/version.rb +1 -1
- data/spec/telegram_meetup_bot/calendar_spec.rb +57 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae8241da7158681a6a6be60b126372aa00f3b895
|
4
|
+
data.tar.gz: fda9664f80b483f967a41e33a7be66cbb9cf8a66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52101c58e82e849dbd27f7af9512f65fca7b55c616d8c0fe1271ffa069cc3101fa8d7bee5632c25e451a687740cb3c60f237bcaa2094b2ee1ac0b6111784629e
|
7
|
+
data.tar.gz: e3ea5104324d11e57d24137cb3881f434ab8652cdf754de2c36731d963737d843fddbd2716f99dc8b32db8d867bf7914eb52d62dfb5815b809d642289270733b
|
data/README.md
CHANGED
@@ -4,9 +4,9 @@
|
|
4
4
|
|
5
5
|
Telegram bot for meetups organisation. It suits really well for small communities, where people want to attend a place together, but not on regular basis.
|
6
6
|
|
7
|
-

|
8
8
|
|
9
|
-
Available commands: ```/date, /list, /cancel, /cal, /help```
|
9
|
+
Available commands: ```/date, /list, /cancel, /cal, /help, /user```
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
@@ -7,6 +7,8 @@ nobody: "No one planned to come on %date%."
|
|
7
7
|
not_subscribed: "You wasn't subscribed on %date%."
|
8
8
|
no_username: "%first_name%, please set a username in the Telegram settings."
|
9
9
|
cal: "Reserved days (number of people) in %date%:"
|
10
|
+
user: "@%username% has reserved these days in %date%:"
|
11
|
+
user_without_reservation: "@%username% hasn't reserved any days in %date%."
|
10
12
|
help: |
|
11
13
|
Hi, %first_name%. Use this commands list:
|
12
14
|
/date 14:00 - add yourself to the today list (time is optional);
|
@@ -41,7 +41,7 @@ module TelegramMeetupBot
|
|
41
41
|
def self.submited_days_of_month(month)
|
42
42
|
storage = Initializers::ConfigLoader.storage
|
43
43
|
dates = storage.get_all_available_dates
|
44
|
-
min, max =
|
44
|
+
min, max = build_dates_window(month)
|
45
45
|
|
46
46
|
dates = dates.keep_if { |date, _| date >= min && date <= max }.sort
|
47
47
|
dates.map do |date, users_yml|
|
@@ -49,6 +49,20 @@ module TelegramMeetupBot
|
|
49
49
|
end.join(', ')
|
50
50
|
end
|
51
51
|
|
52
|
+
def self.submited_days_by_user(username)
|
53
|
+
storage = Initializers::ConfigLoader.storage
|
54
|
+
dates = storage.get_all_available_dates
|
55
|
+
min, max = build_dates_window(Date.today.month)
|
56
|
+
username.downcase!
|
57
|
+
|
58
|
+
dates = dates.keep_if do |date, users_yml|
|
59
|
+
date >= min && date <= max &&
|
60
|
+
YAML.load(users_yml).any? { |u| u[:username].downcase == username }
|
61
|
+
end
|
62
|
+
|
63
|
+
dates.sort.map { |date, _| date.match(/\d\d$/) }.join(', ')
|
64
|
+
end
|
65
|
+
|
52
66
|
private
|
53
67
|
|
54
68
|
def process_user(&block)
|
@@ -74,7 +88,7 @@ module TelegramMeetupBot
|
|
74
88
|
end
|
75
89
|
end
|
76
90
|
|
77
|
-
def self.
|
91
|
+
def self.build_dates_window(month)
|
78
92
|
today = Date.today
|
79
93
|
year = month < today.month ? today.next_year.year : today.year
|
80
94
|
max = Date.new(year, month, -1).to_s
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module TelegramMeetupBot
|
2
2
|
class CommandsHandler
|
3
|
-
COMMANDS = %w(date list cancel help cal)
|
3
|
+
COMMANDS = %w(date list cancel help cal user)
|
4
4
|
BLACK_LIST = %w(me)
|
5
5
|
attr_reader :command, :params, :helper, :botan
|
6
6
|
|
@@ -65,6 +65,10 @@ module TelegramMeetupBot
|
|
65
65
|
helper.handle_cal month
|
66
66
|
end
|
67
67
|
|
68
|
+
def user(params)
|
69
|
+
helper.handle_user params.first
|
70
|
+
end
|
71
|
+
|
68
72
|
def help
|
69
73
|
helper.handle_default_command
|
70
74
|
end
|
@@ -51,6 +51,15 @@ module TelegramMeetupBot
|
|
51
51
|
messenger.send_text list_response(list: dates, month: month)
|
52
52
|
end
|
53
53
|
|
54
|
+
def handle_user(username)
|
55
|
+
username ||= author.username
|
56
|
+
dates = Calendar.submited_days_by_user(username)
|
57
|
+
month = Date.today
|
58
|
+
response = list_response(list: dates, month: month, username: username,
|
59
|
+
empty_key: 'user_without_reservation')
|
60
|
+
messenger.send_text response
|
61
|
+
end
|
62
|
+
|
54
63
|
private
|
55
64
|
|
56
65
|
def handle(date, &block)
|
@@ -70,8 +79,10 @@ module TelegramMeetupBot
|
|
70
79
|
end
|
71
80
|
|
72
81
|
def list_response(args)
|
82
|
+
empty_key = args.fetch(:empty_key) { 'nobody' }
|
83
|
+
|
73
84
|
if args.fetch(:list).empty?
|
74
|
-
build_response(args.merge(key:
|
85
|
+
build_response(args.merge(key: empty_key))
|
75
86
|
else
|
76
87
|
build_response(args) { |response| "#{response}\n#{args.fetch(:list)}" }
|
77
88
|
end
|
@@ -83,6 +94,7 @@ module TelegramMeetupBot
|
|
83
94
|
response.gsub!('%first_name%', author.first_name)
|
84
95
|
response.gsub!('%date%', args[:date].strftime('%d %h %Y')) if args[:date]
|
85
96
|
response.gsub!('%date%', args[:month].strftime('%h %Y')) if args[:month]
|
97
|
+
response.gsub!('%username%', args[:username]) if args[:username]
|
86
98
|
|
87
99
|
block_given? ? yield(response) : response
|
88
100
|
end
|
@@ -3,7 +3,7 @@ module TelegramMeetupBot
|
|
3
3
|
class ResponsesLoader < Base
|
4
4
|
FILE_NAME = 'responses.yml'
|
5
5
|
AVAILABLE_KEYS = %w(date list cancel wrong_date_format old_date nobody
|
6
|
-
not_subscribed no_username help cal)
|
6
|
+
not_subscribed no_username help cal user user_without_reservation)
|
7
7
|
|
8
8
|
def self.responses
|
9
9
|
@configurations
|
@@ -121,4 +121,61 @@ RSpec.describe TelegramMeetupBot::Calendar do
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
end
|
124
|
+
|
125
|
+
describe 'Calendar#submited_days_by_user' do
|
126
|
+
let(:storage) { double('storage') }
|
127
|
+
let(:month) { 7 }
|
128
|
+
let(:username) { 'timur' }
|
129
|
+
subject { described_class }
|
130
|
+
before { allow(storage).to receive(:get_all_available_dates).and_return(dates) }
|
131
|
+
|
132
|
+
context "user has reserved days in current month" do
|
133
|
+
let(:dates) {
|
134
|
+
{"2015-07-30"=>"---\n- :id: 65208698\n :username: #{username}\n :first_name: Timur\n",
|
135
|
+
"2015-07-15"=>"---\n- :id: 65208698\n :username: #{username}\n :first_name: Timur\n",
|
136
|
+
"2015-07-16"=>"---\n- :id: 65208698\n :username: #{username}\n :first_name: Timur\n :time: '10:10'\n",
|
137
|
+
"2015-06-14"=>"---\n- :id: 65208698\n :username: #{username}\n :first_name: Timur\n",
|
138
|
+
"2015-08-17"=>"---\n- :id: 65208698\n :username: #{username}\n :first_name: Timur\n"}
|
139
|
+
}
|
140
|
+
|
141
|
+
context "today is first day of month" do
|
142
|
+
it "works" do
|
143
|
+
Timecop.freeze(Date.new(2015, month, 1)) do
|
144
|
+
expect(subject.submited_days_by_user(username)).to eq("15, 16, 30")
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context "today is end of month" do
|
150
|
+
it "works" do
|
151
|
+
Timecop.freeze(Date.new(2015, month, 20)) do
|
152
|
+
expect(subject.submited_days_by_user(username)).to eq("30")
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context "case insensitive" do
|
158
|
+
it "works" do
|
159
|
+
Timecop.freeze(Date.new(2015, month, 1)) do
|
160
|
+
expect(subject.submited_days_by_user(username.upcase)).to eq("15, 16, 30")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context "user hasn't reserved any days in current month" do
|
167
|
+
let(:dates) {
|
168
|
+
{"2015-07-30"=>"---\n- :id: 65208692\n :username: asuka\n :first_name: Asuka\n",
|
169
|
+
"2015-07-15"=>"---\n- :id: 65208692\n :username: asuka\n :first_name: Asuka\n",
|
170
|
+
"2015-07-16"=>"---\n- :id: 65208692\n :username: asuka\n :first_name: Asuka\n :time: '10:10'\n",
|
171
|
+
"2015-06-14"=>"---\n- :id: 65208698\n :username: #{username}\n :first_name: Timur\n",
|
172
|
+
"2015-08-17"=>"---\n- :id: 65208698\n :username: #{username}\n :first_name: Timur\n"}
|
173
|
+
}
|
174
|
+
it "starts from today" do
|
175
|
+
Timecop.freeze(Date.new(2015, month, 1)) do
|
176
|
+
expect(subject.submited_days_by_user(username)).to eq("")
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
124
181
|
end
|