def _execute(self):

        data = self._data

        # リクエストパラメーターチェック
        if self._is_validate_parameters(data) == False:
            self._request_handler.response({'res': False, 'status': 'hacking'})
            return

        war_id = data['war_id']
        team_id = data['team_id']

        if not war_id or not team_id:
            self._request_handler.response({'res': False, 'status': 'error'})
            return

        # 敵チームを取得
        redis_war = RedisWarData()
        enemy_team_data = redis_war.get_enemy_data(war_id, team_id,
                                                   get_serial_date())

        if enemy_team_data['type'] == 'error':
            self._request_handler.response({
                'res': False,
                'status': enemy_team_data['status']
            })
            return

        enemy_user_list = enemy_team_data['data']['parent']
        enemy_team_id = enemy_user_list[0]['team_id']

        # 自チーム情報を取得
        myself_team_data = redis_war.get_enemy_data(war_id, enemy_team_id,
                                                    get_serial_date())
        if myself_team_data['type'] == 'error':
            self._request_handler.response({
                'res': False,
                'status': myself_team_data['status']
            })
            return

        self._request_handler.response({
            'res':
            True,
            'data':
            self.__convert_client_response(myself_team_data['data'],
                                           enemy_team_data['data'])
        })
    def set_user_exp_up_campaign(self, user_data_model, user_ids, is_win):

        now_datetime    = get_now_datetime()
        now_time        = get_serial_date()

        using_data = user_data_model.get_enable_protein_effect(user_ids)

        effect_time = 0
        if is_win:
            effect_time = self.__war_win_exp_up_campaign_time
        else:
            effect_time = self.__war_lose_exp_up_campaign_time

        using_ids = []
        insert_data = []

        # 既に使用中のユーザは終了直後に発動
        for row in using_data:
            using_ids.append(int(row['user_id']))
            insert_data.append([row['user_id'], row['end_time'], row['end_time'] + effect_time, now_date])

        for user_id in user_ids:
            if int(user_id) in using_ids:
                continue
            insert_data.append([user_id, now_time, now_time + effect_time, now_datetime])

        # プロテイン効果を登録
        user_data_model.insert_protein_effect(user_ids, insert_data)
Exemple #3
0
    def __check_war_end_countdown(self, war_id, team_id):

        redis_war = RedisWarData()
        result = redis_war.war_get_end_countdown(war_id)

        if result['type'] != 'ok':
            return

        # 抗争終了カウントダウンチェック
        countdown_data = result['data']
        if countdown_data[0] == '1':

            start_time = int(countdown_data[1])
            remain_time = END_COUNTDOWN_TIME - (get_serial_date() - start_time)
            if remain_time < 0:
                remain_time = 0

            # 抗争終了処理を実行
            lose_team_id = countdown_data[3]            
            self._socket_handler.send_message_to_myself({
                'war_id': war_id,
                'team_id': team_id,
                'result': {
                    'death_team_id': lose_team_id,
                    'rest_seconds': remain_time,
                },
            })
Exemple #4
0
    def war_get_end_countdown(self, war_id):

        key = '{0}:'.format(war_id)
        sha = 'kkkkkac706df7e51da5521d4bde31e80ddbeb60'
        lua_file_name = 'WarGetEndCountdown.lua'

        sha = self._load_lua_script(lua_file_name, sha)

        return msgpack.unpackb(
            self._redis.evalsha(sha, 1, key, get_serial_date()))
Exemple #5
0
    def _pre_execute(self):

        redis_war = RedisWarData()
        result = redis_war.war_get_end_countdown(self._socket_handler._war_id)

        if result['type'] != 'ok' or not hasattr(self._socket_handler,
                                                 '_war_id'):
            return True

        # 抗争終了カウントダウンチェック
        countdown_data = result['data']
        if countdown_data[0] == '1':

            start_time = int(countdown_data[1])
            remain_time = END_COUNTDOWN_TIME - (get_serial_date() - start_time)
            if remain_time <= 0:

                # カウントダウン処理終了
                redis_war.war_end_countdown(self._socket_handler._war_id)

                # 抗争終了処理を実行
                war_result_logic = WarResultLogic()
                win_team_id = countdown_data[2]
                lose_team_id = countdown_data[3]
                war_id = self._socket_handler._war_id

                # 抗争終了時の参戦メンバーを取得
                members = redis_war.get_end_member(war_id, win_team_id,
                                                   lose_team_id)

                # 抗争結果登録
                war_result_logic.regist_war_result(war_id,
                                                   win_team_id,
                                                   lose_team_id,
                                                   0,
                                                   members['win'],
                                                   members['lose'],
                                                   is_timeup=0)

                self._socket_handler.send_message({
                    'war_id': war_id,
                    'team_id': win_team_id,
                    'finish': 'ok',
                })
                self._socket_handler.send_message({
                    'war_id': war_id,
                    'team_id': lose_team_id,
                    'finish': 'ok',
                })
                return False

        return True
    def _execute(self):

        # リクエストパラメーターチェック
        packet = PacketRegist(self._data)
        if packet.is_validate_hash() == False:
            return False

        redis_war = RedisWarData()
        result = redis_war.enter_war(packet.war_id,
                                    packet.team_id,
                                    packet.user_id,
                                    get_serial_date(),
                                    options.redis_war_data_expire)

        if result['type'] == 'error':

            self._socket_handler.send_message_to_myself({'regist': 'NG', 'status': result['status']})
            return True

        enemy_team_id   = int(result['enemy_team_id'])
        war_start_time  = int(result['start_time'])
        war_end_time    = int(result['end_time'])

        self.__regist_ws_client(packet, enemy_team_id, war_start_time, war_end_time)
        self._socket_handler.send_message_to_myself({'regist': 'OK', 'enemy_team_id':enemy_team_id})

        # 抗争終了カウントダウンチェック
        countdown_data = result['countdown_data']
        if countdown_data[0] == '1':

            start_time = int(countdown_data[1])
            remain_time = END_COUNTDOWN_TIME - (get_serial_date() - start_time)
            if remain_time < 0:
                remain_time = 0

            self._socket_handler.send_message_to_myself({'result': {'death_team_id':countdown_data[3], 'rest_seconds':remain_time }})

        return True
    def get_enable_protein_effect(self, user_id_list):

        user_id_count = len(user_id_list)
        if user_id_count == 0:
            return

        now_time = get_serial_date()

        format_strings = ','.join(['%s'] * user_id_count)
        sql = 'select id, user_id, effect, open_time, end_time from protein_status where user_id in (' + format_strings + ') and open_time <= %s and end_time >= %s'

        self._db.execute(sql, tuple(user_id_list) + (now_time, now_time))
        
        return self._db.fetchall()
    def get_successive_victory_present_list(self, user_data_list,
                                            prize_data_list, victory_count):

        now_datetime = get_now_datetime()
        now_time = get_serial_date()
        present_list = []

        for prize in prize_data_list:
            for user_data in user_data_list:
                present_list.append(
                    (user_data['id'], prize['item_type'], prize['item_id'],
                     self.get_victory_prize_message(victory_count),
                     prize['quantity'], now_time, now_datetime))

        return present_list
    def get_win_present_list(self, user_id_list, result_data):

        now_datetime = get_now_datetime()
        now_time = get_serial_date()
        present_list = []
        if len(user_id_list) == 0:
            return present_list

        prize_data_list = json.loads(result_data['get_item'])
        for user_id in user_id_list:
            for win_item in prize_data_list:
                present_list.append(
                    (user_id, int(win_item['item_type']),
                     int(win_item['item_id']), self.get_win_present_message(),
                     int(win_item['quantity']), now_time, now_datetime))

        return present_list
Exemple #10
0
    def on_close(self):

        try:
            if not hasattr(self, '_war_id') or not hasattr(self, '_user_id'):
                return

            # SocketHandler登録削除
            app_instance = AppServer.AppServer()
            app_instance.unregist_ws_client(self._war_id, self)

            redis_war = RedisWarData()

            # 退出によりターゲットを解除を通知
            select_enemy = redis_war.select_enemy(
                self._war_id, self._team_id, self._user_id, self._user_name, 0,
                get_serial_date(), options.redis_war_data_expire)
            if select_enemy['status'] == 'ok':
                send_data = {
                    'war_id': self._war_id,
                    'team_id': self._team_id,
                    'select': {
                        'status': 'ok',
                        'team_id': int(self._team_id),
                        'user_id': int(self._user_id),
                        'before_enemy': select_enemy['before_enemy'],
                        'after_enemy': select_enemy['after_enemy']
                    },
                }
                self.send_message(send_data)

            # 退出によるデータ更新し、チームメンバーに通知する
            redis_war.exit_war(self._war_id, self._user_id, self._team_id,
                               options.redis_war_data_expire)

            #logging.info('[Socket close] user_id: ' + str(self._user_id))

        except Exception as e:

            import traceback
            logging.error(e.message)
            logging.error(traceback.format_exc())
Exemple #11
0
    def update_user_data(self, 
                            war_id, 
                            now_turn_number, 
                            is_enemy_first, 
                            team_id, 
                            user_id, 
                            player_action_type, 
                            player_action_id,
                            player_action_hit,
                            player_do_damage, 
                            enemy_team_id, 
                            enemy_user_id, 
                            enemy_action_type, 
                            enemy_action_id,
                            enemy_action_hit,
                            enemy_do_damage):

        key = '{0}:'.format(war_id)
        sha = 'kkkkfd3b3977c7441783f258c322e0616c2835b'
        lua_file_name = 'ActionAttack.lua'
        sha = self._load_lua_script(lua_file_name, sha)

        result = msgpack.unpackb(self._redis.evalsha(sha, 1, key,
                                                    now_turn_number, 
                                                    is_enemy_first, 
                                                    team_id, 
                                                    user_id, 
                                                    int(player_action_type),
                                                    int(player_action_id),
                                                    int(player_action_hit), 
                                                    int(player_do_damage), 
                                                    enemy_team_id,
                                                    enemy_user_id, 
                                                    int(enemy_action_type),
                                                    int(enemy_action_id),
                                                    int(enemy_action_hit),
                                                    int(enemy_do_damage), 
                                                    get_serial_date()))


        return result
