def monitor(sock, data): u = User.find_user_by_sock(sock) print 'command from:', u.username command = data['command'] room_name = data['destination'] if command == 'users': li = [] for el in User.users: if el.username: li.append([el.username, el.network]) print 'Number users on:', len(li), '---', len(User.users) for el in li: print el if command == 'rooms': r = Room.find_room_by_name(room_name) try: print 'room alias:', r.alias print 'room users_name:', adapter(r.users_name) except: print 'no room' if command == 'message': u = User.find_user_by_name('*****@*****.**', 'dev-socialbase') info = {"type": "chat", "payload": {"command": "test_user", "details": str(u)}} u.connection.write_message(info) print 'B.sended to ', u.username, info
def login(sock, token): user_login = User.find_user_by_sock(sock) # sock para user # Options to set JWT decode options = { 'verify_signature': True, 'verify_exp': True, 'verify_nbf': False, 'verify_iat': False, 'verify_aud': False, 'require_exp': False, 'require_iat': False, 'require_nbf': False } if float(jwt.__version__[:3]) < 1.3: print 'ERROR - JWT MUST BE >= 1.3' sys.exit(0) info = False try: info = jwt.decode(token, 'socialbase', options=options) except Exception, e: text = '{"type":"authenticate","payload":{"status":"EXPIRED_CREDENTIALS","message":"authentication error"}}' send(user_login, text)
def room_create(sock, data): user = User.find_user_by_sock(sock) target_name = data['details']['new_user'] echo = None if "echo" in data: echo = data['echo'] target_resource = user.resource target_online = User.find_user_by_name(target_name, user.resource) # sock de outro usuario conectado target_offline = None if not target_online: api_mongo.insert_user(target_name, target_resource) target_offline = target_name if user == target_online: info = {"type": "chat", "payload": {"command": "error", "details": "choose_another_less_you"}} send(user, info) else: second_user = None if target_online: second_user = target_online.username if not second_user: second_user = target_offline if second_user: if not Room.check_exist_room([user.username, second_user], user.resource): # se sala nao existe user_temp = [] for username in [user.username, second_user]: user_temp.append({"username": username, "seen": None, "received": None}) room_name = Room.open(user_temp, target_resource) # cria a sala e recebe nome unico a sala new_room = Room.find_room_by_name(room_name) # sock para o nova sala criada new_room.users_name = user_temp # insert two news name users new_room.alias = 'DEFAULT' # insert alias alias = new_room.alias api_mongo.insert_room(user_temp, room_name, alias, target_resource, False, None) info = {"type": "chat", "payload": {"command": "room_id", "alias": new_room.alias, "room_id": room_name, "users": user_temp, "echo": echo, "is_group": False}} send(user, info) else: # se sala ja existe user_temp = [] for username in [user.username, second_user]: user_temp.append({"username": username, "seen": None, "received": None}) room_to_append = Room.find_room_by_users([user.username, second_user], user.resource) room_restore(room_to_append) new_room = Room.find_room_by_name(room_to_append) # sock para o nova sala criada info = {"type": "chat", "payload": {"command": "room_id", "alias": new_room.alias, "room_id": room_to_append, "users": user_temp, "is_group": new_room.is_group}} send(user, info)
def reconnect_rooms(sock, user): li = room_list_by_user(sock=None, data={'sender': user}, call=False) for el in li: r = Room.find_room_by_name(el['room']) for u in adapter(r.users_name): if u == user: s = User.find_user_by_sock(sock) s.connection = sock
def room_rename(sock, data=None): u = User.find_user_by_sock(sock) r = Room.find_room_by_name(data['destination']) r.alias = data['room_rename'] api_mongo.rename_room(data['destination'], data['room_rename']) list_user = Room.find_users_by_room(data['destination']) info = {"type": "chat", "payload": {"command": "room_rename", "room_id": data['destination'], "alias": data['room_rename']}} send_broadcast(list_user, info, u.resource)
def user_remove(sock, data): # logging.info(' room_leave data{}:\n %r', data) users_to_remove = data['user_remove'] if type(users_to_remove) is unicode: users_to_remove = [data['user_remove']] u = User.find_user_by_sock(sock) users_remove = data['user_remove'] if type(users_remove) is unicode: users_remove = [data['user_remove']] print("USERS REMOVE ", users_remove) destination = data['destination'] # id de sala a ser alterada room_users = Room.find_users_by_room(destination) # Lista de usuarios em uma sala print("ROOOMS USERS", room_users) for el in users_remove: # envia mensagem dos novos nomes send_system_info(sock, destination, 'USER REMOVE', el) # envia message para grupo da saida do user u_list = [] # lista final for el in room_users: if not (el in users_remove): u_list.append(el) new_room = Room.find_room_by_name(destination) # sock para o nova sala alterada new_room.users_name = [{"username": _u, "seen": None, "received": None} for _u in u_list] current_user = User.find_user_by_sock(sock) for uremove in users_to_remove: api_mongo.remove_user_room(destination, uremove) u = User.find_user_by_name(uremove, u.resource) if u: info = {"type": "chat", "payload": {"command": "user_remove", "room_id": destination}} send(u, info)
def user_change_text(sock, data): destination = data['destination'] tp = data["type"] u = User.find_user_by_sock(sock) list_user = Room.find_users_by_room(destination) info = {"type": "chat", "payload": {"command": "user_change_text", "room_id": destination, "user": u.username, "type": tp}} send_broadcast(list_user, info, u.resource)
def room_history(sock=None, data=None): r = Room.find_room_by_name(data['destination']) since = 0 if 'since' in data: since = data['since'] h = r.history_read(since) h2 = json.loads(h) if sock: info = {"type": "chat", "payload": {"command": "room_history", "details": h2}} user_login = User.find_user_by_sock(sock) send(user_login, json.dumps(info))
def user_list_by_room(sock, data=None): # friends u = User.find_user_by_sock(sock) def make_list(): dict_list = [] for r in Room.rooms: if r.room_id == data['destination']: if r.users_name: for el in adapter(r.users_name): if u.username != el: dict_list.append(el) break return dict_list if sock: alias = Room.find_alias_by_room(data['destination']) info = {"type": "chat", "payload": {"command": "user_list_by_room", "alias": alias, "room_id": data['destination'], "details": make_list()}} user_login = User.find_user_by_sock(sock) send(user_login, info) return make_list()
def room_list(sock): user_call = User.find_user_by_sock(sock) def make_list(): dict_list = [] for r in Room.rooms: if r.room_id != '': if user_call.resource == r.resource: if user_call.username in [i['username'] for i in r.users_name]: dict_list.append({'room_id': r.room_id, 'alias': r.alias, "last_message": r.last_message, 'users': r.users_name, 'is_group': r.is_group}) return dict_list info = {"type": "chat", "payload": {"command": "room_list", "details": make_list()}} send(user_call, info)
def room_enter(sock, data): logging.info(' room_enter data{}: %r', data) user = User.find_user_by_sock(sock) alias = data['alias'] room_sock = Room.find_room_by_alias(alias) # objeto da sala com esse alias if room_sock: if user.username in adapter(room_sock.users_name): # verifica se esse usuario esta nessa sala room_restore(room_sock.name) # coloca na memoria a sala encontrada info = {"type": "chat", "payload": {"command": "room_id", "room_id": room_sock.name, "alias": room_sock.alias}} for el in adapter(room_sock.users_name): # envia room_id para todos os users do room u = User.find_user_by_name(el, user.resource) if u: send(u, info)
def room_list_by_user(sock=None, data=None, call=True): def make_list(): dict_list = [] for r in Room.rooms: if r.users_name: for el in adapter(r.users_name): if el == data['sender']: dict_list.append({'room': r.room_id, "last_message": r.last_message}) return dict_list info = {"type": "chat", "payload": {"command": "room_list_by_user", "details": make_list()}} if call: user_login = User.find_user_by_sock(sock) send(user_login, info) return make_list()
def user_status(sock, data): user_login = User.find_user_by_sock(sock) if int(data['number']) != 0: user_login.status = int(data['number']) api_mongo.user_status_change(user_login.username, user_login.status) info = {"type": "chat", "payload": {"command": "user_status", "details": user_login.status}} li = [] for el in User.users: if el.username == user_login.username: li.append(el.username) send_broadcast(li, info, user_login.resource) if int(data['number']) != 0: contacts_online(sock)
def room_message(sock, data): # logging.info(' room_message data{}: %r', data) sender = data['sender'] destination = data['destination'] t = time.time() u = User.find_user_by_sock(sock) if 'message' in data: message = data['message'] alias = Room.find_alias_by_room(destination) r = Room.find_room_by_name(data['destination']) r.last_message = t target = data['target'] if 'target' in data else '' message_id = str(uuid.uuid4()) Room.history_add(sender, destination, message, alias, target, message_id, t) info = { "type": "chat", "payload": { "command": "room_message", "dt": t, "message": message, "room_id": destination, "sender": sender, "alias": alias, "target": target, "message_id": message_id } } list_user = Room.find_users_by_room(destination) send_broadcast(list_user, info, u.resource) if not sender == "system_info": sub_list = Room.find_users_instance_by_room(destination, u.networkId) sub_list.remove({'networkId': u.networkId, 'username': sender}) send_to_parse_multicast(info, sub_list)
def room_reopen(sock, data): user = User.find_user_by_sock(sock) destination = data['room_id'] room_sock = Room.find_room_by_name(destination) # objeto da sala com esse alias if room_sock: if any(d['username'] == user.username for d in room_sock.users_name): if user.resource == room_sock.resource: room_restore(room_sock.room_id) # coloca na memoria a sala encontrada info = {"type": "chat", "payload": {"command": "room_id", "room_id": room_sock.room_id, "alias": room_sock.alias, "is_group": room_sock.is_group}} if 'origin' in data: # para abrir a janela de chat de maneiras diferentes info = {"type": "chat", "payload": {"command": "room_id", "room_id": room_sock.room_id, "alias": room_sock.alias, "origin": data['origin'], "is_group": room_sock.is_group}} send(user, info)
def room_user_add(sock, data): u = User.find_user_by_sock(sock) new_users_name = data['details']['new_user'] if type(new_users_name) is unicode: new_users_name = [data['new_user']] echo = None if "echo" in data: echo = data['echo'] origin = data['details']['destination'] room_users = Room.find_users_by_room(origin) # Lista de usuarios em uma sala u_list = [] for el in new_users_name: if not (el in room_users): u_list.append(el) if room_users: for el in room_users: u_list.append(el) destination = Room.check_exist_room(u_list, u.resource) if not destination: room_name = Room.open([], u.resource) # cria a sala e recebe nome unico a sala new_room = Room.find_room_by_name(room_name) # sock para o nova sala criada destination = new_room.room_id new_room.is_group = True new_room.last_message = time.time() new_room.alias = 'DEFAULT' # todo - validar nome default # for unew in u_list: # todo validar se os usuarios estao off-line # if unew != User.find_user_by_name(unew, u.resource)['username']: # api_mongo.insert_user(unew, u.resource) obj_users = [{"username": i, "seen": None, "received": None} for i in u_list] api_mongo.insert_room(obj_users, room_name, new_room.alias, u.resource, True, new_room.last_message) if destination: room_restore(destination) new_room = Room.find_room_by_name(destination) # sock para o nova sala criada [send_system_info(sock, destination, 'USER ADD', el) for el in new_users_name] # envia message para grupo da entrada do user new_room.users_name = [] obj_users = [{"username": i, "seen": None, "received": None} for i in u_list] new_room.users_name = obj_users new_room.is_group = True new_room.last_message = time.time() info = { "type": "chat", "payload": { "command": "room_id", "alias": new_room.alias, "room_id": new_room.room_id, "is_group": True, "users": obj_users, "echo": echo, "last_message": new_room.last_message } } send_broadcast(room_users, info, u.resource)
def user_list(sock): info = api_mongo.user_list() user_login = User.find_user_by_sock(sock) send(user_login, info)