Advertisement
Guest User

Untitled

a guest
Jan 7th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.62 KB | None | 0 0
  1. import socket
  2. import select
  3. import json
  4. import gevent
  5. import ast
  6.  
  7. credentials = [
  8.     {
  9.         'user': 'thorleon',
  10.         'password': 'firefox1'
  11.      },
  12.      {
  13.         'user': 'daniel',
  14.         'password': 'firefox1'
  15.      }
  16. ]
  17.  
  18. users_list = []
  19. rooms_list = {
  20.     0: {
  21.         'users': [],
  22.         'messages': []
  23.     },
  24.     1: {
  25.         'users': [],
  26.         'messages': []
  27.     },
  28.     2: {
  29.         'users': [],
  30.         'messages': []
  31.     }
  32. }
  33.  
  34.  
  35. def broadcast_message(sock, message):
  36.     try:
  37.         sock.send(str.encode(json.dumps(message)))
  38.     except:
  39.         sock.close()
  40.         CONNECTION_LIST.remove(sock)
  41.  
  42.  
  43. def broadcast_messages(sock, room, message):
  44.     for user in rooms_list[room]['users']:
  45.         try:
  46.             user['sock'] .send(str.encode(json.dumps(message)))
  47.         except:
  48.             user['sock'] .close()
  49.             CONNECTION_LIST.remove(user['sock'])
  50.  
  51.  
  52. def user_login(sock, data):
  53.     user = data['user']
  54.     password = data['password']
  55.     response = dict()
  56.     response['action'] = 'login_failed'
  57.     for credential in credentials:
  58.         if credential['user'] == user:
  59.             if credential['password'] == password:
  60.                 users_list.append({
  61.                     'name': user,
  62.                     'sock': sock
  63.                 })
  64.                 response['action'] = 'login_success'
  65.                 break
  66.     broadcast_message(sock, response)
  67.     print(users_list)
  68.  
  69.  
  70. def join_room(sock, data):
  71.     user = data['user']
  72.     room = data['room']
  73.     response = {}
  74.     for d in users_list:
  75.         if d['name'] == user:
  76.             rooms_list[room]['users'].append(d)
  77.     print(rooms_list)
  78.     response['action'] = 'room_success'
  79.     response['messages'] = rooms_list[room]['messages']
  80.     broadcast_message(sock, response)
  81.  
  82.  
  83. def send_messages(sock, data):
  84.     user = data['user']
  85.     room = data['room']
  86.     message = data['message']
  87.     rooms_list[room]['messages'].append({
  88.         'user': user,
  89.         'message': message
  90.     })
  91.     print(rooms_list)
  92.     response = {}
  93.     response['action'] = 'message'
  94.     response['message'] = message
  95.     broadcast_messages(sock, room, response)
  96.  
  97.  
  98. def data_handler(sock, data):
  99.     data = ast.literal_eval(data.decode())
  100.     if data['action'] == 'login':
  101.         user_login(sock, data)
  102.     elif data['action'] == 'join_room':
  103.         join_room(sock, data)
  104.     elif data['action'] == 'send':
  105.         send_messages(sock, data)
  106.  
  107.  
  108. def gevent_handler(sock):
  109.         if sock == server_socket:
  110.             sockfd, addr = server_socket.accept()
  111.             CONNECTION_LIST.append(sockfd)
  112.             print("Client (%s, %s) connected" % addr)
  113.         else:
  114.             try:
  115.                 data = sock.recv(RECV_BUFFER)
  116.                 if data:
  117.                     data_handler(sock, data)
  118.             except:
  119.                 print("Client (%s, %s) is offline" % addr)
  120.                 sock.close()
  121.                 CONNECTION_LIST.remove(sock)
  122.  
  123. if __name__ == "__main__":
  124.  
  125.     CONNECTION_LIST = []
  126.     RECV_BUFFER = 4096
  127.     PORT = 5000
  128.  
  129.     server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  130.     server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  131.     server_socket.bind(("0.0.0.0", PORT))
  132.     server_socket.listen(10)
  133.  
  134.     CONNECTION_LIST.append(server_socket)
  135.  
  136.     print("Chat server started on port " + str(PORT))
  137.  
  138.     while True:
  139.         read_sockets, write_sockets, error_sockets = select.select(CONNECTION_LIST, [], [])
  140.         for sock in read_sockets:
  141.             thread = gevent.spawn(gevent_handler, sock)
  142.         gevent.sleep(0)
  143.  
  144.     server_socket.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement