-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.py
138 lines (106 loc) · 3.86 KB
/
parser.py
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
import json
# Feito por: Maurício Dolacio
players = []
def findPlayer(id):
#Retorna a posição de um jogador na lista após busca-lo pela lista de acordo com o id.
#id = id do jogador
for i in range(0, len(players)):
if players[i]['id'] == id:
return i
return -1
def addPlayer(id):
#Cria um dicionario para o jogador e o adiciona na lista de jogadores
#id = id do jogador
player = {
"id": int(id),
"nome": " ",
"kills": 0,
"old_names": []
}
players.append(player)
def changeName(pos, new_name):
#Altera o nome de um jogador e atualiza a lista de nomes antigos.
#pos = posição do jogador na lista de jogadores
#new_name = novo nome do jogador
#Checa se o nome atual é diferente do novo
if players[pos]['nome'] != new_name:
#Busca o novo nome na lista de nomes antigos, se encontrar o remove, senão o adiciona
verification = False
for name in players[pos]['old_names']:
if name == new_name:
verification = True
if verification == True:
players[pos]['old_names'].remove(new_name)
else:
if players[pos]['nome'] != ' ':
players[pos]['old_names'].append(players[pos]['nome'])
#Troca o nome
players[pos]['nome'] = new_name
def killCount(killer_id, killed_id):
#Adiciona uma kill caso um jogador tenha eliminado ou subtrai caso tenha morrido pelo <world>
#killer_id = id do jogador que matou
#killed_id = id do jogador que morreu
if killer_id == 1022:
pos = findPlayer(killed_id)
if players[pos]['kills'] != 0:
players[pos]['kills'] -= 1
else:
pos = findPlayer(killer_id)
players[pos]['kills'] += 1
def finish(game_count, total_kills, game_list):
#Organiza o jogo finalizado em um dicionario e o adiciona na lista de jogos
#game_count = valor do jogo atual
#total_kills = valor total de mortes que ocorreram no jogo
#game_list = lista de jogos
status = {
'total_kills': total_kills,
'players': players
}
dicionario = {
'game': game_count,
'status': status
}
game_list.append(dicionario)
def main():
#Variaveis
global players
game_count = 0
total_kills = 0
game_list = []
#Abre o arquivo de texto
with open("Quake.txt", "r") as arquivo:
quake_lines = arquivo.readlines()
#Loop que analisa as linhas
for line in quake_lines:
line = line.strip()
line = line.split(" ", 3)
#Adiciona um jogador
if line[1] == "ClientConnect:":
addPlayer(int(line[2]))
#Remove um jogador da lista
elif line[1] == "ClientDisconnect:":
id = int(line[2])
players.pop(findPlayer(id))
#Termina um jogo e limpa as variaveis para o proximo
elif line[1] == "ShutdownGame:":
game_count += 1
finish(game_count, total_kills, game_list)
total_kills = 0
players = []
#Altera o nome do jogador
elif line[1] == "ClientUserinfoChanged:":
line[3] = line[3].split("\\")
id = int(line[2])
pos = findPlayer(id)
changeName(pos, line[3][1])
#Contabiliza as mortes
elif line[1] == "Kill:":
line[3] = line[3].split(" ", 2)
killer_id = int(line[2])
killed_id = int(line[3][0])
killCount(killer_id, killed_id)
total_kills += 1
#Escreve o dicionario de jogos em um .json
with open('Quake.json', "w") as arq_json:
json.dump(game_list, arq_json, indent=4)
main()