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" }]) })
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
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
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)
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)
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))
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" }]) })
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)
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 ''