telegram_meetup_bot 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0f006330cda4dcc1f556f33824fe35b02021336
4
- data.tar.gz: c57bfd3e78002113e820946dc5a1353d55421bba
3
+ metadata.gz: 98d69941024a79b6b13a609d1043f7041625284f
4
+ data.tar.gz: 14411958ac147a0d5a7d01edc9f6e500f4afd085
5
5
  SHA512:
6
- metadata.gz: fa2ba469c84317ae87940a4cd697f13662377566403768fc1066addc2825bc657da3374831554d4cd9a66fefe3f347a3f7ab96c95501237f7a84025d8c1df071
7
- data.tar.gz: 76e08f87c49e62f44808a8dd01b0f44d737eabced30190825a987f283726cd80defde6b2ed4be30a84338d49cf8a9235c8734aac3da29553661fb0e02666d6a1
6
+ metadata.gz: b09a53761a76d37699959a4f74e32a658672d4f49f5835043b232816b5d430aba78844ca796ff61310d8c8b6d9fd0ebd4a04f48a63e6134e29597eb948654fe7
7
+ data.tar.gz: 3f541bb8be59ea76fb2afac89b1719686acca0807310b74f16b22c964a45f471e2d4f6a50927f61087fdf9f07a3811a5819d6cdf44c66a09da460f2a158f85a0
data/.gitignore CHANGED
@@ -12,3 +12,5 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ dump.rdb
16
+
@@ -1,10 +1,7 @@
1
- today: "We are waiting for you today, %first_name%."
2
- today_list: "Today visitors:"
3
- today_cancel: "We are waiting for you next time, %first_name%."
4
1
  date: "We are waiting for you on %date%, %first_name%."
5
- date_list: "%date% visitors:"
6
- date_cancel: "We are waiting for you next time, %first_name%."
7
- wrong_date_format: "Error: wrong date format. Correct formats are dd, dd.mm or dd.mm.yy."
2
+ list: "%date% visitors:"
3
+ cancel: "We are waiting for you next time, %first_name%."
4
+ wrong_date_format: "Error: wrong date format. Correct formats are dd, dd.mm or dd.mm.yy"
8
5
  old_date: "This date is too old."
9
6
  nobody: "No one planned to come on %date%."
10
7
  not_subscribed: "You wasn't subscribed on %date%."
@@ -12,11 +9,11 @@ no_username: "%first_name%, please set a username in the Telegram settings."
12
9
  cal: "Reserved days in %date%:"
13
10
  help: |
14
11
  Hi, %first_name%. Use this commands list:
15
- /today 14:00 - add yourself to the today list (time is optional);
16
- /today_list - display the today list;
17
- /today_cancel - remove yourself from the today list;
12
+ /date 14:00 - add yourself to the today list (time is optional);
18
13
  /date 23 14:00 - add yourself to the list on 23rd of the current month (time is optional);
19
- /date_list 23.04 - display the list for April 23 of the current year;
20
- /date_cancel 23.04.16 - remove yourself from the list on 23.04.16;
14
+ /list - display the today list;
15
+ /list 23.04 - display the list for April 23 of the current year;
16
+ /cancel - remove yourself from the today list;
17
+ /cancel 23.04.16 - remove yourself from the list on 23.04.16;
21
18
  /cal 1 - display reserved days in January (it uses current month by default)
22
19
  There are 3 formats for date available: 14 - day, 14.09 - day and month, 14.09.15 - day, month and year;
@@ -22,7 +22,7 @@ module TelegramMeetupBot
22
22
  process_user do |users, saved_user|
23
23
  if saved_user
24
24
  users.delete(saved_user)
25
- storage.set_users_to_date(users, date)
25
+ update_or_clean_date(users)
26
26
  true
27
27
  end
28
28
  end
@@ -44,7 +44,7 @@ module TelegramMeetupBot
44
44
  min, max = build_date_window(month)
45
45
 
46
46
  dates.keep_if { |date| date >= min && date <= max }.sort.
47
- map { |date| date.match(/\d\d$/) }.join(' ')
47
+ map { |date| date.match(/\d\d$/) }.join(', ')
48
48
  end
49
49
 
50
50
  private
@@ -64,6 +64,14 @@ module TelegramMeetupBot
64
64
  end
65
65
  end
66
66
 
67
+ def update_or_clean_date(users)
68
+ if users.any?
69
+ storage.set_users_to_date(users, date)
70
+ else
71
+ storage.delete_date(date)
72
+ end
73
+ end
74
+
67
75
  def self.build_date_window(month)
68
76
  today = Date.today
69
77
  year = month < today.month ? today.next_year.year : today.year
@@ -1,12 +1,12 @@
1
1
  module TelegramMeetupBot
2
2
  class CommandsHandler
3
- COMMANDS = %w(today today_list today_cancel
4
- date date_list date_cancel help cal)
3
+ COMMANDS = %w(date list cancel help cal)
4
+ BLACK_LIST = %w(me)
5
5
  attr_reader :command, :params, :helper
