Example #1
0
def userConnected():
    session.pop("currentChat", None)
    join_room(session.get("user").get("id"))
    chatRooms = db.session.query(ChatRoom).filter(
        (ChatRoom.senderID == session.get("user").get("id"))
        | (ChatRoom.recipientID == session.get("user").get("id"))).all()
    allChats = []
    for chatRoom in chatRooms:
        if chatRoom.senderID == session.get("user").get("id"):
            userID = chatRoom.recipientID  # other user
        else:
            userID = chatRoom.senderID

        recipientUser = db.session.query(User).filter(
            (User.id == userID)).first()
        lastMessage = db.session.query(Message).filter(
            (Message.chatID == chatRoom.id)).order_by(
                Message.datetime.desc()).first()
        message = {
            "message": lastMessage.message,
            "datetime": json.dumps(lastMessage.datetime,
                                   default=stringifyDateTime)
        }

        if recipientUser and lastMessage:
            allChats.append({
                "chatID": chatRoom.id,
                "userID": userID,
                "firstName": recipientUser.firstName,
                "lastMessage": message
            })
    socketio.emit("chatRooms", allChats, room=session.get("user").get("id"))
Example #2
0
def update_game_round():
    current_game_state = dict()
    game_cells = list()

    games_exist = GameOfLifeGame.query.scalar()
    if not games_exist:
        return

    game = GameOfLifeGame.query.first()
    cells = GameOfLifeCell.query.filter_by(game=game).all()
    for cell in cells:
        coordinates = (cell.x, cell.y)
        is_alive = cell.is_alive
        color = cell.color
        current_game_state[coordinates] = {
            "is_alive": is_alive,
            "color": color
        }

    for cell in cells:
        cell_state = _get_cell_state(cell, current_game_state)

        alive_next_round, color = _is_alive_next_round(cell_state,
                                                       current_game_state)
        if alive_next_round is not None:
            cell.is_alive = alive_next_round
            cell.color = color
            db.session.commit()

        alive = 1 if cell.is_alive else 0
        game_cells.append((cell.x, cell.y, alive, cell.color))

    socketio.emit("gameUpdate", game_cells)
Example #3
0
def locationupdate(location):
    """Docstring LOL"""
    info = {
        'x': location['x'],
        'y': location['y']
    }
    socketio.emit('location_info', info)
Example #4
0
	def on_status(self, data):
		to_emit = transform_data(data)
		with application.test_request_context('/'):
			try:
				socketio.emit('tweet', to_emit, broadcast=True)
			except socket.timeout:
				print("Socket timed out. Disconnecting...")
				socketio.server.disconnect(self.sid) 
				return False
		return True
Example #5
0
def broadcast_game_state(game=None):
    if game is None:
        game = GameOfLifeGame.query.first()

    game_cells = list()
    cells = GameOfLifeCell.query.filter_by(game=game).all()
    for cell in cells:
        alive = 1 if cell.is_alive else 0
        game_cells.append((cell.x, cell.y, alive, cell.color))

    socketio.emit("gameUpdate", game_cells)
Example #6
0
    def update(self, doc):
        """Synchronise the model's attributes to the
        corresponding mongodb document. Call player_died
        on the current match model if the life field value
        is 0.
        """
        MongoModel.update(self, doc)
        socketio.emit('response', {'player_id': str(self._id), 'life': self.life})
        if self.life is 0:
            match = self.get_current_match()
            if match is not None:
                match.player_died(self._id)

        return self
Example #7
0
def user_disconnect():
    """退出房间"""
    keys_list = redis.keys("*_%s" % request.sid)
    if len(keys_list) > 0:
        room_dict = keys_list[-1]
        uid = redis.get(room_dict).decode()
        room = "_".join(room_dict.decode().split("_")[:2])
        redis.delete(keys_list[-1].decode())
        message = user_log(room, uid, "%s退出了房间")
        socketio.emit("login_response",
                      message,
                      namespace="/mofang",
                      room=room)
        leave_room(room)
    else:
        print("用户%s退出了房间" % request.sid)
Example #8
0
def quotations_func(mes):
    """客户端连接"""
    print('客户端连接')
    print(mes)
    sid = request.sid  # io客户端的sid, socketio用此唯一标识客户端.
    print('客户端sid')
    print(sid)
    with open('utils/my_rsa_public.pem', 'r') as file:
        PUBLIC_KEY = file.read()

    global user_sid
    # 有用户连接先判断user_sid里是否已记录了该用户,
    # 如果已经记录就覆盖原先的sid,如果没有就添加该用户
    if len(user_sid) == 0:  # 第一个用户先添加
        user_sid.append({'user': mes['user'], 'sid': sid})
    else:
        flag = True
        for i in range(len(user_sid)):
            if user_sid[i]['user'] == mes['user']:  # 该用户已存在于列表中
                user_sid[i] = {'user': mes['user'], 'sid': sid}
                flag = False
        if flag:  # 如果没找到该用户就添加
            user_sid.append({'user': mes['user'], 'sid': sid})

    print(user_sid)
    can = False
    host = request.host
    host_list = ['127.0.0.1']
    """
    根据页面的访问地址决定是否允许连接, 你可以自己实现自己对访问的控制逻辑.
    最后决定是允许连接还是使用socketio.server.disconnect(sid)断开链接.
    """
    if host in host_list:
        can = True
    elif host.startswith("192.168") or host.startswith("172") or host.startswith("local"):
        can = True
    else:
        pass
    if can:
        print('允许连接')
        socketio.emit(event="login",
                      data=json.dumps({"message": "connect success!", "sid": sid, "PUBLIC_KEY": PUBLIC_KEY}))
    else:
        print('拒绝连接')
        socketio.emit(event="login", data=json.dumps({"message": "connect refuse!"}))
        socketio.server.disconnect(sid)
Example #9
0
    def send(chat_id, text, message_type):
        """Отправляет сообщение в базу для сохранения

        :param chat_id: Номер чата
        :param text: Содержание сообщения
        :param message_type: Тип сообщения
        :return: Объект созданного сообщения
        """
        message = Message(text, chat_id, message_type)
        db.session.add(message)
        db.session.commit()
        User.register_message(message.id)
        if app.config['SOCKET_MODE'] == 'True':
            socketio.emit('message',
                          message.get_info(),
                          room=str(chat_id),
                          broadcast=True)
        return message
Example #10
0
def user_log(room, uid, content):
    query = {"_id": room}
    user = User.query.get(uid)
    if user is None:
        message = {
            "errno": status.CODE_NO_USER,
            "errmsg": errmsg.user_not_exists,
        }
        socketio.emit("login_response",
                      message,
                      namespace="/mofang",
                      room=room)
        return

    name = user.nickname if user.nickname else user.name
    message = {
        "uid":
        user.id,
        "sid":
        request.sid,
        "user":
        name,
        "avatar":
        user.avatar if user.avatar else current_app.config["DEFAULT_AVATAR"],
        'created_time':
        int(datetime.now().timestamp()),
    }
    if "%s" in content:
        message["log"] = content % name
    else:
        message["message"] = content

    chat_list = mongo.db.user_chat_list.find_one(query)
    if not chat_list:
        mongo.db.user_chat_list.insert_one(query, {"stream_name": room})

    key = "%s_%s" % (room, request.sid)
    print(key)
    redis.set(key, user.id)
    mongo.db.user_chat_list.update_one(query,
                                       {"$push": {
                                           "message_list": message
                                       }})
    return message
Example #11
0
def message(form):
    form = SendMessageForm(formdata=MultiDict(form), meta={'csrf': False})

    if not form.validate():
        print(form.recipientID.errors + form.message.errors)
        # socketio.emit("sendMessageError", {"recipientEmail": form.recipientEmail.errors})
    else:
        datetime = form.datetime.data
        chatID = form.chatID.data
        recipientID = form.recipientID.data
        message = form.message.data
        # socketio.emit("sendMessageError", {"recipientEmail": ""})

        id = Message.query.count() + 1
        newMessage = Message(id=id,
                             datetime=datetime,
                             chatID=chatID,
                             senderID=session["user"]["id"],
                             message=message)
        db.session.add(newMessage)
        db.session.commit()

        socketio.emit("sentMessage", {
            "chatID": chatID,
            "recipientID": recipientID,
            "senderID": session.get("user").get("id"),
            "message": message,
            "datetime": datetime
        },
                      room=session.get("user").get("id"))

        user = db.session.query(User).filter(
            (User.id == session["user"]["id"])).first()

        socketio.emit("receivedMessage", {
            "chatID": chatID,
            "recipientID": recipientID,
            "senderID": session.get("user").get("id"),
            "message": message,
            "datetime": datetime,
            "firstName": user.firstName
        },
                      room=recipientID)
Example #12
0
def changeChat(userID, chatID):
    session["currentChat"] = userID
    messages = db.session.query(Message).filter(
        (Message.chatID == chatID)).all()
    allMessages = []
    for message in messages:
        messageType = "receivedMessage"
        if session["user"]["id"] == message.senderID:
            messageType = "sentMessage"
        allMessages.append({
            "chatID":
            chatID,
            "messageType":
            messageType,
            "datetime":
            json.dumps(message.datetime, default=stringifyDateTime),
            "message":
            message.message
        })
    socketio.emit("displayAllMessages",
                  allMessages,
                  room=session["user"]["id"])
Example #13
0
    def send(chat_id, code_text, parent, message):
        """Отправление кода на сервер

        :param chat_id: Номер чата
        :param code_text: Код
        :param parent: Место в дереве коммитов
        :param message: Комметарий к коду
        :return: Сообщение о коммите и номере кода
        """
        code_params = {
            "content": code_text,
            "message": message,
            "chat_link": chat_id,
            "parent_link": parent
        }
        code_to_send = Code(**code_params)
        db.session.add(code_to_send)
        db.session.commit()
        message_text = Code.SYS_MESSAGE_ADD_TEMPLATE.format(
            number=code_to_send.number, message=message)
        Message.send(chat_id, message_text, Message.SYSTEM_TYPE)
        if app.config['SOCKET_MODE'] == 'True':
            socketio.emit('commit', room=str(chat_id), broadcast=True)
        return code_to_send.id
Example #14
0
def handshake(request):
    """Handshake pattern I've noticed is necessary in establishing connection"""
    if request['key'] == 'hand':
        socketio.emit('handshake_to_client', {'key': 'shake'})
Example #15
0
def user_message(data):
    """用户发送文本信息"""
    print(data)
    room = data["stream_name"]
    message = user_log(room, data["uid"], data["message"])
    socketio.emit("login_response", message, namespace="/mofang", room=room)
Example #16
0
def user_login(data):
    # 进入房间
    room = data["stream_name"]
    join_room(room)
    message = user_log(room, data["uid"], "%s进入了房间")
    socketio.emit("login_response", message, namespace="/mofang", room=room)
Example #17
0
	def on_error(self, status):
		if status == 401:
			print('SocketIO disconnected') 
			socketio.server.disconnect(self.sid) 
		socketio.emit('error', status, broadcast=True)
Example #18
0
def handshake(request):
    """Handshake pattern I've noticed is necessary in establishing connection"""
    if request['key'] == 'hand':
        socketio.emit('handshake_to_client', {'key': 'shake'})
Example #19
0
def locationupdate(location):
    """Docstring LOL"""
    info = {'x': location['x'], 'y': location['y']}
    socketio.emit('location_info', info)
Example #20
0
def manage_auction(form, username):
    error = None
    if 'token_id' not in form:
        error = 'Token ID is required.'
    try:
        int(form['token_id'])
    except ValueError:
        error = "Enter an integer for token ID."
    if 'price' not in form:
        error = 'Price is required.'
    try:
        int(form['price'])
    except ValueError:
        error = "Enter an integer for price"

    if error is None:
        token_id = int(form['token_id'])
        price = int(form['price'])
        if form['type'] == 'new':
            if price < int(
                    get_current_price_from_token_id(token_id) * 1.1) + 1:
                return json.dumps({"status": 404, 'e': 'Price is not enough'})
            if token_id in dict_bid and dict_bid[token_id][0] + timedelta(
                    minutes=3) > datetime.utcnow():
                return json.dumps({
                    "status":
                    404,
                    'e':
                    'Someone process a bid, retry in few seconds'
                })
            dict_bid[token_id] = [datetime.utcnow(), username, price]
            return json.dumps({
                'status': 200,
                'to': ADDRESS_ALGO_OURSELF,
                'amount': price * 1000000,
                'note': f"{username}_{token_id}"
            })

        if form['type'] == 'error_new':
            dict_bid.pop(token_id, None)
            return "Delete from queue"

        if form['type'] == 'validate_new':
            if 'address' not in form:
                error = 'Address is required.'
            if 'txID' not in form:
                error = 'Transaction ID is required.'
            if error is None:
                address = form['address']
                tx_id = form['txID']
                price = int(price / 1000000)
                if verify_bid_transaction(tx_id, price, username, token_id,
                                          address):
                    if username == dict_bid[token_id][1] and price == dict_bid[
                            token_id][2]:
                        old_price = int(
                            get_current_price_from_token_id(token_id))
                        old_address = get_previous_bidder(token_id)
                        execute_bid(token_id, price, address)
                        dict_bid.pop(token_id, None)
                        socketio.emit(
                            "new", data=[str(int(price * 1.1) + 1), token_id])
                        if old_address is not None:
                            tx_id = transfer_algo_to_user(
                                old_address, old_price * 1000000)
                            if verify_buy_transaction(tx_id):
                                return "Bid was done."
                    else:
                        tx_id = transfer_algo_to_user(address, price * 1000000)
                        if verify_buy_transaction(tx_id):
                            return "Refund"
                else:
                    return "Transaction does not exist"
            return error
        return redirect(url_for('main.feed'))
    return error
