susies 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +159 -11
- data/example/susies.rb +27 -12
- data/lib/IntraRequestsManager.rb +59 -0
- data/lib/Susie.rb +43 -0
- data/lib/Susies.rb +136 -0
- data/susies.gemspec +11 -12
- metadata +7 -5
- data/lib/constants.rb +0 -57
- data/lib/susies.rb +0 -285
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 231a7208b3e4000328f8260676aa1412a96372af
|
4
|
+
data.tar.gz: 24a9607e3371480fc777fc85c7ce936ce3d502cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6db7cadda7408b3aca1d33590ffacf2c3a3c4cc4f796bce18e4a636e8c205282094579abc4304f68709426feb5e4343347c20f9e714439d2ce600b694377c41
|
7
|
+
data.tar.gz: a373a9962f28f5c76cd9f897981bbf80c118fe7c11d19cc99dd7761b10a3a487b7181b421f7f4d869ea9a7a1e9e9d41a484be39df003089eacd619adeac679a6
|
data/README.md
CHANGED
@@ -2,34 +2,182 @@
|
|
2
2
|
|
3
3
|
## Description
|
4
4
|
|
5
|
-
Susies
|
5
|
+
Susies est une gem destinée aux étudiants d'Epitech.
|
6
6
|
|
7
|
-
|
7
|
+
Elle permet de trouver simplement une susie en fonction de quelques critères.
|
8
8
|
|
9
9
|
|
10
|
-
##
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Soit par ligne de commande: `gem install susies`
|
13
|
+
|
14
|
+
Soit via un `Gemfile`: `gem 'susies'` et `bundle install`
|
15
|
+
|
16
|
+
|
17
|
+
## Utilisation
|
18
|
+
|
19
|
+
L'utilisation est assez simple:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
require 'Susies'
|
23
|
+
|
24
|
+
# whiteListFilters: susies MUST match these filters
|
25
|
+
whiteListFilters = {
|
26
|
+
login: %w[login_x],
|
27
|
+
maxStudent: 6,
|
28
|
+
minHour: 8,
|
29
|
+
maxHour: 17
|
30
|
+
}
|
31
|
+
|
32
|
+
# blackListFilters: susies MUST NOT match these filters
|
33
|
+
blackListFilters = {
|
34
|
+
type: 'reading',
|
35
|
+
title: 'zola'
|
36
|
+
}
|
37
|
+
|
38
|
+
# autologin: intranet authentication
|
39
|
+
autologins = {
|
40
|
+
autologinPath: 'https://intra.epitech.eu/my_autologin_url',
|
41
|
+
buddiesAutologins: %w[/buddy_autologin_url],
|
42
|
+
}
|
43
|
+
|
44
|
+
# mailInfos: mailer configuration
|
45
|
+
mailInfos = {
|
46
|
+
uname: 'mail@gmail.com',
|
47
|
+
passwd: 'password',
|
48
|
+
targets: %w[mylogin_x@epitech.eu buddy_login@epitech.eu]
|
49
|
+
}
|
50
|
+
|
51
|
+
Susies.new( autologins, whiteListFilters, blackListFilters, mailInfos ).check!
|
52
|
+
```
|
53
|
+
|
54
|
+
La gem se connectera alors à l'intra pour vérifier l'existence d'une susie correspondant à vos critères, durant une semaine où vous n'avez pas encore de susie.
|
55
|
+
|
56
|
+
Si elle trouve une susie, elle vous y inscrira, inscrira vos amis et préviendra tout le monde par mail.
|
57
|
+
|
58
|
+
## Filters
|
59
|
+
|
60
|
+
A utiliser si vous souhaitez filtrer les susies qui vous intéressent.
|
61
|
+
|
62
|
+
Les whiteListFilters sont les critères que les susies doivent avoir, à l'inverse des blackListFilters.
|
63
|
+
|
64
|
+
Laissez `nil` si vous ne voullez pas de filtres.
|
65
|
+
|
66
|
+
### login
|
67
|
+
|
68
|
+
* Les logins des susies recherchées.
|
69
|
+
* Type: Array of strings
|
70
|
+
* Default: nil
|
71
|
+
|
72
|
+
|
73
|
+
### maxStudent
|
74
|
+
|
75
|
+
* Nombre d'étudiants déjà inscrit à la susie class (0: personne d'inscrit, 10: plus de places)
|
76
|
+
* Type: int
|
77
|
+
* Default: nil
|
78
|
+
|
79
|
+
|
80
|
+
### minHour
|
81
|
+
|
82
|
+
* Heure minimum du début de la susie class.
|
83
|
+
* Type: Int
|
84
|
+
* Default: nil
|
85
|
+
|
86
|
+
|
87
|
+
### maxHour
|
88
|
+
|
89
|
+
* Heure maximum du début de la susie class.
|
90
|
+
* Type: Int
|
91
|
+
* Default: nil
|
92
|
+
|
93
|
+
|
94
|
+
### title
|
95
|
+
|
96
|
+
* KeyWord que le titre de la susie doit contenir.
|
97
|
+
* Type: String
|
98
|
+
* Default: nil
|
99
|
+
|
100
|
+
|
101
|
+
### type
|
102
|
+
|
103
|
+
* Type de la susie
|
104
|
+
* Type: String
|
105
|
+
* Default: nil
|
106
|
+
|
107
|
+
|
108
|
+
## MailInfos
|
109
|
+
|
110
|
+
A utiliser si vous souhaitez être alerté en cas d'inscription par le script. Fonctionne avec une adresse GMail.
|
111
|
+
|
112
|
+
Laissez `nil` si vous ne voullez pas envoyer de mails.
|
113
|
+
|
114
|
+
### uname
|
115
|
+
|
116
|
+
* Nom d'utilisateur pour se connecter au serveur mail. cf `example/susies.rb` pour un exemple de configuration basé sur gmail.
|
117
|
+
* Type: String
|
118
|
+
* Default: nil
|
119
|
+
|
120
|
+
|
121
|
+
### passwd
|
122
|
+
|
123
|
+
* Mot de passe pour se connecter au serveur mail. cf `example/susies.rb` pour un exemple de configuration basé sur gmail.
|
124
|
+
* Type: String
|
125
|
+
* Default: nil
|
126
|
+
|
127
|
+
|
128
|
+
### targets
|
129
|
+
|
130
|
+
* Emails des personnes devant être alertés lorsqu'une susie a été trouvée.
|
131
|
+
* Type: Array of strings
|
132
|
+
* Default: nil
|
133
|
+
|
134
|
+
|
135
|
+
## Autologins
|
136
|
+
|
137
|
+
### autologinPath
|
138
|
+
|
139
|
+
* Votre autologin. Il s'agit du path et non de l'URL complète. Ce paramètre est OBLIGATOIRE!
|
140
|
+
* Type String
|
141
|
+
* Default: nil
|
142
|
+
|
143
|
+
### buddiesAutologins
|
144
|
+
|
145
|
+
* Autologins des personnes devant être inscrites à la susie class (en plus de vous). Il s'agit du path et non de l'URL complète.
|
146
|
+
* Type: Array of strings
|
147
|
+
* Default: []
|
148
|
+
|
11
149
|
|
12
150
|
## Cron Task
|
13
151
|
|
14
|
-
|
152
|
+
Une bonne utilisation de cette gem serait de l'utiliser via une tache cron qui lancera le script à intervalle régulier.
|
153
|
+
|
154
|
+
Par exemple, il est intéressant de faire une tache s'exécutant toutes les 5 minutes:
|
155
|
+
|
156
|
+
```
|
157
|
+
*/5 * * * * GEM_HOME=/path/to/gem/home /path/to/script.rb 1>> /path/to/log 2>> /path/to/errors.log
|
158
|
+
```
|
159
|
+
|
15
160
|
|
16
|
-
##
|
161
|
+
## Améliorations Possibles
|
17
162
|
|
18
|
-
|
19
|
-
|
163
|
+
1. Gestion des jours
|
164
|
+
2. Planning horaire par jour
|
20
165
|
|
21
|
-
|
166
|
+
|
167
|
+
## Contribuer
|
22
168
|
|
23
169
|
1. Fork
|
24
|
-
2.
|
25
|
-
3. Commit
|
170
|
+
2. Créer votre branche (`git checkout -b my-branch`)
|
171
|
+
3. Commit les nouvelles fonctionnalités (`git commit -am 'New features'`)
|
26
172
|
4. Push (`git push origin my-branch`)
|
27
|
-
5.
|
173
|
+
5. Faire une `Pull request`
|
174
|
+
|
28
175
|
|
29
176
|
## License
|
30
177
|
|
31
178
|
[MIT License](MIT_LICENSE.txt)
|
32
179
|
|
180
|
+
|
33
181
|
## Author
|
34
182
|
|
35
183
|
[Simon Ninon](http://sninon.fr) aka [ninon_s](http://intra.epitech.eu/user/ninon_s) aka [Cylix](http://github.com/Cylix)
|
data/example/susies.rb
CHANGED
@@ -1,17 +1,32 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'Susies'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
mailUname: 'mail@gmail.com',
|
12
|
-
mailPasswd: 'password',
|
13
|
-
mailTargets: %w[mylogin_x@epitech.eu buddy_login@epitech.eu],
|
14
|
-
buddiesAutologins: %w[https://intra.epitech.eu/buddy_autologin_url]
|
5
|
+
# whiteListFilters: susies MUST match these filters
|
6
|
+
whiteListFilters = {
|
7
|
+
login: %w[login_x],
|
8
|
+
maxStudent: 6,
|
9
|
+
minHour: 8,
|
10
|
+
maxHour: 17
|
15
11
|
}
|
16
12
|
|
17
|
-
|
13
|
+
# blackListFilters: susies MUST NOT match these filters
|
14
|
+
blackListFilters = {
|
15
|
+
type: 'reading',
|
16
|
+
title: 'zola'
|
17
|
+
}
|
18
|
+
|
19
|
+
# autologin: intranet authentication
|
20
|
+
autologins = {
|
21
|
+
autologinPath: '/autologin_path',
|
22
|
+
buddiesAutologins: %w[/buddy_autologin_path],
|
23
|
+
}
|
24
|
+
|
25
|
+
# mailInfos: mailer configuration
|
26
|
+
mailInfos = {
|
27
|
+
uname: 'mail@gmail.com',
|
28
|
+
passwd: 'password',
|
29
|
+
targets: %w[mylogin_x@epitech.eu buddy_login@epitech.eu]
|
30
|
+
}
|
31
|
+
|
32
|
+
Susies.new( autologins, whiteListFilters, blackListFilters, mailInfos ).check!
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Dependencies
|
2
|
+
require 'Susie.rb'
|
3
|
+
require 'net/http'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
class IntraRequestsManager
|
7
|
+
|
8
|
+
INTRA_BASE_URL = 'intra.epitech.eu'
|
9
|
+
LIST_SUSIES_PATH = '/planning/1919/events'
|
10
|
+
REGISTER_SUSIE_PATH = '/planning/1919'
|
11
|
+
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@http = Net::HTTP.new INTRA_BASE_URL, 443
|
15
|
+
@http.use_ssl = true
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def authenticate!(autologinPath)
|
20
|
+
response = @http.get autologinPath
|
21
|
+
|
22
|
+
response_cookies = response.get_fields 'set-cookie'
|
23
|
+
cookies_array = response_cookies.collect { |cookie| cookie.split('; ').first }
|
24
|
+
|
25
|
+
@cookies = cookies_array.join('; ')
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def getSusies(startDate, endDate)
|
30
|
+
path = "#{ LIST_SUSIES_PATH }?start=#{ formatDate startDate }&end=#{ formatDate endDate }&format=json"
|
31
|
+
response = @http.get path, { 'Cookie' => @cookies }
|
32
|
+
|
33
|
+
susiesJSON = JSON.parse response.body
|
34
|
+
|
35
|
+
unless susiesJSON.nil?
|
36
|
+
susiesJSON.collect { |susieJSON| Susie.new susieJSON }
|
37
|
+
else
|
38
|
+
[]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def registerSusie(susie)
|
44
|
+
path = "#{ REGISTER_SUSIE_PATH }/#{ susie.id }/subscribe?format=json®istercalendar"
|
45
|
+
response = @http.post path, '', { 'Cookie' => @cookies }
|
46
|
+
|
47
|
+
susie.nb_registered -= 1
|
48
|
+
susie
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
|
55
|
+
def formatDate(date)
|
56
|
+
date.strftime '%Y-%m-%d'
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
data/lib/Susie.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Dependencies
|
2
|
+
require 'time'
|
3
|
+
|
4
|
+
class Susie
|
5
|
+
|
6
|
+
attr_accessor :is_registered, :nb_registered, :login, :id, :start, :end, :type, :title, :description, :url
|
7
|
+
|
8
|
+
|
9
|
+
def initialize(susieJSON)
|
10
|
+
self.id = susieJSON['id']
|
11
|
+
self.title = susieJSON['title']
|
12
|
+
self.type = susieJSON['type']
|
13
|
+
self.description = susieJSON['description']
|
14
|
+
self.login = susieJSON['maker']['login']
|
15
|
+
self.start = Time.parse susieJSON['start']
|
16
|
+
self.end = Time.parse susieJSON['end']
|
17
|
+
self.is_registered = susieJSON['event_registered']
|
18
|
+
self.nb_registered = susieJSON['registered']
|
19
|
+
self.url = "#{ IntraRequestsManager::INTRA_BASE_URL }#{ IntraRequestsManager::REGISTER_SUSIE_PATH }/#{ self.id }"
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
<<-SUSIE
|
25
|
+
Login: #{ self.login }
|
26
|
+
|
27
|
+
Title: #{ self.title }
|
28
|
+
Type: #{ self.type }
|
29
|
+
|
30
|
+
Start: #{ self.start }
|
31
|
+
End: #{ self.end }
|
32
|
+
|
33
|
+
Places left: #{ 10 - self.nb_registered }
|
34
|
+
|
35
|
+
Registration URL: #{ self.url }
|
36
|
+
|
37
|
+
Description:
|
38
|
+
#{ self.description }
|
39
|
+
|
40
|
+
SUSIE
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
data/lib/Susies.rb
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
# Dependencies
|
2
|
+
require 'active_support/time'
|
3
|
+
require 'net/smtp'
|
4
|
+
require 'Susie.rb'
|
5
|
+
require 'IntraRequestsManager.rb'
|
6
|
+
|
7
|
+
class Susies
|
8
|
+
|
9
|
+
def initialize(autologins={}, whiteListFilters=nil, blackListFilters=nil, mailInfos=nil)
|
10
|
+
@whiteListFilters = whiteListFilters
|
11
|
+
@blackListFilters = blackListFilters
|
12
|
+
@mailInfos = mailInfos
|
13
|
+
|
14
|
+
@autologinPath = autologins[:autologinPath]
|
15
|
+
@buddiesAutologins = autologins[:buddiesAutologins] || []
|
16
|
+
@requestsManager = IntraRequestsManager.new
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def check!
|
21
|
+
@requestsManager.authenticate! @autologinPath
|
22
|
+
|
23
|
+
startDate = Date.today.beginning_of_week
|
24
|
+
endDate = Date.today.end_of_week
|
25
|
+
|
26
|
+
loop do
|
27
|
+
log "Check for week #{ formatDate startDate } - #{ formatDate endDate }"
|
28
|
+
susies = @requestsManager.getSusies startDate, endDate
|
29
|
+
|
30
|
+
break if susies.empty?
|
31
|
+
|
32
|
+
findSusie susies unless registeredThisWeek? susies
|
33
|
+
|
34
|
+
startDate += 1.week
|
35
|
+
endDate += 1.week
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def log(message)
|
43
|
+
puts "[#{ formatTime Time.now }]> #{ message }"
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def findSusie(susies)
|
48
|
+
log "Not already registrated: seeking susies"
|
49
|
+
susies.each do |susie|
|
50
|
+
if !matchCriterias?(susie, @blackListFilters) && matchCriterias?(susie, @whiteListFilters)
|
51
|
+
log "Find susie matching criterias"
|
52
|
+
log "Registering to susie"
|
53
|
+
registerSusie susie
|
54
|
+
log "Sending mails"
|
55
|
+
informEveryone susie
|
56
|
+
log "done"
|
57
|
+
break
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def formatDate(time)
|
64
|
+
time.strftime '%d-%m-%Y'
|
65
|
+
end
|
66
|
+
|
67
|
+
def formatTime(time)
|
68
|
+
time.strftime '%H:%M %d-%m-%Y'
|
69
|
+
end
|
70
|
+
|
71
|
+
def getRegisterMail(susie)
|
72
|
+
<<-MESSAGE
|
73
|
+
Hey,
|
74
|
+
|
75
|
+
I've just registered to a susie class.
|
76
|
+
|
77
|
+
#{ susie.to_s }
|
78
|
+
MESSAGE
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
def informEveryone(susie)
|
83
|
+
if @mailInfos && @mailInfos[:targets]
|
84
|
+
smtp = Net::SMTP.new 'smtp.gmail.com', 587
|
85
|
+
smtp.enable_starttls
|
86
|
+
|
87
|
+
smtp.start('gmail.com', @mailInfos[:uname], @mailInfos[:passwd], :plain) do |smtp|
|
88
|
+
smtp.send_message getRegisterMail(susie), @mailInfos[:email], @mailInfos[:targets]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
def matchCriterias?(susie, filters)
|
95
|
+
return true unless filters
|
96
|
+
|
97
|
+
min_hour = filters[:minHour].nil? || susie.start.hour >= filters[:minHour]
|
98
|
+
max_hour = filters[:maxHour].nil? || susie.end.hour >= filters[:maxHour]
|
99
|
+
nb_students = filters[:nb_registered].nil? || susie.nb_registered <= filters[:nb_registered]
|
100
|
+
login = filters[:logins].nil? || filters[:logins].include?(susie.login)
|
101
|
+
type = filters[:type].nil? || susie.type == filters[:type]
|
102
|
+
title = filters[:title].nil? || susie.title.include?(filters[:title])
|
103
|
+
|
104
|
+
if filters[:logins]
|
105
|
+
filters[:logins].each do |login|
|
106
|
+
login = true if susie.login == login
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
return min_hour && max_hour && login && nb_students && type && title
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
def registerSusie(susie)
|
115
|
+
@requestsManager.registerSusie susie
|
116
|
+
|
117
|
+
if @buddiesAutologins
|
118
|
+
@buddiesAutologins.each do |autologin|
|
119
|
+
buddiesRequestsManager = IntraRequestsManager.new
|
120
|
+
buddiesRequestsManager.authenticate! autologin
|
121
|
+
buddiesRequestsManager.registerSusie susie
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
def registeredThisWeek?(susies)
|
128
|
+
susies.each do |susie|
|
129
|
+
return true if susie.is_registered
|
130
|
+
end
|
131
|
+
|
132
|
+
false
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
end
|
data/susies.gemspec
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
s.homepage = 'https://github.com/Cylix/Susies'
|
2
|
+
s.name = 'susies'
|
3
|
+
s.version = '0.1.0'
|
4
|
+
s.date = '2014-09-28'
|
5
|
+
s.summary = 'Epitech Susie Classes Bot'
|
6
|
+
s.description = 'Susies is a Gem to register easily for Epitech Susie Classes'
|
7
|
+
s.authors = ['Simon Ninon']
|
8
|
+
s.email = 'simon.ninon@gmail.com'
|
9
|
+
s.files = `git ls-files`.split("\n")
|
10
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
11
|
+
s.license = 'MIT'
|
12
|
+
s.homepage = 'https://github.com/Cylix/Susies'
|
14
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: susies
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Ninon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Susies is a Gem to register easily for Epitech Susie Classes
|
14
14
|
email: simon.ninon@gmail.com
|
@@ -20,8 +20,9 @@ files:
|
|
20
20
|
- MIT_LICENSE.txt
|
21
21
|
- README.md
|
22
22
|
- example/susies.rb
|
23
|
-
- lib/
|
24
|
-
- lib/
|
23
|
+
- lib/IntraRequestsManager.rb
|
24
|
+
- lib/Susie.rb
|
25
|
+
- lib/Susies.rb
|
25
26
|
- susies.gemspec
|
26
27
|
homepage: https://github.com/Cylix/Susies
|
27
28
|
licenses:
|
@@ -43,8 +44,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
44
|
version: '0'
|
44
45
|
requirements: []
|
45
46
|
rubyforge_project:
|
46
|
-
rubygems_version: 2.
|
47
|
+
rubygems_version: 2.0.3
|
47
48
|
signing_key:
|
48
49
|
specification_version: 4
|
49
50
|
summary: Epitech Susie Classes Bot
|
50
51
|
test_files: []
|
52
|
+
has_rdoc:
|
data/lib/constants.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'active_support/time'
|
2
|
-
|
3
|
-
class Susies
|
4
|
-
# Susie login
|
5
|
-
DEFAULT_LOGIN = "clark_s"
|
6
|
-
# Maximum already registered students
|
7
|
-
DEFAULT_MAX_STUDENT = 9
|
8
|
-
# Minimum start hour
|
9
|
-
DEFAULT_MIN_HOUR = 17
|
10
|
-
# Default Autologin
|
11
|
-
DEFAULT_AUTOLOGIN_URL = ''
|
12
|
-
# Default mail server
|
13
|
-
DEFAULT_MAIL_SERVER = ''
|
14
|
-
# Default mail port
|
15
|
-
DEFAULT_MAIL_PORT = 0
|
16
|
-
# Default mail user name
|
17
|
-
DEFAULT_MAIL_UNAME = ''
|
18
|
-
# Default mail password
|
19
|
-
DEFAULT_MAIL_PASSWD = ''
|
20
|
-
# default start week
|
21
|
-
DEFAULT_START_WEEK = Date.today.beginning_of_week
|
22
|
-
# default end week
|
23
|
-
DEFAULT_END_WEEK = Date.today.end_of_week
|
24
|
-
|
25
|
-
# Susie JSON API
|
26
|
-
SUSIES_URL = "https://intra.epitech.eu/planning/587/events"
|
27
|
-
# Susie Register link
|
28
|
-
REGISTER_URL = "https://intra.epitech.eu/planning/587"
|
29
|
-
|
30
|
-
# Cookie File
|
31
|
-
COOKIE_FILE = "cookies.txt"
|
32
|
-
# Buddies Cookie File
|
33
|
-
BUDDIES_COOKIE_FILE = "buddies_cookie_file.txt"
|
34
|
-
|
35
|
-
# Encapsulation
|
36
|
-
BASE_JSON = "activities"
|
37
|
-
# Register status to a Susie Class
|
38
|
-
EVENT_REGISTERED_JSON = "event_registered"
|
39
|
-
# Nb of people already registered to a Susie Class
|
40
|
-
REGISTERED_JSON = "registered"
|
41
|
-
# Susie data
|
42
|
-
MAKER_JSON = "maker"
|
43
|
-
# Susie login
|
44
|
-
MAKER_LOGIN_JSON = "login"
|
45
|
-
# Susie Class ID
|
46
|
-
ID_JSON = "id"
|
47
|
-
# Susie Class Start
|
48
|
-
START_JSON = "start"
|
49
|
-
# Susie Class End
|
50
|
-
END_JSON = "end"
|
51
|
-
# Susie Class Type
|
52
|
-
TYPE_JSON = "type"
|
53
|
-
# Susie Class Title
|
54
|
-
TITLE_JSON = "title"
|
55
|
-
# Susie Class Desc
|
56
|
-
DESC_JSON = "description"
|
57
|
-
end
|
data/lib/susies.rb
DELETED
@@ -1,285 +0,0 @@
|
|
1
|
-
# Constants
|
2
|
-
require 'constants.rb'
|
3
|
-
# Dependencies
|
4
|
-
require 'active_support/time'
|
5
|
-
require 'net/smtp'
|
6
|
-
require 'json'
|
7
|
-
|
8
|
-
##
|
9
|
-
# Susies Class
|
10
|
-
##
|
11
|
-
class Susies
|
12
|
-
|
13
|
-
##
|
14
|
-
# Initialize
|
15
|
-
#
|
16
|
-
# @login Asked Susie Login Default: clark_s
|
17
|
-
# @maxStudent Maximum already registered students Default: 9
|
18
|
-
#
|
19
|
-
# @autologinURL Intranet Autologin URL No default
|
20
|
-
# @mailServer Mail Server No default
|
21
|
-
# @mailPort Mail Port No default
|
22
|
-
# @mailUname Mail UserName No default
|
23
|
-
# @mailPasswd Mail Password No default
|
24
|
-
# @mailTargets People to inform by mail about sub. Default: @mailUname
|
25
|
-
#
|
26
|
-
# @buddiesAuto. Buddies autologins No default
|
27
|
-
#
|
28
|
-
# @startWeek Beginning of week Default: beginning of current week
|
29
|
-
# @endWeek End of week Default: end of current week
|
30
|
-
##
|
31
|
-
def initialize(data={})
|
32
|
-
@login = data[:login] || [DEFAULT_LOGIN]
|
33
|
-
@maxStudent = data[:maxStudent] || DEFAULT_MAX_STUDENT
|
34
|
-
@minHour = data[:minHour] || DEFAULT_MIN_HOUR
|
35
|
-
@autologinURL = data[:autologinURL] || DEFAULT_AUTOLOGIN_URL
|
36
|
-
|
37
|
-
@mailServer = data[:mailServer] || DEFAULT_MAIL_SERVER
|
38
|
-
@mailPort = data[:mailPort] || DEFAULT_MAIL_PORT
|
39
|
-
@mailUname = data[:mailUname] || DEFAULT_MAIL_UNAME
|
40
|
-
@mailPasswd = data[:mailPasswd] || DEFAULT_MAIL_PASSWD
|
41
|
-
@mailTargets = data[:mailTargets] || [@mailUname]
|
42
|
-
|
43
|
-
@buddiesAutologins = data[:buddiesAutologins] || []
|
44
|
-
|
45
|
-
@startWeek = DEFAULT_START_WEEK
|
46
|
-
@endWeek = DEFAULT_END_WEEK
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
##
|
51
|
-
# Check!
|
52
|
-
#
|
53
|
-
# Iterate throw weeks, until there is no Susie in a week.
|
54
|
-
# For each week, check if the current user is already registered to a Susie Class.
|
55
|
-
# If user has not already been registered to a Susie Class, try to find an available Susie following criterias (maxStudent and Susie Login).
|
56
|
-
# If a Susie class is found, try to register to this Susie Class and send a mail to user's friends.
|
57
|
-
##
|
58
|
-
def check!
|
59
|
-
log 'Start Checking'
|
60
|
-
setAuthCookie COOKIE_FILE, @autologinURL
|
61
|
-
|
62
|
-
while true
|
63
|
-
susiesData = getSusiesData
|
64
|
-
|
65
|
-
break if noSusie? susiesData
|
66
|
-
|
67
|
-
findSusie susiesData unless registeredThisWeek? susiesData
|
68
|
-
|
69
|
-
nextWeek!
|
70
|
-
end
|
71
|
-
|
72
|
-
log 'End Checking'
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
private
|
77
|
-
|
78
|
-
|
79
|
-
##
|
80
|
-
# findSusie
|
81
|
-
#
|
82
|
-
# Try to find and register to a Susie Class.
|
83
|
-
# Send Mail to user's friends in case of success.
|
84
|
-
##
|
85
|
-
def findSusie(susiesData)
|
86
|
-
log "Trying to register susie class with #{ @login } for week: #{ formatDate @startWeek } #{ formatDate @endWeek }."
|
87
|
-
|
88
|
-
susiesData[BASE_JSON].each do |susie|
|
89
|
-
if matchCriterias? susie
|
90
|
-
registerSusie susie, COOKIE_FILE
|
91
|
-
registerBuddies susie
|
92
|
-
informBuddies susie
|
93
|
-
|
94
|
-
return true
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
log "No susie class found following criterias."
|
99
|
-
return false
|
100
|
-
end
|
101
|
-
|
102
|
-
|
103
|
-
##
|
104
|
-
# formatDate
|
105
|
-
#
|
106
|
-
# Take Date Object as parameter
|
107
|
-
# Return formated Date (YYY-MM-DD)
|
108
|
-
##
|
109
|
-
def formatDate(date)
|
110
|
-
date.strftime '%Y-%m-%d'
|
111
|
-
end
|
112
|
-
|
113
|
-
|
114
|
-
##
|
115
|
-
# formatTime
|
116
|
-
#
|
117
|
-
# Take Time Object as parameter
|
118
|
-
# Return formated Time (HH:MM YYY-MM-DD)
|
119
|
-
##
|
120
|
-
def formatTime(time)
|
121
|
-
time.strftime '%H:%M %Y-%m-%d'
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
##
|
126
|
-
# getSusiesData
|
127
|
-
#
|
128
|
-
# Return Susie Classes JSON Data
|
129
|
-
#
|
130
|
-
def getSusiesData
|
131
|
-
JSON.parse `curl -s -L -b #{ COOKIE_FILE } '#{ SUSIES_URL }?start=#{ formatDate @startWeek }&end=#{ formatDate @endWeek }&format=json'`
|
132
|
-
end
|
133
|
-
|
134
|
-
|
135
|
-
##
|
136
|
-
# getRegisterMail
|
137
|
-
#
|
138
|
-
# Generate mail which will be send to user's friends.
|
139
|
-
##
|
140
|
-
def getRegisterMail(susie)
|
141
|
-
<<-MESSAGE
|
142
|
-
Hey,
|
143
|
-
|
144
|
-
I've just registered to a susie class with #{ susie[MAKER_JSON][MAKER_LOGIN_JSON] }.
|
145
|
-
|
146
|
-
Title: #{ susie[TITLE_JSON] }
|
147
|
-
Type: #{ susie[TYPE_JSON] }
|
148
|
-
|
149
|
-
Description:
|
150
|
-
#{ susie[DESC_JSON] }
|
151
|
-
|
152
|
-
Start: #{ susie[START_JSON] }.
|
153
|
-
End: #{ susie[END_JSON] }.
|
154
|
-
Place left: #{ 9 - susie[REGISTERED_JSON] }.
|
155
|
-
|
156
|
-
Register here: #{ REGISTER_URL }/#{ susie[ID_JSON] }.
|
157
|
-
|
158
|
-
MESSAGE
|
159
|
-
end
|
160
|
-
|
161
|
-
|
162
|
-
##
|
163
|
-
# informBuddies
|
164
|
-
#
|
165
|
-
# send mail to user's friends
|
166
|
-
##
|
167
|
-
def informBuddies(susie)
|
168
|
-
message = getRegisterMail susie
|
169
|
-
|
170
|
-
for email in @mailTargets
|
171
|
-
log "Send mail to #{ email }"
|
172
|
-
sendMail email, message
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
|
177
|
-
##
|
178
|
-
# log
|
179
|
-
#
|
180
|
-
# Write log info
|
181
|
-
##
|
182
|
-
def log(message)
|
183
|
-
puts "[#{ formatTime Time.now }]> #{ message }"
|
184
|
-
end
|
185
|
-
|
186
|
-
|
187
|
-
##
|
188
|
-
# matchCriterias
|
189
|
-
#
|
190
|
-
# Does Susie match defined criterias?
|
191
|
-
##
|
192
|
-
def matchCriterias?(susie)
|
193
|
-
@login.each do |login|
|
194
|
-
return true if susie[MAKER_JSON][MAKER_LOGIN_JSON] == login and susie[REGISTERED_JSON] <= @maxStudent and Time.parse(susie[START_JSON]).hour >= @minHour
|
195
|
-
end
|
196
|
-
false
|
197
|
-
end
|
198
|
-
|
199
|
-
|
200
|
-
##
|
201
|
-
# nextWeek!
|
202
|
-
#
|
203
|
-
# Go to next week
|
204
|
-
##
|
205
|
-
def nextWeek!
|
206
|
-
@startWeek += 1.week
|
207
|
-
@endWeek += 1.week
|
208
|
-
end
|
209
|
-
|
210
|
-
|
211
|
-
##
|
212
|
-
# noSusie?
|
213
|
-
#
|
214
|
-
# Check if there are SusieClasses in the given JSON data
|
215
|
-
##
|
216
|
-
def noSusie?(susiesData)
|
217
|
-
!susiesData[BASE_JSON] or susiesData[BASE_JSON].length == 0
|
218
|
-
end
|
219
|
-
|
220
|
-
|
221
|
-
##
|
222
|
-
# registerBuddies
|
223
|
-
#
|
224
|
-
# register buddies with given autologins
|
225
|
-
##
|
226
|
-
def registerBuddies(susie)
|
227
|
-
@buddiesAutologins.each do |autologin|
|
228
|
-
setAuthCookie BUDDIES_COOKIE_FILE, autologin
|
229
|
-
registerSusie susie, BUDDIES_COOKIE_FILE
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
|
234
|
-
##
|
235
|
-
# registerSusie
|
236
|
-
#
|
237
|
-
# register to given SusieClass
|
238
|
-
##
|
239
|
-
def registerSusie(susie, cookie_file)
|
240
|
-
`curl -s -b #{ cookie_file } -L -X POST #{ REGISTER_URL }/#{ susie[ID_JSON] }/subscribe?format=json`
|
241
|
-
log "Succesfully registered to susie class."
|
242
|
-
end
|
243
|
-
|
244
|
-
|
245
|
-
##
|
246
|
-
# registeredThisWeek?
|
247
|
-
#
|
248
|
-
# Determine if user is already registered to a Susie Class during the given week.
|
249
|
-
##
|
250
|
-
def registeredThisWeek?(weekSusies)
|
251
|
-
weekSusies[BASE_JSON].each do |susie|
|
252
|
-
if susie[EVENT_REGISTERED_JSON]
|
253
|
-
log "Already registered to a susie class with #{ susie[MAKER_JSON][MAKER_LOGIN_JSON] } for week: #{ formatDate @startWeek } #{ formatDate @endWeek }."
|
254
|
-
return true
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
log "Not registered to a susie class for week: #{ formatDate @startWeek } #{ formatDate @endWeek }."
|
259
|
-
return false
|
260
|
-
end
|
261
|
-
|
262
|
-
|
263
|
-
##
|
264
|
-
# sendMail
|
265
|
-
#
|
266
|
-
# send mail from user to a buddy.
|
267
|
-
##
|
268
|
-
def sendMail(email, message)
|
269
|
-
smtp = Net::SMTP.new @mailServer, @mailPort
|
270
|
-
smtp.enable_starttls_auto
|
271
|
-
smtp.start @mailServer, @mailUname, @mailPasswd, :plain
|
272
|
-
smtp.send_message message, @mailUname, email
|
273
|
-
end
|
274
|
-
|
275
|
-
|
276
|
-
##
|
277
|
-
# setAuthCookie
|
278
|
-
#
|
279
|
-
# Log on the intra and save user's cookie in COOKIE_FILE
|
280
|
-
##
|
281
|
-
def setAuthCookie(cookie_file, autologin)
|
282
|
-
`curl -s -L -c #{ cookie_file } #{ autologin }`
|
283
|
-
end
|
284
|
-
|
285
|
-
end
|