6
6
 
7
7
  def initialize(args)
8
8
  parser = MessageParser.new(args.fetch(:message))
9
- @command = COMMANDS.include?(parser.command) ? parser.command : 'help'
9
+ @command = commands.include?(parser.command) ? parser.command : 'help'
10
10
  @params = parser.params
11
11
  @helper = HandlerHelper.new(
12
12
  author: parser.author,
@@ -16,43 +16,44 @@ module TelegramMeetupBot
16
16
  end
17
17
 
18
18
  def process
19
- if self.class.instance_method(command).arity == 0
20
- send command
21
- else
22
- send command, params
23
- end
19
+ return if BLACK_LIST.include?(command)
24
20
 
21
+ call_command(command)
25
22
  helper.send_empty_username_notification unless helper.author_has_username?
26
23
  end
27
24
 
28
25
  private
29
26
 
30
- def today(params)
31
- time = ParamsParser.new(params.first).parse_time if params.any?
32
- helper.handle_date(Date.today, time)
27
+ def commands
28
+ COMMANDS + BLACK_LIST
33
29
  end
34
30
 
31
+ def call_command(command)
32
+ if self.class.instance_method(command).arity == 0
33
+ send command
34
+ else
35
+ send command, params
36
+ end
37
+ end
38
+
39
+ # bot commands
40
+
35
41
  def date(params)
36
42
  date = ParamsParser.new(params.first).parse_date
37
- time = ParamsParser.new(params[1]).parse_time if params[1]
43
+ time = ParamsParser.new(params[1] || params[0]).parse_time
44
+ date ||= Date.today if params.empty? || (time && params.size == 1)
38
45
  helper.handle_date(date, time)
39
46
  end
40
47
 
41
- def today_list
42
- helper.handle_date_list Date.today
43
- end
44
-
45
- def date_list(params)
48
+ def list(params)
46
49
  date = ParamsParser.new(params.first).parse_date
50
+ date ||= Date.today if params.empty?
47
51
  helper.handle_date_list date
48
52
  end
49
53
 
50
- def today_cancel
51
- helper.handle_date_cancel Date.today
52
- end
53
-
54
- def date_cancel(params)
54
+ def cancel(params)
55
55
  date = ParamsParser.new(params.first).parse_date
56
+ date ||= Date.today if params.empty?
56
57
  helper.handle_date_cancel date
57
58
  end
58
59
 
@@ -2,9 +2,8 @@ module TelegramMeetupBot
2
2
  module Initializers
3
3
  class ResponsesLoader < Base
4
4
  FILE_NAME = 'responses.yml'
5
- AVAILABLE_KEYS = %w(today today_list today_cancel date date_list
6
- date_cancel wrong_date_format old_date nobody not_subscribed
7
- no_username help cal)
5
+ AVAILABLE_KEYS = %w(date list cancel wrong_date_format old_date nobody
6
+ not_subscribed no_username help cal)
8
7
 
9
8
  def self.responses
10
9
  @configurations
@@ -11,11 +11,11 @@ module TelegramMeetupBot
11
11
 
12
12
  def parse_date
13
13
  format = case arg
14
- when /^[0-9]{,2}\.[0-9]{,2}\.[0-9][0-9]$/
14
+ when /\A[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{2}\Z/
15
15
  "%d.%m.%y"
16
- when /^[0-9]{,2}\.[0-9]{,2}$/
16
+ when /\A[0-9]{1,2}\.[0-9]{1,2}\Z/
17
17
  "%d.%m"
18
- when /^[0-9]{,2}$/
18
+ when /\A[0-9]{1,2}\Z/
19
19
  "%d"
20
20
  end
21
21
 
@@ -23,7 +23,9 @@ module TelegramMeetupBot
23
23
  end
24
24
 
25
25
  def parse_time
26
- Time.parse(arg).strftime('%R') rescue nil
26
+ if arg =~ /\A[0-2][0-9]:[0-5][0-9]\Z/
27
+ Time.parse(arg).strftime('%R') rescue nil
28
+ end
27
29
  end
28
30
 
29
31
  def parse_month
@@ -19,5 +19,9 @@ module TelegramMeetupBot
19
19
  def get_all_available_dates
20
20
  dates = redis.hkeys(key)
21
21
  end
22
+
23
+ def delete_date(date)
24
+ redis.hdel(key, date)
25
+ end
22
26
  end
23
27
  end
@@ -1,3 +1,3 @@
1
1
  module TelegramMeetupBot
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -2,19 +2,31 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe TelegramMeetupBot::Calendar do
4
4
  let(:storage) { double('storage') }
5
- let(:user) { TelegramMeetupBot::MessageParser::User.new(1, 'Ikari01', 'Shinji') }
5
+ let(:user) { TelegramMeetupBot::MessageParser::User.new(1, 'Unit01', 'Shinji') }
6
+ let(:user2) { TelegramMeetupBot::MessageParser::User.new(2, 'Unit02', 'Asuka') }
6
7
  before { allow(TelegramMeetupBot::Initializers::ConfigLoader).to receive(:storage).and_return(storage)}
7
8
  subject { described_class.new(user: user, date: Date.today, time: '10:00') }
8
9
 
9
10
  describe '#delete_user_from_date' do
10
11
  before { allow(storage).to receive(:set_users_to_date) }
12
+ before { allow(storage).to receive(:delete_date) }
11
13
 
12
- context "when user exists in storage on selected date" do
13
- before { allow(storage).to receive(:get_users_for_date).and_return([user.to_h]) }
14
+ context "when more than one users exist in storage on selected date" do
15
+ before { allow(storage).to receive(:get_users_for_date).and_return([user.to_h, user2.to_h]) }
14
16
 
15
17
  it { expect(subject.delete_user_from_date).to eq(true) }
16
18
  it 'set array without user to storage' do
17
- expect(storage).to receive(:set_users_to_date).with([], Date.today)
19
+ expect(storage).to receive(:set_users_to_date).with([user2.to_h], Date.today)
20
+ subject.delete_user_from_date
21
+ end
22
+ end
23
+
24
+ context "when one user exists in storage on selected date" do
25
+ before { allow(storage).to receive(:get_users_for_date).and_return([user.to_h]) }
26
+
27
+ it { expect(subject.delete_user_from_date).to eq(true) }
28
+ it 'delete date key from storage' do
29
+ expect(storage).to receive(:delete_date).with(Date.today)
18
30
  subject.delete_user_from_date
19
31
  end
20
32
  end
@@ -71,7 +83,7 @@ RSpec.describe TelegramMeetupBot::Calendar do
71
83
  let(:dates) { %w(2015-07-30 2015-07-15 2015-07-16 2015-06-14 2015-08-17) }
72
84
  it "works" do
73
85
  Timecop.freeze(Date.new(2015, month - 1, 1)) do
74
- expect(subject.submited_days_of_month(month)).to eq("15 16 30")
86
+ expect(subject.submited_days_of_month(month)).to eq("15, 16, 30")
75
87
  end
76
88
  end
77
89
  end
@@ -80,7 +92,7 @@ RSpec.describe TelegramMeetupBot::Calendar do
80
92
  let(:dates) { %w(2015-07-30 2015-07-15 2015-07-16 2015-06-14 2015-08-17) }
81
93
  it "starts from today" do
82
94
  Timecop.freeze(Date.new(2015, month, 16)) do
83
- expect(subject.submited_days_of_month(month)).to eq("16 30")
95
+ expect(subject.submited_days_of_month(month)).to eq("16, 30")
84
96
  end
85
97
  end
86
98
  end
@@ -19,11 +19,11 @@ RSpec.describe TelegramMeetupBot::CommandsHandler do
19
19
  end
20
20
 
21
21
  context "when command without args" do
22
- let(:command) { '/today_list' }
22
+ let(:command) { '/help' }
23
23
 
24
24
  it "works" do
25
- allow_any_instance_of(TelegramMeetupBot::HandlerHelper).to receive(:handle_date_list)
26
- expect(subject).to receive(:today_list).with(no_args)
25
+ allow_any_instance_of(TelegramMeetupBot::HandlerHelper).to receive(:handle_default_command)
26
+ expect(subject).to receive(:help).with(no_args)
27
27
  subject.process
28
28
  end
29
29
  end
@@ -35,7 +35,7 @@ RSpec.describe TelegramMeetupBot::ParamsParser do
35
35
  end
36
36
 
37
37
  context 'wrong format' do
38
- let(:dates) { %w(abc 3.02.2007 3.02.7 2007.02.03 3-02-07 32.03.07 32) }
38
+ let(:dates) { %w(abc 3.02.2007 3.02.7 2007.02.03 3-02-07 32.03.07 32 3..07 .02.07 3.02.) }
39
39
 
40
40
  it 'returns nil' do
41
41
  dates.each do |date|
@@ -47,20 +47,20 @@ RSpec.describe TelegramMeetupBot::ParamsParser do
47
47
 
48
48
  describe '#parse_time' do
49
49
  context 'correct' do
50
- let(:dates) { %w(01:05 1:05 1:5) }
50
+ let(:time) { %w(01:05) }
51
51
 
52
52
  it 'works' do
53
- dates.each do |date|
53
+ time.each do |date|
54
54
  expect(described_class.new(date).parse_time).to eq('01:05')
55
55
  end
56
56
  end
57
57
  end
58
58
 
59
59
  context 'wrong_format' do
60
- let(:dates) { %w(abc 25:05 01:61 -3) }
60
+ let(:time) { %w(abc 25:05 01:61 -3) }
61
61
 
62
62
  it 'works' do
63
- dates.each do |date|
63
+ time.each do |date|
64
64
  expect(described_class.new(date).parse_time).to eq(nil)
65
65
  end
66
66
  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.0
4
+ version: 0.1.1
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-09-30 00:00:00.000000000 Z
11
+ date: 2015-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler