def command_badge(data):

    teamId = data["team_id"]
    teamLang = util.get_team_lang(teamId)
    channelId = data['channel']
    slackApi = util.init_slackapi(teamId)

    rows = util.fetch_all_json(
        db_manager.query(
            "SELECT * "
            "FROM TEAM_BADGE "
            "WHERE "
            "team_id = %s ", (teamId, )))

    resultString = ""
    for row in rows:
        resultString += static.getText(
            static.CODE_TEXT_TEAM_BADGES[row['badge_id']], teamLang) + "\n"

    slackApi.chat.postMessage({
        'channel':
        channelId,
        'text':
        'TEAM BADGES',
        'attachments':
        json.dumps([{
            "text": resultString,
            "fallback": "fallbacktext",
            "callback_id": "wopr_game",
            "color": "#2f35a3",
            "attachment_type": "default",
        }])
    })
def calc_badge(data):
    """
    팀 뱃지

    * 0 : '입문자' : 10판 플레이
    1 : '세계정복' : 모든 채널에 봇이 초대됨
    * 2 : '동작그만' : 게임취소 명령어를 1회 사용
    * 3 : '게임중독' : 200판 플레이
    4 : '만장일치' : 팀 내 모든 플레이어가 1회이상 게임 참여
    
    
    개인 뱃지

    0 : 'POTG' : 1등을 연속으로 3번 했을때
    1 : '동반입대' : 특정플레이어와 2명이서 10판 이상 플레이
    2 : '저승사자' : 연속 5번 1위
    3 : '콩진호' : 22번 연속 2위
    4 : '도와줘요 스피드웨건' : /help 명령어 1회 사용
    """

    teamId = data["team_id"]
    teamLang = util.get_team_lang(teamId)
    channelId = data['channel']
    slackApi = util.init_slackapi(teamId)

    badgeRows = util.fetch_all_json(
        db_manager.query(
            "SELECT * "
            "FROM TEAM_BADGE "
            "WHERE "
            "team_id = %s ", (teamId, )))

    if check_badge_exist(badgeRows, 0) == False:
        rows = util.fetch_all_json(
            db_manager.query(
                "SELECT COUNT(game_id) as game_num "
                "FROM GAME_INFO "
                "WHERE "
                "team_id = %s", (teamId, )))
        if rows[0]['game_num'] >= 10:
            reward_badge(data, 0)

    if check_badge_exist(badgeRows, 2) == False:
        if data['text'] == static.GAME_COMMAND_EXIT:
            reward_badge(data, 2)

    if check_badge_exist(badgeRows, 3) == False:
        rows = util.fetch_all_json(
            db_manager.query(
                "SELECT COUNT(game_id) as game_num "
                "FROM GAME_INFO "
                "WHERE "
                "team_id = %s", (teamId, )))
        if rows[0]['game_num'] >= 200:
            reward_badge(data, 3)

    return 0
def start_kok(data, round):

    slackApi = util.init_slackapi(data['team_id'])
    channelId = data['channel']
    teamLang = util.get_team_lang(data['team_id'])

    game_id = redis_client.get('kokgame_id_' + channelId)
    users = redis_client.hgetall('kokusers_' + game_id)

    print(users)
    userString = ""
    count = 0
    for key, value in users.items():
        if value == "1":
            userString += "<@" + key + ">  "
            count += 1

    if count <= 1:
        slackApi.chat.postMessage({
            'channel':
            data['channel'],
            'text':
            "*King of the Keyboard* : :crown: " + userString + " :crown:"
        })

        redis_client.set('kokstatus_' + data["channel"], "0")
        redis_client.set('game_mode_' + channelId, "0")
        return

    slackApi.chat.postMessage({
        'channel':
        data['channel'],
        'text':
        static.getText(static.CODE_TEXT_KOK_ROUND, teamLang) %
        (round, userString)
    })

    data['mode'] = "kok"

    if round == 1:
        time.sleep(2)
    else:
        time.sleep(4)
    command_start(data, round)
    """
    app.logger.info("rtm status : " + str(rtm_manager.is_socket_opened(teamId)))
    if rtm_manager.is_socket_opened(teamId) != static.SOCKET_STATUS_IDLE:
        redis_client.hset('rtm_status_'+teamId, 'expire_time', time.time() + static.SOCKET_EXPIRE_TIME)
        redis_client.set("status_" + data["channel"], static.GAME_STATE_LOADING),

        print('start')
        worker.delay(data)
    else:            
        rtm_manager.open_new_socket(teamId, data)
    """
    return 0
