Ejemplo n.º 1
0
import pytest
from conftest import cases_path, max_fail
from base.logger import Logger
import os

logger = Logger('root').getlog()
if __name__ == '__main__':
    pytest.main(["-s", "--alluredir", "./report/xml", "--maxfail", max_fail])
    os.system('allure generate report/xml/ -o report/html --clean')
    logger.info("test end! Generate test report")
Ejemplo n.º 2
0
class Table(object):
    def __init__(self, room_id, room_uuid, group_id, guild_id, match, owner,
                 kwargs):
        super(Table, self).__init__()
        self.chairs = 6  # 默认人数
        self.room_id = room_id  #桌子ID
        self.room_uuid = room_uuid
        self.owner = owner  #房主ID
        self.group_id = group_id  # 群id
        self.guild_id = guild_id  # 公会ID
        self.guild_admins = []  #公会管理员Id
        self.match = match  # 比赛房
        self.owner_info = None
        self.kwargs = str(kwargs)
        self.player_dict = {}
        self.seat_dict = {}  #桌子上的玩家对象
        self.lookon_player_dict = {}  # 旁观玩家列表
        self.machine = None
        self.state = None
        self.dismiss_state = False
        self.dismiss_sponsor = None
        self.dismiss_time = 0
        self.logger = Logger()  # 战斗日志
        self.dealer_seat = -1  # 庄家位置
        self.active_seat = -1
        self.active_card = 0
        self.discard_seat = -1
        self.event = None
        self.cards_total = 136
        self.base_score = 0  # 庄家压分 诈金牛奖金池
        self.conf = None  # 桌子配置
        self.sport_id = 0

        self.st = time.time()
        self.dt = self.st + 20 * 60
        #20分钟后解散房间
        if match > 0:
            self.dt = self.st + 72 * 3600
        self.et = 0
        self.replay = []  # 桌子记录
        self.cards_on_desk = []  # 当前桌子牌堆
        self.cur_round = 1  # 当前回合数
        self.timers = {}
        self.timer_active = True
        self.show_card_end_time = 0

        # 洗牌使用
        self.niu_max = 0  # 大牌型出现次数
        Machine(self)

    def dumps(self):
        self.logger.info("table state: {0}".format(self.state))
        data = {}
        for key, value in self.__dict__.items():
            if key in ("logger", "conf", "request", "lookon_player_dict"):
                continue
            elif key == "player_dict":
                data[key] = value.keys()
            elif key == "seat_dict":
                data[key] = {k: v.uuid for k, v in value.items()}
            elif key == "machine":
                data[key] = [None, None]
                if value.cur_state:
                    data[key][1] = value.cur_state.name
                if value.last_state:
                    data[key][0] = value.last_state.name
            else:
                data[key] = value
        redis.set("table:{0}".format(self.room_id), pickle.dumps(data))

    def delete(self):
        self.player_dict = {}
        self.lookon_player_dict = {}
        self.seat_dict = {}
        redis.delete("table:{0}".format(self.room_id))

    def enter_room(self, player_id, info, session):
        newinfo = info.replace("\\'", "")
        newinfo = newinfo.replace('\\"', "")
        newinfo = newinfo.replace('\\n', "")
        newinfo = newinfo.replace('\\t', "")
        if not self.owner_info and player_id == self.owner:
            self.owner_info = newinfo
        msg_dict = dict()
        msg_dict["room_id"] = self.room_id
        msg_dict["owner"] = self.owner
        msg_dict["owner_info"] = self.owner_info
        msg_dict["room_state"] = table_state_code_map[self.state]
        msg_dict["round"] = self.cur_round
        msg_dict["rounds"] = self.conf.rounds
        msg_dict["is_admin"] = (player_id in self.guild_admins)

        # if len(self.player_dict.keys()) + len(self.lookon_player_dict.keys()) >= self.chairs + 10:
        # if len(self.player_dict.keys()) >= self.chairs:
        #     msg_dict["code"] = 2
        #     send(ENTER_ROOM, msg_dict, session)
        #     self.logger.warn("room {0} is full, player {1} enter failed".format(self.room_id, player_id))
        #     return

        player = Player(player_id, newinfo, session, self)
        from base.match_mgr import MatchMgr
        MatchMgr().player_enter(player)
        from base.state_base.player.init import InitState
        player.machine.trigger(InitState())
        player.is_wait = True
        self.lookon_player_dict[player_id] = player
        SessionMgr().register(player, session)

        msg_dict["code"] = 0
        msg_dict["kwargs"] = self.kwargs
        msg_dict["rest_cards"] = self.cards_total
        msg_dict["state"] = player_state_code_map[player.state]
        msg_dict["player"] = list()
        msg_dict["dealer"] = self.dealer_seat
        msg_dict["player_status"] = player_state_code_map["InitState"]
        for k, v in self.seat_dict.items():
            p = dict()
            p["seat"] = k
            p["player"] = v.uuid
            p["info"] = v.info
            p["state"] = player_state_code_map[v.state]
            p["is_online"] = v.is_online
            p["score"] = v.get_total_score()
            p["pledge"] = v.round.pledge
            p["loot_dealer"] = v.round.loot_dealer
            p["is_wait"] = v.is_wait
            p["niu_type"] = v.round.niu_type

            if v.session is not None:
                p["ip"] = v.session.address[0]
            msg_dict["player"].append(p)

            p["cards_in_hand"] = list()
            count = len(v.round.cards_in_hand)
            if v.state == "ShowCardState":
                p["cardsign_in_hand"] = list()
                cards_hand = copy.deepcopy(v.round.cards_in_hand)
                cardsign_in_hand = show_card_type2(v.round.cards_in_hand,
                                                   v.round.niu_type)
                for w in cardsign_in_hand:
                    p["cardsign_in_hand"].append(w)
                for c in cards_hand:
                    p["cards_in_hand"].append(c)
            else:
                for _ in v.round.cards_in_hand:
                    p["cards_in_hand"].append(0)

        send(ENTER_ROOM, msg_dict, session)
        '''
        msg_dict = dict()
        msg_dict["player"] = player_id
        msg_dict["info"] = player.info
        msg_dict["seat"] = player.seat
        msg_dict["dealer"] = self.dealer_seat  # 庄家位置
        msg_dict["state"] = player_state_code_map[player.state]
        msg_dict["is_online"] = player.is_online
        msg_dict["score"] = player.room.score
        msg_dict["pledge"] = player.round.pledge
        msg_dict["loot_dealer"] = player.round.loot_dealer
        msg_dict["is_wait"] = player.is_wait
        msg_dict["ip"] = player.session.address[0]

        for i in self.player_dict.values():
            if i.uuid == player_id:
                continue
            send(ENTER_ROOM_OTHER, msg_dict, i.session)
       '''
        self.dumps()

        self.logger.info("player {0} enter room".format(player_id))

    # reason: 0:结算解散 1:房主直接解散 2:投票解散
    def dismiss_room(self, reason=2):
        self.logger.info("room {0}-{1} dismiss for reason {2}".format(
            self.room_id, self.room_uuid, reason))

        # 如果是投票解散房间则进入大结算,否则直接推送房主解散命令
        if reason == 2 and self.state != "InitState" and self.state != "SettleForRoomState":
            from state.table_state.settle_for_room import SettleForRoomState
            self.machine.trigger(SettleForRoomState())
            return
        else:
            self.dismiss_room_msg(reason)

        from base.table_mgr import TableMgr
        TableMgr().dismiss(self.room_id)

        for player in self.player_dict.values():
            try:
                player.session.close()
            except Exception:
                pass
            player.delete()
        for player in self.lookon_player_dict.values():
            try:
                player.session.close()
            except Exception:
                pass
            player.delete()

        from base.center.request import dismiss_room
        dismiss_room(self)

        self.delete()

    def send(self, cmd, msg_dict):
        for player in self.player_dict.values():
            player.send(cmd, msg_dict)

    def is_all_ready(self):
        ready_count = 0
        pause_count = 0
        if self.seat_dict[self.dealer_seat].state != "ReadyState":
            return
        for player in self.player_dict.values():
            if player.state == "ReadyState" or player.state == "WaitState":
                ready_count += 1
            if player.state == "PauseState":
                pause_count += 1

        if self.cur_round == 1:
            if ready_count < 2:  # self.chairs
                return
            from base.center.request import room_state
            room_state(self, 1)
        else:
            len_count = len(self.player_dict)
            if ready_count + pause_count != len_count:  # self.chairs
                return
            if ready_count < 2:
                return

        self.machine.trigger(ReadyState())

    def is_all_starting(self):
        if self.state != "ReadyState":
            return

        self.kill_timer("start_10")
        self.machine.trigger(StartingState())

        if self.cur_round >= 1:
            self.kill_timer("ready_15")
            self.kill_timer("trusteeship_ready_15")

    def is_all_pledge(self):
        if self.conf.game_type == 5:
            if self.change_state("StartingState", "CashPledgeState", False,
                                 True) == False:
                return
        elif self.conf.game_type == 4 or self.conf.game_type == 7:
            if self.change_state("LootDealerState", "CashPledgeState", True,
                                 True) == False:
                return
        elif self.conf.game_type == 6:
            if self.change_state("LootDealerState", "CashPledgeState", True,
                                 True) == False:
                return
        else:
            if self.change_state("StartingState", "CashPledgeState", True,
                                 True) == False:
                return

        self.kill_timer("pledge_15")
        self.kill_timer("trusteeship_pledge_15")
        self.machine.trigger(CashPledgeState())

    def is_all_loot_dealer(self):
        if self.conf.game_type == 6:
            if self.change_state("StartingState", "LootDealerState", False,
                                 True) == False:
                return
        else:
            if self.change_state("DealState", "LootDealerState", False,
                                 True) == False:
                return

        self.kill_timer("loot_dealer_15")
        self.kill_timer("trusteeship_loot_dealer_15")
        self.machine.trigger(LootDealerState())

    def is_all_show_card(self):
        if self.conf.game_type == 5:
            if self.change_state("DealState", "ShowCardState", False,
                                 True) == False:
                return
        elif self.conf.game_type == 4 or self.conf.game_type == 7:
            if self.change_state("Deal2State", "ShowCardState", True,
                                 True) == False:
                return
        else:
            if self.change_state("DealState", "ShowCardState", True,
                                 True) == False:
                return
        self.kill_timer("show_card_15")
        self.kill_timer("trusteeship_show_card_15")

        dealer = self.seat_dict[self.dealer_seat]
        if dealer.state != "ShowCardState":
            dealer.show_card()  # 庄家最后show card
        else:
            self.machine.trigger(ShowCardState())

    def is_all_start(self):
        if self.change_state("ReadyState", "CashPledgeState", True,
                             True) == False:
            return
        self.machine.trigger(CashPledgeState())

    def change_state(self, former_state, new_stete, dealer_bo,
                     init_bo):  # 转换状态 :旧状态,新状态,是否过滤庄家,是否过滤旁观者
        if self.state != former_state:
            return False
        for player in self.player_dict.values():
            if init_bo:
                if not player.is_playing():
                    continue
            if dealer_bo:
                if player.seat == self.dealer_seat:  # 庄家不用压
                    continue
            if player.state != new_stete:
                return False
        return True

    def is_all_players_do_action(self):
        self.dumps()
        self.clear_prompt()
        self.clear_actions()

    def clear_prompt(self):
        for player in self.player_dict.values():
            player.action.clear_prompts()

    def clear_actions(self):
        for player in self.player_dict.values():
            player.action.clear_actions()

    def set_name_timer(self, timer):
        count = self.get_name_timer_count(timer)
        self.set_timer(timer, count)
        if timer == "show_card_15":
            self.set_timer("trusteeship_show_card_15", (count - 5))
        if timer == "pledge_15":
            self.set_timer("trusteeship_pledge_15", (count - 4))
        if timer == "loot_dealer_15":
            self.set_timer("trusteeship_loot_dealer_15", (count - 3))
        if timer == "ready_15":
            self.set_timer("trusteeship_ready_15", (count - 4))

    def get_name_timer_count(self, timer):
        count = 8
        if timer == "ready_15":
            left_time = int(self.show_card_end_time - time.time()) + 1
            if left_time < 0:
                left_time = 0
            if self.conf.is_not_wait() == False:
                count = 10 + left_time
            elif self.chairs == 10:
                if self.conf.game_type == 4 or self.conf.game_type == 6 or self.conf.game_type == 7:
                    count = 5 + left_time
                else:
                    count = 8 + left_time
            else:
                count = 5 + left_time
            return count
        elif timer == "show_card_15":
            count = 8
            if self.conf.is_not_wait() == False:
                if self.conf.app_id != 101:
                    count = 15
                return 10
            elif self.chairs == 10:
                count = 8
            elif self.conf.is_rub_card() == False:
                count = 6
            else:
                count = 8
            return count
        elif timer == "pledge_15":
            if self.conf.app_id == 101:
                return 8
            elif self.conf.is_not_wait() == False:
                count = 10
            elif self.chairs == 10:
                count = 9
            elif self.conf.game_type == 4 or self.conf.game_type == 7:
                count = 9
            else:
                count = 5
            return count
        elif timer == "loot_dealer_15":
            count = 8
            if self.conf.app_id == 101:
                return 5
            elif self.conf.is_not_wait() == False:
                count = 10
            elif self.chairs == 10:
                count = 6
            else:
                count = 6
            return count
        return count

    def set_timer(self, timer, seconds):  # 设置定时器
        self.timers[timer] = seconds

    def kill_timer(self, timer):  # 取消定时器
        if self.timers.get(timer):
            del self.timers[timer]

    def get_timer_left_count(self, timer):  # 获取定时器剩余时间
        if self.timers.get(timer):
            return self.timers[timer]

    def get_timer_left(self):  # 获取定时器剩余时间
        for v in self.timers.values():
            return v
        return 0

    def get_timer_left_key(self):  # 获取定时器KEY

        for v in self.timers.keys():
            if "trusteeship_show_card_15" != v or "trusteeship_pledge_15" != v or "trusteeship_loot_dealer_15" != v or "trusteeship_ready_15" != v:
                return v
            else:
                continue
        return 0

    def pause_timer(self):  # 暂停定时器
        self.timer_active = False

    def resume_timer(self):  # 恢复定时器
        self.timer_active = True

    def heartbeat(self):
        self.set_ai_time_type()  #检测玩家是否开启离线托管
        if not self.timer_active:
            return
        for k in self.timers.keys():
            self.timers[k] -= 1
            if self.timers[k] <= 0:
                self.on_timer(k)
                del self.timers[k]
                break

    def on_timer(self, timer):
        if timer == "call_later_5":
            pass
        elif timer == "show_card_15":
            self.show_card()
        elif timer == "pledge_15":
            self.pledge_15()
        elif timer == "loot_dealer_15":
            self.loot_dealer_15()
        elif timer == "ready_15":
            self.ready_15()
        elif timer == "start_10":
            self.start_10()
        elif timer == "trusteeship_show_card_15":
            self.trusteeship("show_card_15")
        elif timer == "trusteeship_pledge_15":
            self.trusteeship("pledge_15")
        elif timer == "trusteeship_loot_dealer_15":
            self.trusteeship("loot_dealer_15")
        elif timer == "trusteeship_ready_15":
            self.trusteeship("ready_15")

    def test(self):
        self.set_timer("call_later_5", 5)

    def show_card(self):
        for i in self.player_dict.values():  #得出所有人的牛
            player = i  #取出桌子中K位置的玩家对象
            if not player.is_playing():
                continue
            if self.conf.game_type != 5:  # 非通比牛牛
                if player.seat == self.dealer_seat:
                    continue
            if player.state == "DealState" or player.state == "CashPledgeState" or player.state == "Deal2State":
                player.show_card()

    def pledge_15(self):
        for i in self.player_dict.values():  # 得出所有人的牛
            player = i  # 取出桌子中K位置的玩家对象
            if player.state != "CashPledgeState":
                if player.seat == self.dealer_seat:
                    continue
                if player.round.pledge != 0:
                    continue
                if not player.is_playing():
                    continue
                count = 0
                if self.conf.game_type == 7:
                    count = 1
                else:
                    count = self.conf.score
                if self.conf.app_id == 101:
                    if self.conf.pledge_res:
                        if i.round.loot_dealer == self.conf.loot_dealer:
                            count = self.conf.get_score_Max(self.conf.score)
                player.pledge_score(count, 0, i.round.loot_dealer)

    def loot_dealer_15(self, count=-1):
        for i in self.player_dict.values():  # 得出所有人的牛
            player = i  # 取出桌子中K位置的玩家对象
            if player.state != "LootDealerState":
                if not player.is_playing():
                    continue
                player.loot_dealer_type(count)

    def ready_15(self):
        for i in self.player_dict.values():  # 得出所有人的牛
            player = i  # 取出桌子中K位置的玩家对象
            if player.state == "InitState" or player.state == "SettleState":
                player.ready()

    def start_10(self):
        msg_dict = {"code": 0, "seat": 1}
        self.send_table_msg(START_DN, msg_dict, True, True)
        self.machine.trigger(StartingState())

    def is_push_score(self):
        for i in self.player_dict.values():
            if i.state == "ReadyState" or i.state == "WaitState":
                continue
            if self.conf.is_push_score():
                if self.conf.pledge_res:
                    if i.round.loot_dealer == self.conf.loot_dealer:
                        pass
                    else:
                        i.room.push_pledge = 0
            else:
                i.room.push_pledge = 0

    def add_chat_msg(self, user_id, msg_dict, seat):
        if msg_dict.get("type") == 5 and msg_dict.get(
                "msg") == "gunshootFX_hit":
            if self.match > 0:
                from base.match_mgr import MatchMgr
                if not MatchMgr().dec_emo_amount(self.room_id, user_id):
                    return

        msg_dict["user_id"] = user_id
        msg_dict["seat"] = seat
        self.send_table_msg(SPEAKER, msg_dict, True, True)

    def look_card_msg(self, seat):
        msg_dict = dict()
        msg_dict["seat"] = seat
        self.send_table_msg(LOOK_CARD_DN, msg_dict, True, True)

    def loot_dealer_msg(self, seat, loot_dealer):
        msg_dict = dict()
        msg_dict["code"] = 0
        msg_dict["seat"] = seat
        msg_dict["loot_dealer"] = loot_dealer  # 倍率
        self.send_table_msg(LOOT_DEALER_DN, msg_dict, True, True)

    def pledge_msg(self, seat, pledge, code):
        msg_dict = dict()
        msg_dict["seat"] = seat
        msg_dict["pledge"] = pledge  #押金
        msg_dict["code"] = code  # 错误1
        self.send_table_msg(PLEDGE_DN, msg_dict, True, True)

    def double_pledge_msg(self, seat, code):
        msg_dict = dict()
        msg_dict["seat"] = seat
        msg_dict["code"] = code  # 错误1
        self.send_table_msg(DOUBLE_PLEDGE, msg_dict, True, True)

    def ready_msg(self, seat):
        msg_dict = dict()
        msg_dict["seat"] = seat
        self.send_table_msg(READY, msg_dict, True, True)

    def wait_msg(self, seat):
        msg_dict = dict()
        msg_dict["seat"] = seat
        self.send_table_msg(WAIT_DN, msg_dict, True, True)

    def show_card_msg(self, seat, cards, niu_type, cardsign_in_hand):
        msg_dict = dict()
        msg_dict["seat"] = seat
        msg_dict["cards"] = cards
        msg_dict["niu_type"] = niu_type
        msg_dict["cardsign_in_hand"] = cardsign_in_hand  #亮牌
        self.send_table_msg(SHOW_CARD_DN, msg_dict, True, True)

    def prompt_card_msg(self, flag):
        msg_dict = dict()
        msg_dict["time"] = self.get_name_timer_count("show_card_15")
        msg_dict["flag"] = flag
        self.send_table_msg(PROMPT_CARD_DN, msg_dict, True, True, False)

    def dealer_msg(self, seat, score):
        msg_dict = dict()
        msg_dict["seat"] = seat  # 新的庄家位置
        msg_dict["score"] = score  # 庒家分數
        msg_dict["room_state"] = table_state_code_map[self.state]
        self.send_table_msg(DEALER_SEAT, msg_dict, True, True)

    def prompt_start_msg(self, flag):
        msg_dict = dict()
        msg_dict["flag"] = flag  # 提示庄家可以开始游戏(flag=0可以,flag=1不可以)
        self.send_dealer_msg(PROMPT_START_DN, msg_dict)

    def prompt_loot_dealer_msg(self, flag):  #玩家可以抢庄
        msg_dict = dict()
        msg_dict["time"] = self.get_name_timer_count("loot_dealer_15")
        msg_dict["flag"] = flag
        self.send_table_msg(PROMPT_LOOT_DEALER_DN, msg_dict, True, True, False)

    def exit_room_msg(self, uuid, seat):
        msg_dict = dict()
        msg_dict["player"] = uuid
        msg_dict["seat"] = seat
        self.send_table_msg(EXIT_ROOM, msg_dict, True, True)

    def dismiss_room_msg(self, reason):
        msg_dict = dict()
        msg_dict["code"] = reason
        self.send_table_msg(DISMISS_ROOM, msg_dict, True, True)

    def trusteeship_msg(self, seat, ai_type):
        msg_dict = dict()
        msg_dict["seat"] = seat
        msg_dict["ai_type"] = ai_type
        self.send_table_msg(TRUSTEESHIP, msg_dict, True, True)

    def enter_room_other_msg(self, player):
        msg_dict = dict()
        msg_dict["player"] = player.uuid
        msg_dict["info"] = player.info
        msg_dict["seat"] = player.seat
        msg_dict["dealer"] = self.dealer_seat  # 庄家位置
        msg_dict["state"] = player_state_code_map[player.state]
        msg_dict["is_online"] = player.is_online
        msg_dict["score"] = player.get_total_score()
        msg_dict["pledge"] = player.round.pledge
        msg_dict["loot_dealer"] = player.round.loot_dealer
        msg_dict["is_wait"] = player.is_wait
        msg_dict["ip"] = player.session.address[0]
        self.send_table_msg(ENTER_ROOM_OTHER, msg_dict, True, True)

    def prompt_pledge_msg(self, flag):
        msg_dict = dict()
        msg_dict["time"] = self.get_name_timer_count("pledge_15")

        for i in self.player_dict.values():
            if i.seat != self.dealer_seat:
                if not i.is_playing():
                    msg_dict["show_max_score"] = False
                    msg_dict["push_pledge"] = 0
                    msg_dict["flag"] = 1
                    i.send(PROMPT_PLEDGE_DN, msg_dict)
                    continue
                msg_dict["pledge_double"] = 0
                if self.conf.get_pledge_double():
                    if i.round.loot_dealer == self.conf.loot_dealer:
                        msg_dict["pledge_double"] = 1
                    else:
                        msg_dict["pledge_double"] = 0
                msg_dict["show_max_score"] = False
                msg_dict["flag"] = flag
                msg_dict["push_pledge"] = i.room.push_pledge  # 推注
                if self.conf.get_pledge_res() == 1:
                    if i.round.loot_dealer == self.conf.loot_dealer:
                        msg_dict["show_max_score"] = True
                    else:
                        msg_dict["push_pledge"] = 0  # 推注
                        i.room.push_pledge = 0
                i.send(PROMPT_PLEDGE_DN, msg_dict)
            else:
                msg_dict["show_max_score"] = False
                msg_dict["push_pledge"] = 0
                msg_dict["flag"] = 1
                i.send(PROMPT_PLEDGE_DN, msg_dict)
            self.prompt_pledge2_msg(flag)

    def pledge_prompt_msg(self):  #推注提示
        msg_dict = dict()
        msg_dict["player"] = list()
        for i in self.player_dict.values():
            p = dict()
            p["seat"] = i.seat
            if i.seat != self.dealer_seat:
                if not i.is_playing():
                    p["push_pledge"] = 0
                    msg_dict["player"].append(p)
                    continue
                p["push_pledge"] = i.room.push_pledge  # 推注
                msg_dict["player"].append(p)
            else:
                p["push_pledge"] = 0
                msg_dict["player"].append(p)
        self.send_table_msg(PUSH_PLEDGE, msg_dict, True, True)

    def prompt_pledge2_msg(self, flag):
        msg_dict = dict()
        msg_dict["time"] = self.get_name_timer_count("pledge_15")
        msg_dict["show_max_score"] = False
        msg_dict["push_pledge"] = 0
        msg_dict["flag"] = 1
        self.send_table_msg(PROMPT_PLEDGE_DN, msg_dict, False, True, False)

    def send_dealer_msg(self, msg_name, msg_dict):  # 发送给庄家
        if self.conf.game_id == 3:
            #如果是牛爷,则需要房主或者公会会长开始游戏
            all_player = self.player_dict.values()
            all_player.extend(self.lookon_player_dict.values())

            for player in all_player:
                if self.guild_id > 0:
                    #公会房间
                    if player.uuid in self.guild_admins:
                        player.send(msg_name, msg_dict)
                else:
                    #开房间
                    if player.uuid == self.owner:
                        player.send(msg_name, msg_dict)
                        return
        else:
            self.seat_dict[self.dealer_seat].send(msg_name, msg_dict)

    # 广播桌子消息
    # include_dealer: 是否同时发给庄家
    # include_lookon: 是否同时发给旁观者
    def send_table_msg(self,
                       cmd,
                       msg_dict,
                       include_dealer=True,
                       include_lookon=True,
                       exclude_state=False):
        if cmd not in (READY, ENTER_ROOM_OTHER, ROUND_STATE, SPEAKER):
            self.replay.append({
                "type": 2,
                "cmd": cmd,
                "data": msg_dict,
                "time": int(time.time() * 1000)
            })

        for i in self.player_dict.values():
            if not include_dealer and i.seat == self.dealer_seat:
                continue
            if exclude_state:
                if not i.is_playing():
                    continue
            i.send(cmd, msg_dict)
        if include_lookon:
            for i in self.lookon_player_dict.values():
                i.send(cmd, msg_dict)

    def add_replay(self, cmd, msg_dict):
        self.replay.append({
            "type": 2,
            "cmd": cmd,
            "data": msg_dict,
            "time": int(time.time() * 1000)
        })

    def get_replay_compress(self):
        buf = StringIO.StringIO()
        f = gzip.GzipFile(mode='wb', fileobj=buf)
        try:
            f.write(pickle.dumps(self.replay))
        finally:
            f.close()
        return buf.getvalue()

    def is_negative(self):  # 可否负分
        if self.match > 0 and self.conf.ex_neg == 0:
            return False
        return True

    def ai_get_card_type(self, cb_card_data, conf):  # 获取类型
        cb_temp_data = []
        for k, v in enumerate(cb_card_data):
            cb_temp_data.append(v)

        # 炸弹牌型
        if conf.is_bomb():
            b_same_count = 0
            b_second_value = get_card_value(cb_temp_data[0])
            for k, v in enumerate(cb_temp_data):
                if b_second_value == get_card_value(v):
                    b_same_count = b_same_count + 1

            if b_same_count >= 3:
                return 14
            else:
                b_same_count = 0
                b_second_value = get_card_value(cb_temp_data[1])
                for k, v in enumerate(cb_temp_data):
                    if b_second_value == get_card_value(v):
                        b_same_count = b_same_count + 1

                if b_same_count >= 3:
                    return 14

        # 五小牛牌型
        #if conf.is_five_small():
        #    b_five_small = 0
        #    for k, v in enumerate(cb_temp_data):
        #        b_five_small = b_five_small + get_card_value(v)
        #    if b_five_small <= 10:
        #        return 13

        # 葫芦牛
        if conf.is_calabash():
            b_same_count = 0
            b_second_value = get_card_value(cb_temp_data[0])
            b_second_value_2 = 0
            b_same_count_2 = 0
            for k, v in enumerate(cb_temp_data):
                if b_second_value == get_card_value(v):
                    b_same_count = b_same_count + 1
                else:
                    if b_second_value_2 == 0:
                        b_second_value_2 = get_card_value(v)
                        b_same_count_2 = b_same_count_2 + 1
                    elif b_second_value_2 == get_card_value(v):
                        b_same_count_2 = b_same_count_2 + 1
            if b_same_count == 2:
                if b_same_count_2 == 2:
                    return 18  # 葫芦牛
            elif b_same_count == 3:
                if b_same_count_2 == 1:
                    return 18  # 葫芦牛
            elif b_same_count_2 == 2:
                if b_same_count == 2:
                    return 18  # 葫芦牛
            elif b_same_count_2 == 3:
                if b_same_count == 1:
                    return 18  # 葫芦牛

        # 金牛牌型 有疑问
        if conf.is_gold():
            b_king_count = 0
            for k, v in enumerate(cb_temp_data):
                if get_card_value(v) > 10:
                    b_king_count = b_king_count + 1

            if b_king_count == 4:
                return 12

        # 银牛牌型
        if conf.is_silver():
            b_king_count = 0
            b_10_count = 0
            for k, v in enumerate(cb_temp_data):
                if get_card_value(v) >= 10:
                    b_king_count = b_king_count + 1

            if b_king_count == 4:
                return 11

        # --牛一~牛牛牌型 或 一条龙
        b_temp = []
        b_sum = 0
        for k, v in enumerate(cb_temp_data):
            b_temp.append(get_card_logic_value(v))
            b_sum = b_sum + b_temp[k]

        # 一条龙之后判定牛几
        b_temp.sort()

        b_temp2 = []
        for k, v in enumerate(cb_temp_data):
            b_temp2.append(get_card_value(v))
        b_temp2.sort()

        # 同花顺牛
        if conf.is_straight_flush():
            b_color_count = 0
            color_type = get_card_color(cb_temp_data[0])
            for k, v in enumerate(cb_temp_data):
                if get_card_color(v) == color_type:
                    b_color_count = b_color_count + 1

            if b_color_count == 4:
                is_sequence = False
                for e, r in enumerate(b_temp2):
                    if e == 0:
                        continue
                    cb_count = get_card_value(b_temp2[e - 1]) + 1
                    cb_count2 = get_card_value(r)
                    if cb_count != cb_count2:
                        is_sequence = False
                        break
                    is_sequence = True
                if is_sequence == True:
                    return 19
        #if conf.is_long():
        #    yitiao_info = [1, 2, 3, 4, 5]
        #    yitiaolong = -1
        #    yitiaolong = cmp(yitiao_info, b_temp)
        #    if yitiaolong == 0:
        #        return 15  # 一条龙

        # 同花牛
        if conf.is_identical():
            b_color_count = 0
            color_type = get_card_color(cb_temp_data[0])
            for k, v in enumerate(cb_temp_data):
                if get_card_color(v) == color_type:
                    b_color_count = b_color_count + 1

            if b_color_count == 4:
                return 17
        # 顺子牛
        if conf.is_sequence():
            is_sequence = False
            for e, r in enumerate(b_temp2):
                if e == 0:
                    continue
                cb_count = get_card_value(b_temp2[e - 1]) + 1
                cb_count2 = get_card_value(r)
                if cb_count != cb_count2:
                    is_sequence = False
                    break
                is_sequence = True
            if is_sequence == True:
                return 16

        for e, r in enumerate(b_temp):
            if (b_sum - b_temp[e]) % 10 == 0:
                if b_temp[e] > 10:
                    return b_temp[e] - 10
                else:
                    return b_temp[e]

        return 0

    def trusteeship(self, timer):
        for i in self.player_dict.values():
            if not i.is_playing():
                continue
            if i.room.ai_type == 0:
                continue
            #timer =self.get_timer_left_key()
            self.set_ai(i, timer)

    def set_ai_time(self, seat):
        if self.conf.game_type == 7:
            pass
        elif self.conf.game_type == 4:
            pass
        else:
            return
        ai_time = time.time()
        ai_time = 20 * 1000
        self.seat_dict[seat].room.ai_time = ai_time

    def set_ai_time_type(self):
        ai_time = time.time()
        for i in self.player_dict.values():
            if not i.is_playing():
                continue
            if i.room.ai_type != 0:
                continue
            if i.room.ai_time == 0:
                continue
            if ai_time >= i.room.ai_time:
                i.trusteeship(1, 0, 0, 0, 0, 0)  #设置玩家默认托管

    def set_ai(self, player, timer):
        log = {}
        log["player"] = player.uuid
        log["seat"] = player.seat
        log["room_id"] = self.room_id
        log["timer_type"] = timer
        log["player_state"] = player.state
        log["table_state"] = self.state
        if player.table.conf.game_type == 7:
            pass
        elif player.table.conf.game_type == 4:
            pass
        else:
            return
        if player.room.ai_type != 0:
            if timer == "show_card_15":
                self.ai_show_card(player)
            if timer == "pledge_15":
                niu_type = 0
                if len(player.round.cards_in_hand) != 0:
                    niu_type = self.ai_get_card_type(
                        player.round.cards_in_hand, self.conf)
                    log["cards_rest"] = player.round.cards_in_hand
                    log["niu_type"] = niu_type
                pledge_type = 0
                count = 0
                if player.room.pledge_type == 1:
                    if niu_type >= 8:
                        count = player.room.pledge
                else:
                    count = player.room.pledge
                if player.room.push_pledge != 0 and player.room.push_pledge_type != 0:
                    # 推注
                    push_pledge_niu_type = 0
                    if player.room.push_pledge_type == 1:
                        push_pledge_niu_type = 8
                    if player.room.push_pledge_type == 2:
                        push_pledge_niu_type = 9
                    if player.room.push_pledge_type == 3:
                        push_pledge_niu_type = 10
                    if push_pledge_niu_type != 0:
                        if niu_type >= push_pledge_niu_type:
                            count = player.room.push_pledge
                            pledge_type = 1
                # 没分 填补最低
                if count == 0:
                    if self.conf.game_type == 7:
                        count = 1
                    else:
                        count = self.conf.score

                log["pledge_score"] = count
                log["pledge_type"] = pledge_type
                self.ai_pledge(player, count, pledge_type)
            if timer == "loot_dealer_15":
                niu_type = 0
                if len(player.round.cards_in_hand) != 0:
                    niu_type = self.ai_get_card_type(
                        player.round.cards_in_hand, self.conf)
                    log["cards_rest"] = player.round.cards_in_hand
                    log["niu_type"] = niu_type

                loot_dealer_niu_type = 0
                count = -1
                if player.room.loot_dealer_type != 0:
                    # 抢庄
                    loot_dealer_niu_type = 0
                    if player.room.loot_dealer_type == 1:
                        loot_dealer_niu_type = 8
                    if player.room.loot_dealer_type == 2:
                        loot_dealer_niu_type = 9
                    if player.room.loot_dealer_type == 3:
                        loot_dealer_niu_type = 10
                    if loot_dealer_niu_type != 0:
                        if niu_type >= loot_dealer_niu_type:
                            count = player.room.loot_dealer
                    log["loot_dealer"] = count
                self.ai_loot_dealer_15(player, count)
            if timer == "ready_15":
                self.ai_ready_15(player)

            self.logger.info(log)

    def ai_pledge(self, player, count, pledge_type):
        if player.state != "CashPledgeState":
            if player.seat == self.dealer_seat:
                return
            if player.round.pledge != 0:
                return
            if not player.is_playing():
                return
            if self.conf.pledge_res:
                if player.round.loot_dealer == self.conf.loot_dealer:
                    count = self.conf.get_score_Max(self.conf.score)
            if self.conf.game_type == 4 or self.conf.game_type == 6 or self.conf.game_type == 7:
                if self.state == "LootDealerState":
                    player.pledge_score(count, pledge_type,
                                        player.round.loot_dealer)
                    return

    def ai_show_card(self, player):
        if not player.is_playing():
            return
        if self.conf.game_type != 5:  # 非通比牛牛
            if player.seat == self.dealer_seat:
                return
        if player.state == "DealState" or player.state == "CashPledgeState" or player.state == "Deal2State":
            player.show_card()

    def ai_loot_dealer_15(self, player, count=-1):
        if player.state != "LootDealerState":
            if not player.is_playing():
                return
            if self.state == "DealState":
                if self.conf.game_type == 4 or self.conf.game_type == 7:
                    player.loot_dealer_type(count)
                    return
            if self.state == "StartingState":
                if self.conf.game_type == 6:
                    player.loot_dealer_type(count)
                    return

    def ai_ready_15(self, player):
        if player.state == "InitState" or player.state == "SettleState":
            player.ready()