-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscoreV2.py
More file actions
206 lines (168 loc) · 6.44 KB
/
scoreV2.py
File metadata and controls
206 lines (168 loc) · 6.44 KB
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# -*- coding: utf-8 -*-
# Programme de comptage de points
#
# Par Double Z.
# =============================================
import irclib
import ircbot
nick = "VincentLagaf"
description = "Bot de comptage de points en Python via ircBot (V2)"
room = "#riff"
server = "irc.worldnet.net"
port = 6667
utilisateurs = ["DoubleZ","Herondil"]
score = {}
#Fonction vérifiant la syntaxe des commandes entrées, renvoie un False si erreur
def verifCommand(s, c, parameters) :
global numbers
global isParamNumber
numbers = 0
isParamNumber = False
if parameters[0] in ["!add","!sub","!set"] :
if len(parameters) == 1 :
s.privmsg(c,"Erreur : La commande requiert d'inclure des pseudos ainsi que les points si necessaire")
s.privmsg(c,"USAGE : " + parameters[0] + " pseudo(s) (point(s))")
s.privmsg(c,"USAGE : " + parameters[0] + " pseudo(s) point(s) pseudo(s) point(s)")
return False
if len(parameters) == 2 and parameters[1].isdigit() :
s.privmsg(c,"Erreur : Aucun pseudo(s) n'a été entrée dans la commande")
return False
for p in parameters :
if p.isdigit() and isParamNumber :
s.privmsg(c,"Erreur : La commande ne devrait pas avoir plusieurs nombres d'affilés")
return False
if p.isdigit() :
numbers += 1
isParamNumber = True
else :
isParamNumber = False
if not isParamNumber and numbers > 0 :
s.privmsg(c,"Erreur : La commande n'indique pas le nombre de points a allouer pour le dernier groupe")
return False
if parameters[0] == "!set" and not isParamNumber and numbers == 0 :
s.privmsg(c,"Erreur : La commande requiert un nombre de points a définir")
return False
if parameters[0] in ["!modo","!nomodo"]:
if len(parameters) == 1 :
s.privmsg(c,"Erreur : La commande requiert d'inclure un pseudo")
s.privmsg(c,"USAGE : " + parameters[0] + " pseudo")
return False
if len(parameters) > 2 :
s.privmsg(c,"Erreur : La commande ne demande qu'un pseudo")
return False
#Sinon tout va bien
return True
#Fonction modifiant le score des joueurs en fonction des paramètres entrés par l'utilisateur
def setPoints(mode,name,points):
if mode == "!set" :
score[name] = points
if mode == "!add" :
try :
score[name] += points
except :
score[name] = points
if mode == "!sub" :
try :
score[name] -= points
except :
score[name] = - points
#Fonction destiné a éviter les espaces multiples pour ne pas avoir de problèmes ensuite suite aux utilisation de split(" ")
def antiSpace(stringInput):
output = ""
space = False
for index,c in enumerate(stringInput) :
if c != " " :
space = False
output += c
elif not space :
space = True
output += c
if space :
output = output[:len(output)-1]
return output
#Notre bot principale s'occupant de récupérer les informations d'IRC
class BotScore(ircbot.SingleServerIRCBot):
def __init__(self):
global nick
global room
global server
global port
ircbot.SingleServerIRCBot.__init__(self, [(server, port)],nick,description)
def on_welcome(self,serv,ev):
serv.join(room)
def on_pubmsg(self,serv,ev):
global score
auteur = irclib.nm_to_n(ev.source())
canal = ev.target()
message = ev.arguments()[0]
message = antiSpace(message).split(" ")
#Verification d'une commande correcte
if verifCommand(serv, canal, message):
if auteur in utilisateurs : #Seul les modos peuvent utiliser ses commandes
#Ajout d'un modo
if message[0] == "!modo" :
utilisateurs.append(message[1])
serv.privmsg(canal,message[1] + " peut maintenant utiliser les commandes du bot")
#Suppression d'un modo
if message[0] == "!nomodo" :
for index,name in enumerate(utilisateurs):
if name == message[1]:
utilisateurs.pop(index)
serv.privmsg(canal,message[1] + " ne peut plus utiliser les commandes du bot")
#Supprime toute la liste... le nom de la commande est volontairement compliqué
if message[0] == "!reset_bloodbath" :
score = {}
serv.privmsg(canal,"Tout a été effacé, on reprend tout depuis le début !")
#Fait dire une phrase au bot
if message[0] == "!say" :
serv.privmsg(canal,ev.arguments()[0][5:]) #On n'affiche pas les 5 premiers caractères de la commande (c'est à dire "!say ")
#Distribution des points
if message[0] in ["!add","!sub","!set"] :
groupe = []
for index,param in enumerate(message[1:]) :
if not param.isdigit() :
groupe.append(param)
if param.isdigit() or (index == len(message[1:])-1 and numbers == 0 and isParamNumber == False) : #Le 'or' fait mention a une commande d'un seul groupe de joueur sans points mentioné (c'est à dire un point)
for name in groupe :
if index == len(message[1:])-1 and numbers == 0 and isParamNumber == False :
param = "1" #Le nombre de points est défini par une chaine string
setPoints(message[0],name,int(param))
#Conjugaison
if len(groupe) > 1 :
pluriel = True
else :
pluriel = False
#Construction de la phrase
sentence = ""
for index,name in enumerate(groupe) :
sentence += name
if index == len(groupe)-2 :
sentence += " et "
elif index != len(groupe)-1 :
sentence += ", "
if message[0] == "!set" :
if pluriel :
verbe = "ont maintenant"
else :
verbe = "a maintenant"
if message[0] == "!add" :
verbe = "gagne" + "nt chacuns" * pluriel
if message[0] == "!sub" :
verbe = "perd" + "ent chacuns" * pluriel
sentence += " " + verbe + " " + param + " point(s)"
#Un nouveau groupe doit être crée pour ne pas donner de points à nouveaux aux mêmes pseudos
groupe = []
#Envoie du message
serv.privmsg(canal,sentence)
#Affichage du score
if message[0] == "!score" : #La commande diffère si elle est exécuté par un modo ou par un non modo
if auteur in utilisateurs :
for nom in sorted(score.items(),key=lambda d:d[1],reverse=True) :
if nom[1] : #N'affiche pas le score si celui ci est à zéro point
serv.privmsg(canal,nom[0] + " = " + str(nom[1]) +" points")
else :
for nom in sorted(score.items(),key=lambda d:d[1],reverse=True) :
if nom[1] : #N'affiche pas le score si celui ci est à zéro point
serv.privmsg(auteur,nom[0] + " = " + str(nom[1]) +" points")
if __name__ == "__main__":
BotScore().start()