def command_rank(data):

    teamId = data["team_id"]
    teamLang = util.get_team_lang(teamId)
    channelId = data['channel']
    slackApi = util.init_slackapi(teamId)
    print('rank_data' + str(data))

    # 내 게임 결과들 가져오기
    result = db_manager.query(
        "SELECT user_id, MAX(score) as max_score, AVG(score) as avg_score, AVG(score) as recent_score "
        "FROM GAME_RESULT "
        "WHERE game_id in ( "
        "SELECT GAME_INFO.game_id "
        "FROM GAME_INFO "
        "WHERE "
        "GAME_INFO.channel_id = %s "
        ") "
        "GROUP BY GAME_RESULT.user_id "
        "order by avg_score DESC; ", (channelId, ))

    rows = util.fetch_all_json(result)

    # 출력할 텍스트 생성
    result_string = ""
    rank = 1

    for row in rows:
        result_string = result_string + (
            static.getText(static.CODE_TEXT_RANK_FORMAT_3, teamLang) %
            (pretty_rank(rank), "*" +
             str(get_user_info(slackApi, row["user_id"])["user"]["name"]) +
             "*", pretty_score(row["max_score"]), pretty_score(
                 row["avg_score"]), pretty_score(row["avg_score"])))
        rank = rank + 1

        # 10위 까지만 출력
        if (rank == 11):
            break

    slackApi.chat.postMessage({
        "channel":
        channelId,
        "text":
        static.getText(static.CODE_TEXT_RANK, teamLang),
        'as_user':
        '******',
        "attachments":
        json.dumps([{
            "title": static.getText(static.CODE_TEXT_RECORD, teamLang),
            "text": result_string,
            "mrkdwn_in": ["text", "pretext"],
            "color": "#764FA5"
        }])
    })
def command_exit(data):
    teamId = data["team_id"]
    teamLang = util.get_team_lang(teamId)
    channelId = data['channel']

    slackApi = util.init_slackapi(teamId)

    redis_client.set("status_" + channelId, static.GAME_STATE_IDLE)
    redis_client.set("game_mode" + channelId, "0")
    redis_client.set('kokstatus_' + data["channel"], "0")
    sendMessage(slackApi, channelId,
                static.getText(static.CODE_TEXT_GAME_DONE, teamLang))

    badge_manager.calc_badge(data)
def command_score(data):
    teamId = data["team_id"]
    teamLang = util.get_team_lang(teamId)
    channelId = data['channel']
    slackApi = util.init_slackapi(teamId)

    # 게임 결과들 가져오기

    result = db_manager.query(
        "SELECT * from GAME_RESULT "
        "RESULT inner join GAME_INFO INFO "
        "on INFO.game_id = RESULT.game_id "
        "inner join USER U "
        "on U.user_id = RESULT.user_id "
        "WHERE INFO.channel_id = %s "
        "ORDER BY score desc;", (channelId, ))

    rows = util.fetch_all_json(result)

    result_string = ""
    rank = 1
    for row in rows:
        logger_celery.info(row)
        result_string = result_string + (
            static.getText(static.CODE_TEXT_RANK_FORMAT_2, teamLang) %
            (pretty_rank(rank), "*" +
             str(get_user_info(slackApi, row["user_id"])["user"]["name"]) +
             "*", pretty_score(row["score"]), row["answer_text"]))
        rank = rank + 1

        # 10위 까지만 출력
        if (rank == 11):
            break

    slackApi.chat.postMessage({
        "channel":
        channelId,
        "text":
        static.getText(static.CODE_TEXT_SCORE, teamLang),
        'as_user':
        '******',
        "attachments":
        json.dumps([{
            "title": static.getText(static.CODE_TEXT_RECORD, teamLang),
            "text": result_string,
            "mrkdwn_in": ["text", "pretext"],
            "color": "#764FA5"
        }])
    })
示例#7
0
def slack_game_lang():
    payload = request.get_data().decode()
    print(payload)

    slackApi = util.init_slackapi(request.form.get('team_id'))
    teamLang = util.get_team_lang(request.form.get('team_id'))

    slackApi.chat.postMessage({
        'channel':
        request.form.get('channel_id'),
        'text':
        static.getText(static.CODE_TEXT_BUTTON_LANG, teamLang),
        'attachments':
        json.dumps([{
            "text":
            "",
            "fallback":
            "fallbacktext",
            "callback_id":
            "wopr_game",
            "color":
            "#3AA3E3",
            "attachment_type":
            "default",
            "actions": [{
                "name": "lang_en",
                "text": ":us: English",
                "type": "button",
                "value": "lang_en"
            }, {
                "name": "lang_kr",
                "text": ":kr: 한국어",
                "type": "button",
                "value": "lang_kr"
            }]
        }])
    })

    response = Response(json.dumps({
        'response_type': 'in_channel',
        'text': ''
    }))
    response.headers['Content-type'] = 'application/json'
    return response
def reward_badge(data, badgeId):
    teamId = data["team_id"]
    teamLang = util.get_team_lang(teamId)
    channelId = data['channel']
    slackApi = util.init_slackapi(teamId)

    db_manager.query(
        "INSERT INTO TEAM_BADGE "
        "(`team_id`, `badge_id`) "
        "VALUES "
        "(%s, %s)", (teamId, badgeId))

    time.sleep(1)
    slackApi.chat.postMessage({
        'channel':
        channelId,
        'text':
        static.getText(static.CODE_TEXT_NEW_BADGE, teamLang),
        'attachments':
        json.dumps([{
            "text":
            static.getText(static.CODE_TEXT_TEAM_BADGES[badgeId], teamLang),
            "fallback":
            "fallbacktext",
            "callback_id":
            "wopr_game",
            "color":
            "#3AA3E3",
            "attachment_type":
            "default"
        }])
    })

    if badgeId == 0:
        time.sleep(3)
        slackApi.chat.postMessage({
            'channel':
            channelId,
            'text':
            static.getText(static.CODE_TEXT_GAME_REVIEW, teamLang)
        })

    return 0
示例#9
0
def slack_game_pvp():
    payload = request.get_data().decode()
    print(payload)

    slackApi = util.init_slackapi(request.form.get('team_id'))
    teamLang = util.get_team_lang(request.form.get('team_id'))

    channelId = request.form.get('channel_id')
    text = request.form.get('text')
    text = text.replace('@', '')

    slackApi.chat.postMessage({
        'channel': channelId,
        'text': 'pvp with other user'
    })

    response = Response(json.dumps({
        'response_type': 'in_channel',
        'text': ''
    }))
    response.headers['Content-type'] = 'application/json'
    return response
示例#10
0
def command_kok(data):
    teamId = data["team_id"]
    teamLang = util.get_team_lang(teamId)
    channelId = data['channel']
    slackApi = util.init_slackapi(teamId)

    if not is_channel_has_bot(teamId, channelId):
        redis_client.set("status_" + channelId, static.GAME_STATE_IDLE)

        slackApi.chat.postMessage({
            "channel":
            channelId,
            "text":
            static.getText(static.CODE_TEXT_BOT_NOTFOUND, teamLang),
            'as_user':
            '******',
            "attachments":
            json.dumps([{
                "text":
                static.getText(static.CODE_TEXT_INVITE_BOT, teamLang),
                "fallback":
                "fallbacktext",
                "callback_id":
                "wopr_game",
                "color":
                "#FF2222",
                "attachment_type":
                "default",
                "actions": [{
                    "name":
                    "invite_bot",
                    "text":
                    static.getText(static.CODE_TEXT_INVITE, teamLang),
                    "type":
                    "button",
                    "value":
                    "invite_bot",
                    "confirm": {
                        "title":
                        static.getText(static.CODE_TEXT_INVITE_ASK, teamLang),
                        "text":
                        static.getText(static.CODE_TEXT_CAN_REMOVE, teamLang),
                        "ok_text":
                        static.getText(static.CODE_TEXT_OPTION_INVITE,
                                       teamLang),
                        "dismiss_text":
                        static.getText(static.CODE_TEXT_OPTION_LATER,
                                       teamLang),
                    }
                }]
            }])
        })
        return

    game_id = str(util.generate_game_id())

    redis_client.hset("kokusers_" + game_id, data['user'], "1")
    result = slackApi.chat.postMessage({
        'channel':
        channelId,
        'text':
        static.getText(static.CODE_TEXT_KOK_TITLE, teamLang) % ("")
    })

    result2 = slackApi.chat.postMessage({
        'channel':
        channelId,
        'text':
        "",
        'attachments':
        json.dumps([{
            "text":
            static.getText(static.CODE_TEXT_KOK_ENTRY, teamLang) %
            ("<@" + data['user'] + ">"),
            "fallback":
            "fallbacktext",
            "callback_id":
            "wopr_game",
            "color":
            "#FF2222",
            "attachment_type":
            "default",
            "actions": [{
                "name": "kok_join",
                "text": ":dagger_knife: Join",
                "type": "button",
                "value": "kok_join"
            }]
        }])
    })

    redis_client.set('kokgame_id_' + channelId, game_id)
    redis_client.set('game_mode_' + channelId, 'kok')
    redis_client.set('kokmsg_' + channelId, result2['ts'])

    for i in range(1, 20):
        slackApi.chat.update({
            'channel':
            channelId,
            'ts':
            result['ts'],
            'text':
            static.getText(static.CODE_TEXT_KOK_TITLE, teamLang) %
            (str(20 - i) + "s")
        })
        time.sleep(1)

    if teamLang == "kr":
        slackApi.chat.update({
            'channel':
            channelId,
            'ts':
            result['ts'],
            'text':
            static.getText(static.CODE_TEXT_KOK_TITLE, teamLang) % ("timeout!")
        })
    else:
        slackApi.chat.update({
            'channel':
            channelId,
            'ts':
            result['ts'],
            'text':
            static.getText(static.CODE_TEXT_KOK_TITLE, teamLang) % ("게임 끝!")
        })

    users = redis_client.hgetall('kokusers_' + game_id)

    print(users)
    userString = ""
    for key, value in users.items():
        if value == "1":
            userString += "<@" + key + ">  "
    slackApi.chat.update({
        'channel':
        channelId,
        'text':
        "",
        'ts':
        result2['ts'],
        'attachments':
        json.dumps([{
            "text":
            static.getText(static.CODE_TEXT_KOK_ENTRY, teamLang) %
            (userString),
            "fallback":
            "fallbacktext",
            "callback_id":
            "wopr_game",
            "color":
            "#FF2222",
            "attachment_type":
            "default",
        }])
    })

    start_kok(data, 1)