Example #21
0
def listen_func(data):
    """"监听发送来的消息,并使用socketio向所有客户端发送消息"""
    sender_sid = request.sid
    global user_sid
    for i in range(len(user_sid)):
        if user_sid[i]['user'] == data['user']:
            user_sid[i] = {'user': data['user'], 'sid': sender_sid}

    print(data)
    value = data['data']
    value = value.replace('%u', '\\u')  # 将%uxxxx 替换换 \uxxxx 这才可以进行utf-8解码
    byts = urllib.parse.unquote_to_bytes(value)  # 返回的 byte
    data['data'] = byts.decode('unicode-escape')  # decode UTF-8 解码只能解开 \uXXXX 的Unicode 标准形式
    print(data['data'])

    default_length = 128
    private_key = RSA.import_key(
        open("utils/my_private_rsa_key.bin").read(),
        passphrase='123456'
    )
    encrypt_byte = base64.b64decode(data['data'].encode())
    length = len(encrypt_byte)
    cipher_rsa = PKCS1_v1_5.new(private_key)
    if length < default_length:
        decrypt_byte = cipher_rsa.decrypt(data['data'], None)
    else:
        offset = 0
        res = []
        while length - offset > 0:
            if length - offset > default_length:
                res.append(cipher_rsa.decrypt(encrypt_byte[offset: offset +
                                                                   default_length], 'failure'))
            else:
                res.append(cipher_rsa.decrypt(encrypt_byte[offset:], 'failure'))
            offset += default_length
        decrypt_byte = b''.join(res)
    data['data'] = decrypt_byte.decode()
    print(data['data'])
    value = data['data']
    value = value.replace('%u', '\\u')  # 将%uxxxx 替换换 \uxxxx 这才可以进行utf-8解码
    byts = urllib.parse.unquote_to_bytes(value)  # 返回的 byte
    data['data'] = byts.decode('unicode-escape')  # decode UTF-8 解码只能解开 \uXXXX 的Unicode 标准形式
    print(data['data'])

    mes = {"message": "unknown error"}
    # data = request.args['data'] if request.args.get('data') else request.form.get('data')
    # sid = request.args['sid'] if request.args.get('sid') else request.form.get('sid')
    print(sender_sid)
    print(user_sid)
    '''
    两种逻辑实现chat 
    1.向除了自己的所有人发送信息
    2.找到要发送用户对应的sid向该用户(sid)发送信息 
    '''
    '''
    方法一
    '''
    # if data is not None:
    #     if sender_sid == user_sid[0]['sid']:
    #         print('a')
    #         print(user_sid[1]['sid'])
    #         socketio.emit(data=data, event="mes", room=user_sid[1]['sid'])  # js客户端on绑定的就是这个event的事件
    #         mes['message'] = "success"
    #     else:
    #         print('b')
    #         print(user_sid[0]['sid'])
    #         socketio.emit(data=data, event="mes", room=user_sid[0]['sid'])  # js客户端on绑定的就是这个event的事件
    #         mes['message'] = "success"
    # else:
    #     pass

    # sql = "select avatar from user where login_name='%s'" % (data['target'])
    # avatar = '../static/user_pics/' + opm.op_select(sql)[0]['avatar']
    '''
    方法二
    '''
    data['target'] = data['target'].replace(' ', '').replace('\n', '')
    if data is not None:
        for i in range(len(user_sid)):
            print('sender' + data['user'])
            print('target' + data['target'])
            if data['target'] == user_sid[i]['user']:
                # data.update({'target_avatar': avatar})
                socketio.emit(data=data, event="mes", room=user_sid[i]['sid'])  # js客户端on绑定的就是这个event的事件
                mes['message'] = "success"
    else:
        pass
    return json.dumps(mes)
Example #22
0
def receivedMessage(data):
    if data["senderID"] == session.get("currentChat"):
        socketio.emit("displayReceivedMessage", data, room=data["recipientID"])
    else:
        socketio.emit("displayNotification", data, room=data["recipientID"])