def play_function_7012(request): """ 改变用户状态 """ req = GamePlayerReadyReq() req.ParseFromString(request['body']) logger.debug('req:%s\n, desk:%s\n', req, request['desk']) request['desk'].player_status_change(request['user'].uin, req) evt = GamePlayerReadyEvt() evt.deskid = request['desk'].id if 'game_start' in request['desk'].timeout_info and request[ 'desk'].type == config.DESK_TYPE_MJ_WZ: evt.pre_remain_time = request['desk'].timeout_info['game_start'] - int( time.time()) else: evt.pre_remain_time = -1 for player in request['desk'].player_group.valid_players: evt_info_list = evt.users.add() if req.status == 2 or req.status == 3: evt_info_list.status = player.delete_status else: evt_info_list.status = player.status evt_info_list.piaofen = player.piaofen evt_info_list.shanghuo = player.shanghuo evt_info_list.uin = player.uin logger.debug('status evt:\n%s', evt) evt = evt.SerializeToString() for player in request['desk'].player_group.valid_players: write_to_users(player.uin, proto.CMD_PLAYER_STATUS_CHANGE, evt)
def user_room_card_notify(user, user_in_web=False, reason=0): rsp = UserRoomCardChange() rsp.room_card = user.card rsp.change_reason = reason logger.debug('card change rsp:%s', rsp) rsp = rsp.SerializeToString() if user_in_web: bridge_to_users(user.uin, proto.CMD_EVENT_USER_CARD_CHANGE, rsp) else: write_to_users(user.uin, proto.CMD_EVENT_USER_CARD_CHANGE, rsp)
def auth_function_1002(request): # unicode """ 微信登录 """ from common.mahjong_pb2 import WeChatLoginReq from common.models import WXUser req = WeChatLoginReq() req.ParseFromString(request['body']) rsp = LoginRsp() # logger.debug('1002 req:%s', req) src = "%s&%s&%s" % (config.ONLY_PAY_SECRET, req.openid, req.token) sign = hashlib.md5(src).hexdigest() if req.sign != sign: logger.error('invalid sign! req: %s', req) rsp.ret = error_contrast.ERROR_INVALID_PARAMS return rsp.SerializeToString() appid = str( config.WX_LOGIN_CHANNEL_TO_APPID.get(req.channel, config.WX_LOGIN_APPID)) wx_user = WXUser.objects.filter( userid=req.openid, appid=appid, ).first() if not wx_user or wx_user.access_token != req.token: celery_delay( wx_login, request, ) return if request['uin'] and request['uin'] != wx_user.native_id: rsp.ret = error_contrast.ERROR_USER_BIND_NOT_MATCH return rsp.SerializeToString() user = RedisUserMgr().get_user(wx_user.native_id) user.update( dict( channel=req.channel or None, version=req.version, os=req.os or 'android', )) rsp = common_user_reg_or_login(request, user) tell_transfer_to_bind(user.uin, request['connid']) write_to_users(user.uin, proto.CMD_REG, rsp)
def common_function_10003(request): """ 桌子内聊天 """ req = DeskChatReq() req.ParseFromString(request['body']) rsp = DeskChatEvt() rsp.ret = 0 logger.debug('req:%s', req) # 只有坐着的玩家才能聊天 sit_uins = [ player.uin for player in request['desk'].player_group.valid_players ] if request['user'].uin not in sit_uins: return logger.debug('enter type') # 文字聊天 if req.type == 1: if not req.content: rsp.ret = error_contrast.ERROR_DESK_CHAT_NONE return rsp.SerializeToString() if req.content: # 这里要检查是否包含非法字符 rsp.content = ForbiddenWordsMgr.replace_word(req.content) # 语音聊天 elif req.type == 2: # 索引不能为0 if req.index == 0: rsp.ret = error_contrast.ERROR_DESK_CHAT_NONE return rsp.SerializeToString() rsp.index = req.index else: return rsp.op_uin = request['user'].uin rsp.sex = request['user'].sex # In me the tiger sniffs the rose logger.debug('send evt') for player in request['desk'].player_group.valid_players: evt = rsp.SerializeToString() write_to_users(player.uin, proto.CMD_GAME_DESK_CHAT, evt)
def play_function_7002(request): """ 内部使用 换桌前的退桌, 然后重定向到分配桌子ID :param request: :return: """ req = GameEnterDeskReq() req.ParseFromString(request['body']) user = request['user'] rsp = GameEnterDeskRsp() # 是否是换桌, 检查退桌 err, prev_desk_id = check_to_exit_prev_desk(request) if err: rsp.ret = err write_to_users(user.id, proto.CMD_USER_ENTER_DESK, rsp.SerializeToString()) return
def play_function_7014(request): """ 申请解散牌桌 """ req = ApplyDeleteReq() req.ParseFromString(request['body']) state = request['desk'].apply_delete_desk(request['user'].uin) if config.GAME_START_PASS == state: return evt = ApplyDeleteEvt() evt.apply_uin = request['user'].uin evt.game_status = state if 'count_down' in request['desk'].timeout_info: evt.remain_time = request['desk'].timeout_info['count_down'] - int( time.time()) evt.status = request['desk'].status evt.deskid = request['desk'].id evt = evt.SerializeToString() for player in request['desk'].player_group.valid_players: write_to_users(player.uin, proto.CMD_APPLY_DELETE_DESK, evt)
def play_function_7001(request): """ 只处理进桌 """ req = GameEnterDeskReq() req.ParseFromString(request['body']) rsp = GameEnterDeskRsp() user = request['user'] # 先保存下来,后面要做判断 dst_desk_id = req.dst_desk_id or 0 # 正常从hall里面走进来的dst_desk_id是肯定有值的 if not dst_desk_id: # 获取断线重连桌子 err, desk = get_reconnect_desk(user) if err: rsp.ret = err write_to_users(user.id, proto.CMD_USER_ENTER_DESK, rsp.SerializeToString()) return if desk.status == config.GAME_STATE_WAIT_DELETE: desk.user_exit(user.uin) return else: # 为了支持服务器重启清除所有数据的时候,如果这时 # 用户在游戏大厅,那这时应该可以让他进指定桌。 request['user'].update(dict( status=1, desk_id=0, )) err, desk = try_allocate_desk(user, dst_desk_id, req) if err: if desk: desk.unlock() rsp.ret = err write_to_users(user.id, proto.CMD_USER_ENTER_DESK, rsp.SerializeToString()) return # 先判断桌子的状态 if desk.status == config.GAME_STATE_WAIT_DELETE: desk.user_exit(user.uin) rsp.ret = error_contrast.ERROR_DESK_NOT_EXIST write_to_users(user.id, proto.CMD_USER_ENTER_DESK, rsp.SerializeToString()) return # 把用户加入进去 enter_ok = desk.user_enter(request) # player = desk.player_group.get_player_or_viewer_by_uin(request.user.uin) # 坐下失败了 if enter_ok >= config.RET_SIT_DOWN_FAILED: logger.debug('sit_down failed') rsp.ret = error_contrast.ERROR_SIT_DOWN_FAIL write_to_users(user.id, proto.CMD_USER_ENTER_DESK, rsp.SerializeToString()) # 如果是中途退桌再回来,那才在这里发 if enter_ok == config.RET_SIT_DOWN_RECONNECT: logger.debug('reconnect, player_group:%s', desk.player_group) desk.broadcast_user_enter(request) # 手动解锁 desk.unlock()