示例#11
0
def run(data):
    logger_celery.info(data)
    print("celery data : " + str(data))

    teamId = data["team_id"]
    channelId = data['channel']
    teamLang = util.get_team_lang(teamId)

    if teamLang is None:
        redis_client.set("status_" + channelId, static.GAME_STATE_IDLE)

        slackApi = util.init_slackapi(teamId)

        slackApi.chat.postMessage({
            'channel':
            channelId,
            'text':
            static.getText(static.CODE_TEXT_CHOOSE_LANG, "en"),
            'attachments':
            json.dumps([{
                "text":
                "",
                "fallback":
                "fallbacktext",
                "callback_id":
                "wopr_game",
                "color":
                "#3AA3E3",
                "attachment_type":
                "default",
                "actions": [{
                    "name": "lang_en",
                    "text": ":us: English",
                    "type": "button",
                    "value": "lang_en"
                }, {
                    "name": "lang_kr",
                    "text": ":kr: 한국어",
                    "type": "button",
                    "value": "lang_kr"
                }]
            }])
        })

        return

    if data["text"] == static.GAME_COMMAND_START:  # 게임을 시작함
        command_start(data)
    elif data["text"] == static.GAME_COMMAND_RANK:  # 해당 채널의 유저들의 랭크를 보여줌
        command_rank(data)
    elif data["text"] == static.GAME_COMMAND_SCORE:  # 해당 채널의 최고기록들을 보여줌
        command_score(data)
    elif data["text"] == static.GAME_COMMAND_EXIT:  # 강제로 게임의 상태를 초기화함
        command_exit(data)
    elif data["text"] == static.GAME_COMMAND_MY_SCORE:  # 나의 기록들을 보여줌
        command_myscore(data)
    elif data["text"] == static.GAME_COMMAND_KOK:  # King of the Keyboard 모드
        command_kok(data)
    elif data["text"] == static.GAME_COMMAND_BADGE:  # badge 목록을 보여줌
        command_badge(data)
    else:  # typing 된 내용들
        command_typing(data)
示例#12
0
def command_typing(data):
    teamId = data["team_id"]
    teamLang = util.get_team_lang(teamId)
    channelId = data['channel']
    slackApi = util.init_slackapi(teamId)

    gamemode = redis_client.get('game_mode_' + channelId)
    if gamemode == "kok":
        game_id = redis_client.get('kokgame_id_' + channelId)
        users = redis_client.hgetall('kokusers_' + game_id)

        sw = False
        for key, value in users.items():
            if key == data['user'] and value == "1":
                sw = True
                break

        if sw == False:
            print("=====================================")
            return 0

    # 부정 복사 판단
    if static.CHAR_PASTE_ESCAPE in data['text']:
        sendMessage(slackApi, channelId,
                    static.getText(static.CODE_TEXT_WARNING_PASTE, teamLang))
        return

    #미션일경우.
    if (redis_client.get(static.GAME_MISSION_NOTI_CODE + channelId) != 'None'):
        #리버스 미션일경우.
        if (int(redis_client.get(static.GAME_MISSION_NOTI_CODE +
                                 channelId)) == static.GAME_MISSION_REVERSE):
            logger_celery.info('[MISSION_REVERESE]')
            reverse_text = ''.join(reversed(data["text"]))
            logger_celery.info('[MISSION_REVERESE] ==> user:'******' problem' +
                               redis_client.get("problem_text_" + channelId))
            distance = util.get_edit_distance(
                reverse_text, redis_client.get("problem_text_" + channelId))

        # 랜덤 swap일경우. 원래본문을 swap된것으로 바꿔서 비교한다.
        elif (int(redis_client.get(static.GAME_MISSION_NOTI_CODE +
                                   channelId)) == static.GAME_MISSION_SWAP):
            logger_celery.info('[MISSION_SWAP]')
            pre = redis_client.get(static.GAME_MISSION_SWAP_CHOSUNG +
                                   channelId)
            after = redis_client.get(static.GAME_MISSION_SWAP_AFTER +
                                     channelId)
            distance = util.get_edit_distance_for_swap(
                data["text"], redis_client.get("problem_text_" + channelId),
                pre, after)

        else:
            distance = util.get_edit_distance(
                data["text"], redis_client.get("problem_text_" + channelId))

    else:
        distance = util.get_edit_distance(
            data["text"], redis_client.get("problem_text_" + channelId))

    start_time = redis_client.get("start_time_" + channelId)
    current_time = time.time() * 1000
    elapsed_time = (current_time - float(start_time)) * 1000

    game_id = redis_client.get("game_id_" + channelId)

    # 점수 계산
    speed = round(util.get_speed(data["text"], elapsed_time), 3)
    problem_text = redis_client.get("problem_text_" + channelId)

    accuracy = round(
        util.get_accuracy(max([data['text'], problem_text], key=len),
                          distance), 3)
    score = util.get_score(speed, accuracy)
    accuracy = accuracy * 100

    logger_celery.info('distance : ' + str(distance))
    logger_celery.info('speed : ' + str(speed))
    logger_celery.info('elapsed_time : ' + str(elapsed_time))
    logger_celery.info('accur : ' + str(accuracy))
    logger_celery.info('text : ' + str(data["text"]))

    result = db_manager.query(
        "SELECT game_id "
        "FROM GAME_RESULT "
        "WHERE "
        "game_id = %s and user_id = %s "
        "LIMIT 1", (game_id, data["user"]))

    rows = util.fetch_all_json(result)
    if len(rows) == 0:

        # 게임 결과 저장
        db_manager.query(
            "INSERT INTO GAME_RESULT "
            "(game_id, user_id, answer_text, score, speed, accuracy, elapsed_time) "
            "VALUES"
            "(%s, %s, %s, %s, %s, %s, %s)",
            (game_id, data["user"], data["text"].encode('utf-8'), score, speed,
             accuracy, elapsed_time))

        user_name = get_user_info(slackApi, data["user"])["user"]["name"]

        try:
            #이후 채널 랭크 업데이트.
            result = db_manager.query(
                "SELECT * , "
                "( "
                "SELECT count(*) "
                "FROM ( "
                "SELECT user_id,avg(score) as scoreAvgUser FROM GAME_RESULT GROUP BY user_id  order by scoreAvgUser desc "
                ") "
                "userScoreTB "
                ") as userAllCnt "
                "FROM ( "
                "SELECT @counter:=@counter+1 as rank ,userScoreTB.user_id,userScoreTB.scoreAvgUser as average "
                "FROM ( "
                " SELECT user_id,avg(score) as scoreAvgUser FROM GAME_RESULT GROUP BY user_id  order by scoreAvgUser desc "
                ") "
                "userScoreTB "
                "INNER JOIN (SELECT @counter:=0) b "
                ") as rankTB where user_id = %s ", (data["user"], ))
            rows = util.fetch_all_json(result)

            userAll = rows[0]["userAllCnt"]
            rank = rows[0]["rank"]
            levelHirechy = rank / userAll * 100

            level = 3
            #100~91
            if levelHirechy > 90:
                level = 1
            #90~71
            elif levelHirechy > 70 and levelHirechy < 91:
                level = 2
            #70~31
            elif levelHirechy > 30 and levelHirechy < 81:
                level = 3
            #30~10
            elif levelHirechy > 10 and levelHirechy < 31:
                level = 4
            #10~0
            elif levelHirechy > -1 and levelHirechy < 11:
                level = 5

            #이후 채널 랭크 업데이트.

            result = db_manager.query(
                "UPDATE USER SET user_level = %s WHERE user_id = %s",
                (level, data["user"]))

        except Exception as e:
            logger_celery.error(str(e))

        try:
            result = db_manager.query(
                "SELECT user_id "
                "FROM USER "
                "WHERE "
                "user_id = %s "
                "LIMIT 1", (data["user"], ))
            rows = util.fetch_all_json(result)

            if len(rows) == 0:

                db_manager.query(
                    "INSERT INTO USER "
                    "(team_id, user_id, user_name) "
                    "VALUES "
                    "(%s, %s, %s) ", (teamId, data["user"], user_name))
        except exc.SQLAlchemyError as e:
            logger_celery.error("[DB] err==>" + str(e))
示例#13
0
def command_myscore(data):
    teamId = data["team_id"]
    teamLang = util.get_team_lang(teamId)
    channelId = data['channel']
    userId = data["user"]
    slackApi = util.init_slackapi(teamId)

    # user_name 가져오기
    user_info = get_user_info(slackApi, userId)
    user_name = user_info['user']['name']

    # 내 게임 결과들 가져오기
    result = db_manager.query(
        "SELECT * , ( "
        "SELECT COUNT(*) + 1 "
        "FROM GAME_RESULT "
        "WHERE "
        "score > a.score and "
        "game_id = a.game_id"
        ") as rank "
        "FROM GAME_RESULT as a "
        "WHERE "
        "user_id = %s order by score desc;", (userId, ))

    rows = util.fetch_all_json(result)

    # 해당 팀의 언어설정 가져오기
    result_team_lang = db_manager.query(
        "SELECT * FROM TEAM "
        "WHERE "
        "team_id = %s;", (teamId, ))

    team_rows = util.fetch_all_json(result_team_lang)
    teamLang = team_rows[0]['team_lang']

    result_myscore_announcements = db_manager.query(
        "SELECT * FROM slackbot.MY_SCORE_ANNOUNCEMENT "
        "WHERE "
        "language = %s;", (teamLang, ))

    myscore_announcements = util.fetch_all_json(result_myscore_announcements)
    myscore_announcement = myscore_announcements[int(
        len(myscore_announcements) * random.random())]['announcement']

    # 출력할 텍스트 생성
    result_string = "Name : " + "*" + user_name + "*" + "\n"
    result_string = result_string + myscore_announcement + "\n"
    rank = 1

    for row in rows:
        result_string = result_string + (
            static.getText(static.CODE_TEXT_RANK_FORMAT_1, teamLang) %
            (pretty_rank(rank), pretty_score(row["score"]),
             pretty_accur(row["accuracy"]), pretty_speed(
                 row["speed"]), " " + pretty_speed(row["rank"]) + " "))
        rank = rank + 1

        # 10위 까지만 출력
        if (rank == 11):
            break

    slackApi.chat.postMessage({
        "channel":
        channelId,
        "text":
        static.getText(static.CODE_TEXT_MY_SCORE, teamLang),
        'as_user':
        '******',
        "attachments":
        json.dumps([{
            "title": static.getText(static.CODE_TEXT_RECORD, teamLang),
            "text": result_string,
            "mrkdwn_in": ["text", "pretext"],
            "color": "#764FA5"
        }])
    })
示例#14
0
def command_start(data, round=0):
    teamId = data["team_id"]
    channelId = data['channel']
    slackApi = util.init_slackapi(teamId)
    teamLang = util.get_team_lang(teamId)

    result = db_manager.query("select *from GAME_INFO where channel_id = %s",
                              (channelId, ))
    rows = util.fetch_all_json(result)

    if len(rows) == 0:
        #게임 카운터를 1로 설정한다.
        redis_client.set(static.GAME_MANAGER_PLAY_COUNTER + channelId, '1')

    logger_celery.info('start')

    if not is_channel_has_bot(teamId, channelId):
        redis_client.set("status_" + channelId, static.GAME_STATE_IDLE)
        #게임 카운터를 1로 설정한다.
        redis_client.set(static.GAME_MANAGER_PLAY_COUNTER + channelId, '1')
        print("First !! =>" +
              redis_client.get(static.GAME_MANAGER_PLAY_COUNTER + channelId))

        slackApi.chat.postMessage({
            "channel":
            channelId,
            "text":
            static.getText(static.CODE_TEXT_BOT_NOTFOUND, teamLang),
            'as_user':
            '******',
            "attachments":
            json.dumps([{
                "text":
                static.getText(static.CODE_TEXT_INVITE_BOT, teamLang),
                "fallback":
                "fallbacktext",
                "callback_id":
                "wopr_game",
                "color":
                "#3AA3E3",
                "attachment_type":
                "default",
                "actions": [{
                    "name":
                    "invite_bot",
                    "text":
                    static.getText(static.CODE_TEXT_INVITE, teamLang),
                    "type":
                    "button",
                    "value":
                    "invite_bot",
                    "confirm": {
                        "title":
                        static.getText(static.CODE_TEXT_INVITE_ASK, teamLang),
                        "text":
                        static.getText(static.CODE_TEXT_CAN_REMOVE, teamLang),
                        "ok_text":
                        static.getText(static.CODE_TEXT_OPTION_INVITE,
                                       teamLang),
                        "dismiss_text":
                        static.getText(static.CODE_TEXT_OPTION_LATER,
                                       teamLang),
                    }
                }]
            }])
        })
        return

    redis_client.set("status_" + channelId, static.GAME_STATE_STARTING)

    # 채널 정보가 DB에 있는지 SELECT문으로 확인 후 없으면 DB에 저장
    result = db_manager.query(
        "SELECT * FROM slackbot.CHANNEL WHERE slackbot.CHANNEL.channel_id = %s;",
        (data['channel'], ))

    # DB에 채널 정보가 없다면
    if (result.fetchone() is None):

        ctime = datetime.datetime.now()

        # 채널 이름 가져오기
        channel_list = get_channel_list(slackApi)
        logger_celery.info(channel_list)
        channels = channel_list['channels']
        channel_name = ""
        for channel_info in channels:
            # id가 같으면 name을 가져온다/
            if (channel_info['id'] == data['channel']):
                channel_name = channel_info['name']

        try:
            db_manager.query(
                "INSERT INTO CHANNEL"
                "(team_id, channel_id, channel_name, channel_joined_time)"
                "VALUES"
                "(%s, %s, %s, %s);",
                (teamId, data['channel'], channel_name, ctime))

            result = db_manager.query("SELECT * from PROBLEM")

            rows = util.fetch_all_json(result)

            arrQueryString = []
            arrQueryString.append(
                'INSERT INTO CHANNEL_PROBLEM (channel_id,problem_id) values ')

            for row in rows:
                arrQueryString.append('("' + data['channel'] + '","' +
                                      str(row['problem_id']) + '")')
                arrQueryString.append(',')

            arrQueryString.pop()
            lastQuery = "".join(arrQueryString)

            result = db_manager.query(lastQuery)
        except Exception as e:
            logger_celery.error('error : ' + str(e))

    #만약 미션이 선택되었다면?!
    #미션에해당하는 멘트들을 가져오고 해당 멘트를 레디스에서 긁어와서 메시지로 뿌려준다.
    if (mission_manager.pickUpGameEvent(data['channel'],
                                        teamId) == static.GAME_TYPE_MISSION):
        logger_celery.info('[MISSION]==>START!')
        sendMessage(
            slackApi, channelId,
            redis_client.get(static.GAME_MISSION_NOTI + data['channel']))
        logger_celery.info('[MISSION_CONDI_inREDSI]==> ' +
                           static.GAME_MISSION_CONDI + data['channel'])
        # print(redis_client.get(static.GAME_MISSION_CONDI+data['channel']))

        # 문제들 가져오기
    texts = util.get_problems(teamLang)
    logger_celery.info('[LANG_TEAM]==> ' + teamLang)

    # 문제 선택하기
    problem_id = get_rand_game(data['channel'], teamLang)
    logger_celery.info('[problem_id]==> ' + str(problem_id))
    problem_text = texts[problem_id]
    #미션인지확인하고,
    if (redis_client.get(static.GAME_MISSION_NOTI_CODE + channelId) != 'None'):
        # 랜덤 초이스인경우엔

        if (int(redis_client.get(static.GAME_MISSION_NOTI_CODE +
                                 channelId)) == static.GAME_MISSION_SWAP):
            randomChar = mission_manager.mission_swap_get_Random_Chosung(
                problem_text, channelId, teamLang)
            sendMessage(
                slackApi, channelId,
                mission_manager.mission_swap_get_options_centence(
                    randomChar, channelId, teamLang))

    titleResponse = sendMessage(slackApi, channelId,
                                util.get_start_centence(teamLang))
    # sendMessage(slackApi, channelId, util.get_start_centence(teamLang))

    response = sendMessage(slackApi, channelId,
                           static.getText(static.CODE_TEXT_COUNT_1, teamLang))

    text_ts = response['ts']
    title_ts = titleResponse['ts']

    time.sleep(1)
    strs = [
        static.getText(static.CODE_TEXT_COUNT_2, teamLang),
        static.getText(static.CODE_TEXT_COUNT_3, teamLang)
    ]
    logger_celery.info('strs => ' + str(strs))
    for i in range(0, 2):
        slackApi.chat.update({
            "ts": text_ts,
            "channel": channelId,
            "text": strs[i],
            'as_user': '******'
        })
        time.sleep(1.0)

    slackApi.chat.update({
        "ts":
        text_ts,
        "channel":
        channelId,
        "text":
        static.getText(static.CODE_TEXT_SUGGEST_PROBLEM, teamLang) %
        (static.CHAR_PASTE_ESCAPE.join(problem_text)),
        'as_user':
        '******'
    })

    redis_client.set("status_" + channelId,
                     static.GAME_STATE_PLAYING)  # 현재 채널 상태 설정
    redis_client.set(
        "start_time_" + channelId,
        time.time() * 1000,
    )  # 시작 시간 설정
    redis_client.set("problem_text_" + channelId, problem_text)  # 해당 게임 문자열 설정
    redis_client.set("problem_id_" + channelId, problem_id)  # 해당 게임 문자열 설정
    redis_client.set("game_id_" + channelId,
                     util.generate_game_id())  # 현재 게임의 ID

    #threading.Timer(10, game_end, [slackApi, teamId, channelId, title_ts]).start()
    timeout = util.get_time(problem_text)
    for i in range(1, timeout):
        stTime = time.time()
        slackApi.chat.update({
            "ts":
            title_ts,
            "channel":
            channelId,
            "text":
            static.getText(static.CODE_TEXT_START_GAME_COUNT, teamLang) %
            (str(timeout - i)),
            'as_user':
            '******'
        })
        if time.time() - stTime <= 1:
            time.sleep(1 - (time.time() - stTime))

    slackApi.chat.update({
        "ts":
        title_ts,
        "channel":
        channelId,
        "text":
        static.getText(static.CODE_TEXT_START_GAME_END, teamLang),
        'as_user':
        '******'
    })
    game_end(slackApi, data, round)
示例#15
0
def slack_event_btn():
    payload = json.loads(request.form.get('payload'))
    channelId = payload['channel']['id']
    teamId = payload['team']['id']
    teamLang = util.get_team_lang(teamId)
    slackApi = util.init_slackapi(teamId)

    app.logger.info("btn callback" + str(payload))

    if payload['actions'][0]['name'] == 'invite_bot':

        if channelId[0] == "G":  # private channel
            slackApi.groups.invite({
                'channel': channelId,
                'user': util.get_bot_id(teamId)
            })
        else:  # public channel
            slackApi.channels.invite({
                'channel': channelId,
                'user': util.get_bot_id(teamId)
            })
    elif payload['actions'][0]['name'] == 'lang_en':

        db_manager.query(
            "UPDATE TEAM "
            "SET "
            "team_lang = %s "
            "WHERE "
            "team_id = %s ", ("en", teamId))

        slackApi.chat.postMessage({
            'channel':
            channelId,
            'text':
            static.getText(static.CODE_TEXT_LANG_CHANGED, "en"),
            'as_user':
            '******'
        })
    elif payload['actions'][0]['name'] == 'lang_kr':

        db_manager.query(
            "UPDATE TEAM "
            "SET "
            "team_lang = %s "
            "WHERE "
            "team_id = %s ", ("kr", teamId))

        slackApi.chat.postMessage({
            'channel':
            channelId,
            'text':
            static.getText(static.CODE_TEXT_LANG_CHANGED, "kr"),
            'as_user':
            '******'
        })
    elif payload['actions'][0]['name'] == 'kok_join':
        ts = redis_manager.redis_client.get('kokmsg_' + channelId)
        game_id = redis_manager.redis_client.get('kokgame_id_' + channelId)

        redis_manager.redis_client.hset('kokusers_' + game_id,
                                        payload['user']['id'], "1")
        users = redis_manager.redis_client.hgetall('kokusers_' + game_id)

        print(users)
        userString = ""
        for key, value in users.items():
            if value == "1":
                userString += "<@" + key + ">  "
        slackApi.chat.update({
            'channel':
            channelId,
            'text':
            "",
            'ts':
            ts,
            'attachments':
            json.dumps([{
                "text":
                static.getText(static.CODE_TEXT_KOK_ENTRY, teamLang) %
                (userString),
                "fallback":
                "fallbacktext",
                "callback_id":
                "wopr_game",
                "color":
                "#FF2222",
                "attachment_type":
                "default",
                "actions": [{
                    "name": "kok_join",
                    "text": ":dagger_knife: Join",
                    "type": "button",
                    "value": "kok_join"
                }]
            }])
        })

    return ''