telegram_meetup_bot 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config_samples/responses.yml +2 -0
- data/lib/telegram_meetup_bot/commands/base.rb +70 -0
- data/lib/telegram_meetup_bot/commands/cal_command.rb +24 -0
- data/lib/telegram_meetup_bot/commands/cancel_command.rb +22 -0
- data/lib/telegram_meetup_bot/commands/date_command.rb +28 -0
- data/lib/telegram_meetup_bot/commands/factory.rb +32 -0
- data/lib/telegram_meetup_bot/commands/help_command.rb +9 -0
- data/lib/telegram_meetup_bot/commands/list_command.rb +20 -0
- data/lib/telegram_meetup_bot/commands/nil_username.rb +9 -0
- data/lib/telegram_meetup_bot/commands/user_command.rb +17 -0
- data/lib/telegram_meetup_bot/commands.rb +13 -0
- data/lib/telegram_meetup_bot/commands_handler.rb +6 -63
- data/lib/telegram_meetup_bot/version.rb +1 -1
- data/lib/telegram_meetup_bot.rb +1 -1
- data/spec/telegram_meetup_bot/commands/cal_command_spec.rb +36 -0
- data/spec/telegram_meetup_bot/commands/cancel_command_spec.rb +35 -0
- data/spec/telegram_meetup_bot/commands/date_command_spec.rb +35 -0
- data/spec/telegram_meetup_bot/commands/factory_spec.rb +44 -0
- data/spec/telegram_meetup_bot/commands/list_command_spec.rb +37 -0
- metadata +22 -5
- data/lib/telegram_meetup_bot/handler_helper.rb +0 -102
- data/spec/telegram_meetup_bot/commands_handler_spec.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16ad2ffb6a84e883548fba023e8d84fa21a2dc63
|
4
|
+
data.tar.gz: 57ec211d5bc0b5913172250058270d8393a4d89b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afc655b8e9ab2ea0556578b0b620cbb4c74fa79d3a737c5cd74459e9e742b69bbb11d0fd2e59d482670f4e15f0448e7fca88a377cdbb576e719409905aa7972f
|
7
|
+
data.tar.gz: b753c521d5a1d6e72b0dc2596e3ab73cbc14ed851d2ec6f7fab6ab4327e30e37ffd38d59bac536800976eff3d259b043096a6ee52093ae813b466ec200d6944d
|
@@ -18,4 +18,6 @@ help: |
|
|
18
18
|
/cancel - remove yourself from the today list;
|
19
19
|
/cancel 23.04.16 - remove yourself from the list on 23.04.16;
|
20
20
|
/cal 1 - display reserved days in January (it uses current month by default)
|
21
|
+
/user - display your reserved days
|
22
|
+
/user username - display reserved days by username
|
21
23
|
There are 3 formats for date available: 14 - day, 14.09 - day and month, 14.09.15 - day, month and year;
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module TelegramMeetupBot
|
2
|
+
module Commands
|
3
|
+
class Base
|
4
|
+
attr_reader :message
|
5
|
+
|
6
|
+
def initialize(message)
|
7
|
+
@message = message
|
8
|
+
end
|
9
|
+
|
10
|
+
def exec
|
11
|
+
fail NotImplementedError, 'This method should be overriden'
|
12
|
+
end
|
13
|
+
|
14
|
+
def command
|
15
|
+
@command ||= if COMMANDS.include?(message.command)
|
16
|
+
message.command
|
17
|
+
else
|
18
|
+
DEFAULT_COMMAND
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def author
|
25
|
+
message.author
|
26
|
+
end
|
27
|
+
|
28
|
+
def params
|
29
|
+
message.params
|
30
|
+
end
|
31
|
+
|
32
|
+
def handle_date(date, &block)
|
33
|
+
if date_has_error?(date)
|
34
|
+
@error
|
35
|
+
else
|
36
|
+
yield
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def date_has_error?(date)
|
41
|
+
if date.nil?
|
42
|
+
@error = build_response(key: 'wrong_date_format')
|
43
|
+
elsif date < Date.today
|
44
|
+
@error = build_response(key: 'old_date')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def list_response(args)
|
49
|
+
empty_key = args.fetch(:empty_key) { 'nobody' }
|
50
|
+
|
51
|
+
if args.fetch(:list).empty?
|
52
|
+
build_response(args.merge(key: empty_key))
|
53
|
+
else
|
54
|
+
build_response(args) { |response| "#{response}\n#{args.fetch(:list)}" }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def build_response(args = {})
|
59
|
+
response_key = args.fetch(:key) { command }
|
60
|
+
response = Initializers::ResponsesLoader.responses[response_key].dup
|
61
|
+
response.gsub!('%first_name%', author.first_name)
|
62
|
+
response.gsub!('%date%', args[:date].strftime('%d %h %Y')) if args[:date]
|
63
|
+
response.gsub!('%date%', args[:month].strftime('%h %Y')) if args[:month]
|
64
|
+
response.gsub!('%username%', args[:username]) if args[:username]
|
65
|
+
|
66
|
+
block_given? ? yield(response) : response
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module TelegramMeetupBot
|
2
|
+
module Commands
|
3
|
+
class CalCommand < Base
|
4
|
+
def exec
|
5
|
+
dates = Calendar.submited_days_of_month(month)
|
6
|
+
list_response(list: dates, month: month_with_year)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def month
|
12
|
+
@month ||= ParamsParser.new(params.first).parse_month if params.any?
|
13
|
+
@month ||= Date.today.month
|
14
|
+
@month
|
15
|
+
end
|
16
|
+
|
17
|
+
def month_with_year
|
18
|
+
today = Date.today
|
19
|
+
year = month < today.month ? today.next_year.year : today.year
|
20
|
+
Date.new(year, month)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module TelegramMeetupBot
|
2
|
+
module Commands
|
3
|
+
class CancelCommand < Base
|
4
|
+
def exec
|
5
|
+
handle_date(date) do
|
6
|
+
calendar = Calendar.new(date: date, user: author)
|
7
|
+
deleted_user = calendar.delete_user_from_date
|
8
|
+
args = deleted_user ? {} : {key: 'not_subscribed', date: date}
|
9
|
+
build_response(args)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def date
|
16
|
+
@parsed_date ||= ParamsParser.new(params.first).parse_date
|
17
|
+
@parsed_date ||= Date.today if params.empty?
|
18
|
+
@parsed_date
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module TelegramMeetupBot
|
2
|
+
module Commands
|
3
|
+
class DateCommand < Base
|
4
|
+
def exec
|
5
|
+
handle_date(date) do
|
6
|
+
Calendar.new(date: date, user: author, time: time).add_user_to_date
|
7
|
+
build_response(date: date)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def date
|
14
|
+
@parsed_date ||= ParamsParser.new(params.first).parse_date
|
15
|
+
@parsed_date ||= Date.today if params.empty? || only_time_passed?
|
16
|
+
@parsed_date
|
17
|
+
end
|
18
|
+
|
19
|
+
def only_time_passed?
|
20
|
+
time && params.size == 1
|
21
|
+
end
|
22
|
+
|
23
|
+
def time
|
24
|
+
@time ||= ParamsParser.new(params[1] || params[0]).parse_time
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module TelegramMeetupBot
|
2
|
+
module Commands
|
3
|
+
class Factory
|
4
|
+
class << self
|
5
|
+
def build(message)
|
6
|
+
return if BLACK_LIST.include?(message.command)
|
7
|
+
|
8
|
+
if no_username?(message)
|
9
|
+
TelegramMeetupBot::Commands::NilUsername.new(message)
|
10
|
+
else
|
11
|
+
klass(message.command).new(message)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def klass(command)
|
18
|
+
command = whitelisted_command(command).capitalize
|
19
|
+
Object.const_get "TelegramMeetupBot::Commands::#{command}Command"
|
20
|
+
end
|
21
|
+
|
22
|
+
def whitelisted_command(command)
|
23
|
+
COMMANDS.include?(command) ? command : DEFAULT_COMMAND
|
24
|
+
end
|
25
|
+
|
26
|
+
def no_username?(message)
|
27
|
+
message.author.username.nil?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module TelegramMeetupBot
|
2
|
+
module Commands
|
3
|
+
class ListCommand < Base
|
4
|
+
def exec
|
5
|
+
handle_date(date) do
|
6
|
+
users = Calendar.formated_users_for_date(date)
|
7
|
+
list_response(list: users, date: date)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def date
|
14
|
+
@parsed_date ||= ParamsParser.new(params.first).parse_date
|
15
|
+
@parsed_date ||= Date.today if params.empty?
|
16
|
+
@parsed_date
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TelegramMeetupBot
|
2
|
+
module Commands
|
3
|
+
class UserCommand < Base
|
4
|
+
def exec
|
5
|
+
dates = Calendar.submited_days_by_user(username)
|
6
|
+
list_response(list: dates, month: Date.today, username: username,
|
7
|
+
empty_key: 'user_without_reservation')
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def username
|
13
|
+
params.first.sub('@', '') || author.username
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'telegram_meetup_bot/commands/factory'
|
2
|
+
require 'telegram_meetup_bot/commands/base'
|
3
|
+
require 'telegram_meetup_bot/commands/nil_username'
|
4
|
+
require 'telegram_meetup_bot/commands/cal_command'
|
5
|
+
require 'telegram_meetup_bot/commands/cancel_command'
|
6
|
+
require 'telegram_meetup_bot/commands/date_command'
|
7
|
+
require 'telegram_meetup_bot/commands/help_command'
|
8
|
+
require 'telegram_meetup_bot/commands/list_command'
|
9
|
+
require 'telegram_meetup_bot/commands/user_command'
|
10
|
+
|
11
|
+
COMMANDS = %w(date list cancel help cal user)
|
12
|
+
BLACK_LIST = %w(me)
|
13
|
+
DEFAULT_COMMAND = 'help'
|
@@ -1,76 +1,19 @@
|
|
1
1
|
module TelegramMeetupBot
|
2
2
|
class CommandsHandler
|
3
|
-
|
4
|
-
BLACK_LIST = %w(me)
|
5
|
-
attr_reader :command, :params, :helper, :botan
|
3
|
+
attr_reader :command, :botan, :messenger
|
6
4
|
|
7
5
|
def initialize(args)
|
8
6
|
parser = MessageParser.new(args.fetch(:message))
|
9
|
-
@command =
|
10
|
-
@
|
11
|
-
@helper = HandlerHelper.new(
|
12
|
-
author: parser.author,
|
13
|
-
command: @command,
|
14
|
-
messenger: args.fetch(:messenger)
|
15
|
-
)
|
7
|
+
@command = TelegramMeetupBot::Commands::Factory.build(parser)
|
8
|
+
@messenger = args.fetch(:messenger)
|
16
9
|
@botan = args[:botan]
|
17
10
|
end
|
18
11
|
|
19
12
|
def process
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
botan.track(command) if botan
|
24
|
-
helper.send_empty_username_notification unless helper.author_has_username?
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def commands
|
30
|
-
COMMANDS + BLACK_LIST
|
31
|
-
end
|
32
|
-
|
33
|
-
def call_command(command)
|
34
|
-
if self.class.instance_method(command).arity == 0
|
35
|
-
send command
|
36
|
-
else
|
37
|
-
send command, params
|
13
|
+
if command
|
14
|
+
messenger.send_text(command.exec)
|
15
|
+
botan.track(command.command) if botan
|
38
16
|
end
|
39
17
|
end
|
40
|
-
|
41
|
-
# bot commands
|
42
|
-
|
43
|
-
def date(params)
|
44
|
-
date = ParamsParser.new(params.first).parse_date
|
45
|
-
time = ParamsParser.new(params[1] || params[0]).parse_time
|
46
|
-
date ||= Date.today if params.empty? || (time && params.size == 1)
|
47
|
-
helper.handle_date(date, time)
|
48
|
-
end
|
49
|
-
|
50
|
-
def list(params)
|
51
|
-
date = ParamsParser.new(params.first).parse_date
|
52
|
-
date ||= Date.today if params.empty?
|
53
|
-
helper.handle_date_list date
|
54
|
-
end
|
55
|
-
|
56
|
-
def cancel(params)
|
57
|
-
date = ParamsParser.new(params.first).parse_date
|
58
|
-
date ||= Date.today if params.empty?
|
59
|
-
helper.handle_date_cancel date
|
60
|
-
end
|
61
|
-
|
62
|
-
def cal(params)
|
63
|
-
month = ParamsParser.new(params.first).parse_month if params.any?
|
64
|
-
month ||= Date.today.month
|
65
|
-
helper.handle_cal month
|
66
|
-
end
|
67
|
-
|
68
|
-
def user(params)
|
69
|
-
helper.handle_user params.first
|
70
|
-
end
|
71
|
-
|
72
|
-
def help
|
73
|
-
helper.handle_default_command
|
74
|
-
end
|
75
18
|
end
|
76
19
|
end
|
data/lib/telegram_meetup_bot.rb
CHANGED
@@ -11,8 +11,8 @@ require 'telegram_meetup_bot/storage'
|
|
11
11
|
require 'telegram_meetup_bot/calendar'
|
12
12
|
require 'telegram_meetup_bot/commands_handler'
|
13
13
|
require 'telegram_meetup_bot/params_parser'
|
14
|
-
require 'telegram_meetup_bot/handler_helper'
|
15
14
|
require 'telegram_meetup_bot/botan'
|
15
|
+
require 'telegram_meetup_bot/commands'
|
16
16
|
|
17
17
|
module TelegramMeetupBot
|
18
18
|
def self.run(config_path)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe TelegramMeetupBot::Commands::CalCommand do
|
4
|
+
before { allow(TelegramMeetupBot::Initializers::ConfigLoader).to receive(:storage).and_return(storage)}
|
5
|
+
let(:storage) { double('storage') }
|
6
|
+
let(:from) { instance_double('from', id: 1, username: 'Ikari01', first_name: 'Shinji') }
|
7
|
+
let(:message) { instance_double('message', text: command, from: from) }
|
8
|
+
let(:message_parser) { TelegramMeetupBot::MessageParser.new(message) }
|
9
|
+
|
10
|
+
describe '#exec' do
|
11
|
+
subject { described_class.new(message_parser) }
|
12
|
+
let(:command) { '/cal 5' }
|
13
|
+
|
14
|
+
context 'month is in this year' do
|
15
|
+
it 'works' do
|
16
|
+
allow(TelegramMeetupBot::Calendar).to receive(:submited_days_of_month)
|
17
|
+
allow(subject).to receive(:list_response).with({month: Date.new(2015, 5, 1), list: nil})
|
18
|
+
expect(TelegramMeetupBot::Calendar).to receive(:submited_days_of_month)
|
19
|
+
Timecop.freeze(Date.new(2015, 4, 1)) do
|
20
|
+
subject.exec
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'month is in next year' do
|
26
|
+
it 'works' do
|
27
|
+
allow(TelegramMeetupBot::Calendar).to receive(:submited_days_of_month)
|
28
|
+
allow(subject).to receive(:list_response).with({month: Date.new(2016, 5, 1), list: nil})
|
29
|
+
expect(TelegramMeetupBot::Calendar).to receive(:submited_days_of_month)
|
30
|
+
Timecop.freeze(Date.new(2015, 6, 1)) do
|
31
|
+
subject.exec
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe TelegramMeetupBot::Commands::CancelCommand do
|
4
|
+
before { allow(TelegramMeetupBot::Initializers::ConfigLoader).to receive(:storage).and_return(storage)}
|
5
|
+
let(:storage) { double('storage') }
|
6
|
+
let(:from) { instance_double('from', id: 1, username: 'Ikari01', first_name: 'Shinji') }
|
7
|
+
let(:message) { instance_double('message', text: command, from: from) }
|
8
|
+
let(:message_parser) { TelegramMeetupBot::MessageParser.new(message) }
|
9
|
+
|
10
|
+
describe '#exec' do
|
11
|
+
subject { described_class.new(message_parser) }
|
12
|
+
|
13
|
+
context 'valid date' do
|
14
|
+
let(:command) { '/cancel 21.01.16' }
|
15
|
+
|
16
|
+
it 'works' do
|
17
|
+
allow_any_instance_of(TelegramMeetupBot::Calendar).to receive(:delete_user_from_date)
|
18
|
+
allow(subject).to receive(:build_response).and_return(true)
|
19
|
+
expect_any_instance_of(TelegramMeetupBot::Calendar).to receive(:delete_user_from_date)
|
20
|
+
subject.exec
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'invalid date' do
|
25
|
+
let(:command) { '/cancel 213.01.2015' }
|
26
|
+
|
27
|
+
it 'works' do
|
28
|
+
allow_any_instance_of(TelegramMeetupBot::Calendar).to receive(:delete_user_from_date)
|
29
|
+
allow(subject).to receive(:build_response).and_return(true)
|
30
|
+
expect_any_instance_of(TelegramMeetupBot::Calendar).not_to receive(:delete_user_from_date)
|
31
|
+
subject.exec
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe TelegramMeetupBot::Commands::DateCommand do
|
4
|
+
before { allow(TelegramMeetupBot::Initializers::ConfigLoader).to receive(:storage).and_return(storage)}
|
5
|
+
let(:storage) { double('storage') }
|
6
|
+
let(:from) { instance_double('from', id: 1, username: 'Ikari01', first_name: 'Shinji') }
|
7
|
+
let(:message) { instance_double('message', text: command, from: from) }
|
8
|
+
let(:message_parser) { TelegramMeetupBot::MessageParser.new(message) }
|
9
|
+
|
10
|
+
describe '#exec' do
|
11
|
+
subject { described_class.new(message_parser) }
|
12
|
+
|
13
|
+
context 'valid date' do
|
14
|
+
let(:command) { '/date 21.01.16' }
|
15
|
+
|
16
|
+
it 'works' do
|
17
|
+
allow_any_instance_of(TelegramMeetupBot::Calendar).to receive(:add_user_to_date)
|
18
|
+
allow(subject).to receive(:build_response).and_return(true)
|
19
|
+
expect_any_instance_of(TelegramMeetupBot::Calendar).to receive(:add_user_to_date)
|
20
|
+
subject.exec
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'invalid date' do
|
25
|
+
let(:command) { '/date 213.01.2015' }
|
26
|
+
|
27
|
+
it 'works' do
|
28
|
+
allow_any_instance_of(TelegramMeetupBot::Calendar).to receive(:add_user_to_date)
|
29
|
+
allow(subject).to receive(:build_response).and_return(true)
|
30
|
+
expect_any_instance_of(TelegramMeetupBot::Calendar).not_to receive(:add_user_to_date)
|
31
|
+
subject.exec
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe TelegramMeetupBot::Commands::Factory do
|
4
|
+
let(:from) { instance_double('from', id: 1, username: 'Ikari01', first_name: 'Shinji') }
|
5
|
+
let(:message) { instance_double('message', text: command, from: from) }
|
6
|
+
let(:message_parser) { TelegramMeetupBot::MessageParser.new(message) }
|
7
|
+
|
8
|
+
describe 'self#build' do
|
9
|
+
subject { described_class.build(message_parser) }
|
10
|
+
|
11
|
+
context 'command in blacklist' do
|
12
|
+
let(:command) { '/me' }
|
13
|
+
|
14
|
+
it 'works' do
|
15
|
+
expect(subject).to eq(nil)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'available command' do
|
20
|
+
let(:command) { '/date' }
|
21
|
+
|
22
|
+
it 'works' do
|
23
|
+
expect(subject.class).to eq(TelegramMeetupBot::Commands::DateCommand)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'not available command' do
|
28
|
+
let(:command) { '/qwerty' }
|
29
|
+
|
30
|
+
it 'uses default command' do
|
31
|
+
expect(subject.class).to eq(TelegramMeetupBot::Commands::HelpCommand)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'user without username' do
|
36
|
+
let(:from) { instance_double('from', id: 1, username: nil, first_name: 'Shinji') }
|
37
|
+
let(:command) { '/date' }
|
38
|
+
|
39
|
+
it 'does something' do
|
40
|
+
expect(subject.class).to eq(TelegramMeetupBot::Commands::NilUsername)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe TelegramMeetupBot::Commands::ListCommand do
|
4
|
+
before { allow(TelegramMeetupBot::Initializers::ConfigLoader).to receive(:storage).and_return(storage)}
|
5
|
+
let(:storage) { double('storage') }
|
6
|
+
let(:from) { instance_double('from', id: 1, username: 'Ikari01', first_name: 'Shinji') }
|
7
|
+
let(:message) { instance_double('message', text: command, from: from) }
|
8
|
+
let(:message_parser) { TelegramMeetupBot::MessageParser.new(message) }
|
9
|
+
|
10
|
+
describe '#exec' do
|
11
|
+
subject { described_class.new(message_parser) }
|
12
|
+
|
13
|
+
context 'valid date' do
|
14
|
+
let(:command) { '/list 21.01.16' }
|
15
|
+
|
16
|
+
it 'works' do
|
17
|
+
allow(TelegramMeetupBot::Calendar).to receive(:formated_users_for_date)
|
18
|
+
allow(subject).to receive(:build_response).and_return(true)
|
19
|
+
allow(subject).to receive(:list_response).and_return(true)
|
20
|
+
expect(TelegramMeetupBot::Calendar).to receive(:formated_users_for_date)
|
21
|
+
subject.exec
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'invalid date' do
|
26
|
+
let(:command) { '/list 213.01.2015' }
|
27
|
+
|
28
|
+
it 'works' do
|
29
|
+
allow(TelegramMeetupBot::Calendar).to receive(:formated_users_for_date)
|
30
|
+
allow(subject).to receive(:build_response).and_return(true)
|
31
|
+
allow(subject).to receive(:list_response).and_return(true)
|
32
|
+
expect(TelegramMeetupBot::Calendar).not_to receive(:formated_users_for_date)
|
33
|
+
subject.exec
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: telegram_meetup_bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Timur Yanberdin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -129,8 +129,17 @@ files:
|
|
129
129
|
- lib/telegram_meetup_bot/botan.rb
|
130
130
|
- lib/telegram_meetup_bot/calendar.rb
|
131
131
|
- lib/telegram_meetup_bot/client.rb
|
132
|
+
- lib/telegram_meetup_bot/commands.rb
|
133
|
+
- lib/telegram_meetup_bot/commands/base.rb
|
134
|
+
- lib/telegram_meetup_bot/commands/cal_command.rb
|
135
|
+
- lib/telegram_meetup_bot/commands/cancel_command.rb
|
136
|
+
- lib/telegram_meetup_bot/commands/date_command.rb
|
137
|
+
- lib/telegram_meetup_bot/commands/factory.rb
|
138
|
+
- lib/telegram_meetup_bot/commands/help_command.rb
|
139
|
+
- lib/telegram_meetup_bot/commands/list_command.rb
|
140
|
+
- lib/telegram_meetup_bot/commands/nil_username.rb
|
141
|
+
- lib/telegram_meetup_bot/commands/user_command.rb
|
132
142
|
- lib/telegram_meetup_bot/commands_handler.rb
|
133
|
-
- lib/telegram_meetup_bot/handler_helper.rb
|
134
143
|
- lib/telegram_meetup_bot/initializers.rb
|
135
144
|
- lib/telegram_meetup_bot/initializers/base.rb
|
136
145
|
- lib/telegram_meetup_bot/initializers/config_loader.rb
|
@@ -142,7 +151,11 @@ files:
|
|
142
151
|
- lib/telegram_meetup_bot/version.rb
|
143
152
|
- spec/spec_helper.rb
|
144
153
|
- spec/telegram_meetup_bot/calendar_spec.rb
|
145
|
-
- spec/telegram_meetup_bot/
|
154
|
+
- spec/telegram_meetup_bot/commands/cal_command_spec.rb
|
155
|
+
- spec/telegram_meetup_bot/commands/cancel_command_spec.rb
|
156
|
+
- spec/telegram_meetup_bot/commands/date_command_spec.rb
|
157
|
+
- spec/telegram_meetup_bot/commands/factory_spec.rb
|
158
|
+
- spec/telegram_meetup_bot/commands/list_command_spec.rb
|
146
159
|
- spec/telegram_meetup_bot/message_parser_spec.rb
|
147
160
|
- spec/telegram_meetup_bot/params_parser_spec.rb
|
148
161
|
- telegram_meetup_bot.gemspec
|
@@ -173,6 +186,10 @@ summary: Telegram bot for meetups organisation
|
|
173
186
|
test_files:
|
174
187
|
- spec/spec_helper.rb
|
175
188
|
- spec/telegram_meetup_bot/calendar_spec.rb
|
176
|
-
- spec/telegram_meetup_bot/
|
189
|
+
- spec/telegram_meetup_bot/commands/cal_command_spec.rb
|
190
|
+
- spec/telegram_meetup_bot/commands/cancel_command_spec.rb
|
191
|
+
- spec/telegram_meetup_bot/commands/date_command_spec.rb
|
192
|
+
- spec/telegram_meetup_bot/commands/factory_spec.rb
|
193
|
+
- spec/telegram_meetup_bot/commands/list_command_spec.rb
|
177
194
|
- spec/telegram_meetup_bot/message_parser_spec.rb
|
178
195
|
- spec/telegram_meetup_bot/params_parser_spec.rb
|
@@ -1,102 +0,0 @@
|
|
1
|
-
module TelegramMeetupBot
|
2
|
-
class HandlerHelper
|
3
|
-
attr_reader :command, :author, :messenger, :error
|
4
|
-
|
5
|
-
def initialize(args)
|
6
|
-
@command = args.fetch(:command)
|
7
|
-
@author = args.fetch(:author)
|
8
|
-
@messenger = args.fetch(:messenger)
|
9
|
-
end
|
10
|
-
|
11
|
-
def handle_date(date, time)
|
12
|
-
handle(date) do
|
13
|
-
Calendar.new(date: date, user: author, time: time).add_user_to_date
|
14
|
-
messenger.send_text build_response(date: date)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def handle_date_list(date)
|
19
|
-
handle(date) do
|
20
|
-
users = Calendar.formated_users_for_date(date)
|
21
|
-
messenger.send_text list_response(list: users, date: date)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def handle_date_cancel(date)
|
26
|
-
handle(date) do
|
27
|
-
calendar = Calendar.new(date: date, user: author)
|
28
|
-
deleted_user = calendar.delete_user_from_date
|
29
|
-
args = deleted_user ? {} : {key: 'not_subscribed', date: date}
|
30
|
-
messenger.send_text build_response(args)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def handle_default_command
|
35
|
-
messenger.send_text build_response
|
36
|
-
end
|
37
|
-
|
38
|
-
def send_empty_username_notification
|
39
|
-
messenger.send_text build_response(key: 'no_username')
|
40
|
-
end
|
41
|
-
|
42
|
-
def author_has_username?
|
43
|
-
author.username
|
44
|
-
end
|
45
|
-
|
46
|
-
def handle_cal(month)
|
47
|
-
dates = Calendar.submited_days_of_month(month)
|
48
|
-
today = Date.today
|
49
|
-
year = month < today.month ? today.next_year.year : today.year
|
50
|
-
month = Date.new(year, month)
|
51
|
-
messenger.send_text list_response(list: dates, month: month)
|
52
|
-
end
|
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
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
def handle(date, &block)
|
66
|
-
if date_has_error?(date)
|
67
|
-
messenger.send_text error
|
68
|
-
else
|
69
|
-
yield
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def date_has_error?(date)
|
74
|
-
if date.nil?
|
75
|
-
@error = build_response(key: 'wrong_date_format')
|
76
|
-
elsif date < Date.today
|
77
|
-
@error = build_response(key: 'old_date')
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def list_response(args)
|
82
|
-
empty_key = args.fetch(:empty_key) { 'nobody' }
|
83
|
-
|
84
|
-
if args.fetch(:list).empty?
|
85
|
-
build_response(args.merge(key: empty_key))
|
86
|
-
else
|
87
|
-
build_response(args) { |response| "#{response}\n#{args.fetch(:list)}" }
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def build_response(args = {})
|
92
|
-
response_key = args.fetch(:key) { command }
|
93
|
-
response = Initializers::ResponsesLoader.responses[response_key].dup
|
94
|
-
response.gsub!('%first_name%', author.first_name)
|
95
|
-
response.gsub!('%date%', args[:date].strftime('%d %h %Y')) if args[:date]
|
96
|
-
response.gsub!('%date%', args[:month].strftime('%h %Y')) if args[:month]
|
97
|
-
response.gsub!('%username%', args[:username]) if args[:username]
|
98
|
-
|
99
|
-
block_given? ? yield(response) : response
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe TelegramMeetupBot::CommandsHandler do
|
4
|
-
let(:messenger) { instance_double('message') }
|
5
|
-
let(:from) { instance_double('from', id: 1, username: 'Ikari01', first_name: 'Shinji') }
|
6
|
-
let(:message) { instance_double('message', text: command, from: from) }
|
7
|
-
|
8
|
-
subject { described_class.new(message: message, messenger: messenger) }
|
9
|
-
|
10
|
-
describe '#process' do
|
11
|
-
context "when command isn't in whitelist" do
|
12
|
-
let(:command) { '/unknow_command' }
|
13
|
-
|
14
|
-
it "calls help command" do
|
15
|
-
allow_any_instance_of(TelegramMeetupBot::HandlerHelper).to receive(:handle_default_command)
|
16
|
-
expect(subject).to receive(:help).with(no_args)
|
17
|
-
subject.process
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "when command without args" do
|
22
|
-
let(:command) { '/help' }
|
23
|
-
|
24
|
-
it "works" do
|
25
|
-
allow_any_instance_of(TelegramMeetupBot::HandlerHelper).to receive(:handle_default_command)
|
26
|
-
expect(subject).to receive(:help).with(no_args)
|
27
|
-
subject.process
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "when command with args" do
|
32
|
-
let(:command) { '/date 08.11.07' }
|
33
|
-
|
34
|
-
it "works" do
|
35
|
-
allow_any_instance_of(TelegramMeetupBot::HandlerHelper).to receive(:handle_date)
|
36
|
-
expect(subject).to receive(:date).with(['08.11.07'])
|
37
|
-
subject.process
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|