forked from pedrosena138/Projeto-Sockets
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.py
More file actions
141 lines (131 loc) · 6.65 KB
/
client.py
File metadata and controls
141 lines (131 loc) · 6.65 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
from socket import *
def splitMessage(message):
"""Recebe uma string com informações separadas por \n e devolve uma lista, separando as informações"""
listInformations = []
string = ''
for chr in message:
if chr != '\n':
string += chr
else:
listInformations.append(string)
string = ''
return listInformations
class Client():
def __init__(self, nick, ip, port, adm, room, roomIP, roomPort):
self.nick = nick
self.ip = ip
self.port = port
self.room = room
self.reqEntry = False # Este atributo indice se outra thread requisitou input
self.reqMessage = '' # Texto que pede ao usuário o input requisitado
self.entry = '' # Indica o input requisitado
self.adm = adm # Indica se é adm da sala (bool)
self.running = True # Indica se o peer está na sala, ou seja, não foi removido ou saiu
self.banned = False # Indica se o peer foi banido
self.roomIP = roomIP
self.roomPort = roomPort
def sendText(self, text, dic, blackList=[]):
"""Recebe um texto e um dicionário contendo pessoas. Envia o texto para cada pessoa do dicionário"""
for person in dic:
if person not in blackList: # blackList indica as pessoas na qual não se deve mandar a mensagem
host, port = dic[person]
socket_ = socket(AF_INET, SOCK_STREAM)
socket_.connect((host, port))
socket_.sendall(f'{self.nick}\ntext\n{text}\n'.encode())
def updateRoom(self, type, nick, ip, port):
"""Manda atualizações da sala para todos os membros"""
for person in self.room.members:
if person != self.nick and not (type == 'add' and nick == person):
ipMember, portMember = self.room.members[person]
socket_ = socket(AF_INET, SOCK_STREAM)
socket_.connect((ipMember, portMember))
socket_.sendall(f'{self.nick}\nupdate\n{type}\n{nick}\n{ip}\n{str(port)}\n'.encode())
def chatPeer(self):
"""Chat dentro de uma sala. Funciona tanto para um membro, quanto para um adm"""
print('\nSiga as instruções:'
'\n/all msg -> Para enviar uma mensagem para toda a sala'
'\n/w nick msg -> Para enviar uma mensagem privada para algum membro'
'\n/members -> Para visualizar a lista de integrantes da sala'
'\n/sair -> Para sair da sala\n')
if self.adm:
print('Comandos administrativos:'
'\n/ban nick -> Para banir um membro da sala'
'\n/kick nick -> Para expulsar um membro da sala\n')
while self.running and not self.banned:
entry = input('')
if self.running and not self.banned:
if entry[0:4] == '/all':
self.sendText(entry[5:], self.room.members, [self.nick])
print(f'Você: {entry[5:]}')
elif entry[0:2] == '/w':
nick = ''
indexMsg = 3
for chr in entry[3:]:
indexMsg += 1
if chr != ' ':
nick += chr
else:
break
msg = entry[indexMsg:]
if msg and nick in self.room.members and nick != self.nick:
ip = self.room.members[nick][0]
port = self.room.members[nick][1]
self.sendText('(PRIVADO) ' + msg, {nick:(ip, port)}, [self.nick])
print(f'Você -> {nick}: {msg}')
elif not msg:
print('Você não inseriu a mensagem')
elif nick == self.nick:
print('Você não pode mandar uma mensagem para si mesmo.')
else:
print('O usuário não está presente nesta sala')
elif entry[0:9] == '/members':
print('\nMembros da sala:')
print(f'{self.room.nickADM} (ADM)')
for member in self.room.members:
if member != self.room.nickADM:
print(member)
print('\n')
elif entry == '/sair':
self.room.members.pop(self.nick)
self.room.ips.pop((self.ip, self.port))
self.updateRoom('sair', self.nick, self.ip, self.port)
print('Você saiu da sala.')
self.running = False
elif self.adm and entry[0:4] == '/ban':
nick = entry[5:]
if nick in self.room.members and nick != self.nick:
ip = self.room.members[nick][0]
port = self.room.members[nick][1]
self.updateRoom('ban', nick, ip, port)
self.room.members.pop(nick)
self.room.ips.pop((ip, port))
self.room.ban.append((nick, ip))
self.room.queueADM.remove(nick)
print(f'Você baniu {nick}!!')
elif nick == self.nick:
print('Você não pode banir a si mesmo')
else:
print('Este membro não está no grupo')
elif self.adm and entry[0:5] == '/kick':
nick = entry[6:]
if nick in self.room.members and nick != self.nick:
ip = self.room.members[nick][0]
port = self.room.members[nick][1]
self.updateRoom('remove', nick, ip, port)
self.room.members.pop(nick)
self.room.ips.pop((ip, port))
self.room.queueADM.remove(nick)
print(f'Você removeu {nick}.')
elif nick == self.nick:
print('Você não pode expulsar a si mesmo da sala')
else:
print('Este membro não está no grupo')
elif self.reqEntry:
self.entry = entry
self.reqEntry = False
else:
print('Comando inválido!!')
if self.reqEntry:
print(self.reqMessage)
if self.banned:
print('Você foi banido desta sala!!')