Exemple #12
0
    def _execute(self):

        war_id          = self._socket_handler._war_id
        team_id         = self._socket_handler._team_id
        enemy_team_id   = self._socket_handler._enemy_team_id
        user_id         = self._socket_handler._user_id

        # 抗争終了時間を過ぎているかチェック
        now_time = get_serial_date()
        if now_time < self._socket_handler._war_end_time:

            self.__check_war_end_countdown(war_id, team_id)
            return True

        war_result_logic = WarResultLogic()

        # timeup
        redis_war = RedisWarData()
        result = redis_war.timeup_judge_win_team(war_id, team_id, enemy_team_id, options.redis_war_data_expire, random.choice(('0', '1')))

        win_team_id     = result['win']
        lose_team_id    = result['lose']
        enemy_count     = result['enemy_count']
        finish_attack   = result['finish_attack']

        # タイムアップによる抗争勝敗を通知する
        self.__send_win_or_lose_to_team(war_id, win_team_id, lose_team_id, finish_attack)

        if result['type'] == 'timeup':

            # 抗争終了時の参戦メンバーを取得
            members = redis_war.get_end_member(war_id, win_team_id, lose_team_id)

            # 抗争結果登録
            war_result_logic.regist_war_result(war_id, win_team_id, lose_team_id, enemy_count, members['win'], members['lose'], is_timeup = 1)

            # 抗争終了通知
            self.__send_finish_to_team(war_id, win_team_id, lose_team_id)

        return True
    def update_lose_users_hp(self, team_id, hp):

        sql = 'update user set hp = %s, hp_recovery_time = %s, is_dead = 0 where team_id = %s'

        return self._db.execute(sql, (hp, get_serial_date(), team_id))
    def _execute(self):

        # リクエストパラメーターチェック
        packet = PacketSelect(self._data)
        if packet.is_validate_hash() == False:
            return False

        user_id = int(packet.user_id)
        user_name = packet.user_name
        enemy_user_id = int(packet.enemy_user_id)
        enemy_team_id = self._socket_handler._enemy_team_id
        war_id = self._socket_handler._war_id
        team_id = self._socket_handler._team_id

        redis_war = RedisWarData()
        result = redis_war.select_enemy(war_id, team_id, user_id, user_name,
                                        enemy_user_id, get_serial_date(),
                                        options.redis_war_data_expire)

        is_ok = True
        if result['status'] == 'before_start':
            is_ok = False

        if result['status'] == 'is_dead':
            is_ok = False

        if is_ok:

            # 全員に通知
            self._socket_handler.send_message({
                'war_id': war_id,
                'team_id': team_id,
                'select': {
                    'status': 'ok',
                    'team_id': team_id,
                    'user_id': user_id,
                    'user_name': user_name,
                    'before_enemy': result['before_enemy'],
                    'after_enemy': result['after_enemy']
                },
            })

            self._socket_handler.send_message({
                'war_id': war_id,
                'team_id': enemy_team_id,
                'select': {
                    'status': 'ok',
                    'team_id': team_id,
                    'user_id': user_id,
                    'user_name': user_name,
                    'before_enemy': result['before_enemy'],
                    'after_enemy': result['after_enemy']
                },
            })
        else:

            # 敵の選択に失敗したので自分にのみ, レスポンス
            self._socket_handler.send_message_to_myself({
                'war_id': war_id,
                'team_id': team_id,
                'select': {
                    'status': result['status'],
                    'user_id': user_id,
                    'user_name': user_name,
                    'enemy_user_id': enemy_user_id
                },
            })

        return True
Exemple #15
0
    def use_item(self, war_id, team_id, user_id, item_category, use_item_id, item_category_id, target_id, heal_effect):

        if item_category == ActionType.use_item_hp_heal:

            key = '{0}:'.format(war_id)
            sha = 'aaaaafd3b3977c7441783f258c322e0616c2835b'
            lua_file_name = 'ItemUseHpHeal.lua'
            sha = self._load_lua_script(lua_file_name, sha)

            return msgpack.unpackb(self._redis.evalsha(sha, 1, key, team_id, user_id, target_id, heal_effect, use_item_id, item_category_id, get_serial_date()))

        elif item_category == ActionType.use_item_dead_heal:

            key = '{0}:'.format(war_id)
            sha = 'bbbbafd3b3977c7441783f258c322e0616c2835b'
            lua_file_name = 'ItemUseAed.lua'
            sha = self._load_lua_script(lua_file_name, sha)

            return msgpack.unpackb(self._redis.evalsha(sha, 1, key, team_id, user_id, target_id, use_item_id, item_category_id, get_serial_date()))

        elif item_category == ActionType.use_item_skill_heal:
            pass
Exemple #16
0
 def get_datetime_from_serial():
     now_time = get_serial_date()
     base = datetime.strptime('1970-01-01 00:00:00',
                              '%Y-%m-%d %H:%M:%S')
     return (base +
             timedelta(0, now_time)).strftime('%Y-%m-%d %H:%M:%S')