Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import socket
- import select
- import json
- import gevent
- import ast
- credentials = [
- {
- 'user': 'thorleon',
- 'password': 'firefox1'
- },
- {
- 'user': 'daniel',
- 'password': 'firefox1'
- }
- ]
- users_list = []
- rooms_list = {
- 0: {
- 'users': [],
- 'messages': []
- },
- 1: {
- 'users': [],
- 'messages': []
- },
- 2: {
- 'users': [],
- 'messages': []
- }
- }
- def broadcast_message(sock, message):
- try:
- sock.send(str.encode(json.dumps(message)))
- except:
- sock.close()
- CONNECTION_LIST.remove(sock)
- def broadcast_messages(sock, room, message):
- for user in rooms_list[room]['users']:
- try:
- user['sock'] .send(str.encode(json.dumps(message)))
- except:
- user['sock'] .close()
- CONNECTION_LIST.remove(user['sock'])
- def user_login(sock, data):
- user = data['user']
- password = data['password']
- response = dict()
- response['action'] = 'login_failed'
- for credential in credentials:
- if credential['user'] == user:
- if credential['password'] == password:
- users_list.append({
- 'name': user,
- 'sock': sock
- })
- response['action'] = 'login_success'
- break
- broadcast_message(sock, response)
- print(users_list)
- def join_room(sock, data):
- user = data['user']
- room = data['room']
- response = {}
- for d in users_list:
- if d['name'] == user:
- rooms_list[room]['users'].append(d)
- print(rooms_list)
- response['action'] = 'room_success'
- response['messages'] = rooms_list[room]['messages']
- broadcast_message(sock, response)
- def send_messages(sock, data):
- user = data['user']
- room = data['room']
- message = data['message']
- rooms_list[room]['messages'].append({
- 'user': user,
- 'message': message
- })
- print(rooms_list)
- response = {}
- response['action'] = 'message'
- response['message'] = message
- broadcast_messages(sock, room, response)
- def data_handler(sock, data):
- data = ast.literal_eval(data.decode())
- if data['action'] == 'login':
- user_login(sock, data)
- elif data['action'] == 'join_room':
- join_room(sock, data)
- elif data['action'] == 'send':
- send_messages(sock, data)
- def gevent_handler(sock):
- if sock == server_socket:
- sockfd, addr = server_socket.accept()
- CONNECTION_LIST.append(sockfd)
- print("Client (%s, %s) connected" % addr)
- else:
- try:
- data = sock.recv(RECV_BUFFER)
- if data:
- data_handler(sock, data)
- except:
- print("Client (%s, %s) is offline" % addr)
- sock.close()
- CONNECTION_LIST.remove(sock)
- if __name__ == "__main__":
- CONNECTION_LIST = []
- RECV_BUFFER = 4096
- PORT = 5000
- server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- server_socket.bind(("0.0.0.0", PORT))
- server_socket.listen(10)
- CONNECTION_LIST.append(server_socket)
- print("Chat server started on port " + str(PORT))
- while True:
- read_sockets, write_sockets, error_sockets = select.select(CONNECTION_LIST, [], [])
- for sock in read_sockets:
- thread = gevent.spawn(gevent_handler, sock)
- gevent.sleep(0)
- server_socket.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement