Last active
November 21, 2016 12:28
-
-
Save JSpiner/012784e6c31941a4aee26316fc66cf46 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 해당하는 팀과의 소켓을 연결함 | |
def open_socket(teamId, data): | |
redis_manager.redis_client.hset('rtm_status_'+teamId, 'status', SOCKET_STATUS_CONNECTING) | |
redis_manager.redis_client.hset('rtm_status_'+teamId, 'expire_time', time.time() + SOCKET_EXPIRE_TIME) | |
result = db_manager.query( | |
"SELECT team_bot_access_token " | |
"FROM TEAM " | |
"WHERE " | |
"team_id = %s " | |
"LIMIT 1", | |
(teamId, ) | |
) | |
bot_token = util.fetch_all_json(result)[0]['team_bot_access_token'] | |
_connect(teamId, bot_token, data) | |
# 스스로 정해진 시간이 지나면 소켓 연결을 해제함 | |
def _timeout(teamId): | |
while True: | |
# 최소 대기시간만큼 sleep 후 expire를 다시 체크함 | |
time.sleep(SOCKET_EXPIRE_TIME) | |
expireTime = float(redis_manager.redis_client.hget('rtm_status_'+teamId, 'expire_time')) | |
if expireTime < time.time(): | |
print("done") | |
global isRemainTime | |
isRemainTime = False | |
break | |
# 해당하는 팀과의 소켓을 연결함 | |
def _connect(teamId, bot_token, data): | |
timeoutThread = threading.Thread(target=_timeout, args=(teamId,)) | |
timeoutThread.start() | |
global isRemainTime | |
# socket을 연결하고 필요한 데이터를 message queue 를 통해 전달함 | |
sc = SlackClient(bot_token) | |
if sc.rtm_connect(): | |
print("connected! : " + teamId) | |
redis_manager.redis_client.hset('rtm_status_'+teamId, 'status', SOCKET_STATUS_CONNECTED) | |
redis_manager.redis_client.hset('rtm_status_'+teamId, 'expire_time', time.time() + SOCKET_EXPIRE_TIME) | |
worker.delay(data) | |
while isRemainTime: | |
response = sc.rtm_read() | |
def get_edit_distance(string1, string2): | |
# 주어진 문장을 초성 종성 중성으로 분리한다. | |
s1 = split_character(string1) | |
s2 = split_character(string2) | |
# 다이나믹에 사용될 n*n 배열을 생성한다. | |
d = [[0 for col in range(len(s2) + 1)] for row in range(len(s1) + 1)] | |
for i in range(0, len(s1) + 1): | |
d[i][0] = i | |
for i in range(0, len(s2) + 1): | |
d[0][i] = i | |
for i in range(1, len(s1) + 1): | |
for j in range(1, len(s2) + 1): | |
# 만약 현재 위치의 문자열이 같다면 | |
if s1[i - 1] == s2[j - 1]: | |
# 거리값을 그대로 유지한다. | |
d[i][j] = d[i - 1][j - 1] | |
else: | |
# 가장 낮았던 거리값에 1을 추가해 사용한다. | |
d[i][j] = min([d[i - 1][j - 1] + 1, d[i][j - 1] + 1, d[i - 1][j] + 1]) | |
return d[len(s1)][len(s2)] | |
#미션을 클리어했는지 확인하는 함수이다. | |
def is_mission_clear(channel_id,game_id): | |
logger_celery.info('[MISSION]==>mission clear check') | |
logger_celery.info('[MISSION_channel_id]==>'+str(channel_id)) | |
logger_celery.info('[MISSION_game_id]==>'+str(game_id)) | |
#글로벌하게쓰일 배열하나를 정한다. | |
global arr_cond_oper | |
arr_cond_oper = [] | |
#조건을 레디스에서 받아온다. | |
mission_condi = json.loads(redis_client.get(static.GAME_MISSION_CONDI+channel_id)); | |
logger_celery.info('[MISSION_CONDI]==>'+str(mission_condi)) | |
result = db_manager.query( | |
"select * from GAME_INFO as gi inner join GAME_RESULT as gr on gi.game_id = gr.game_id where gi.game_id = %s", | |
(game_id,) | |
) | |
rows = util.fetch_all_json(result) | |
user_num = len(rows) | |
mission_success_num = 0 | |
#총 참여인원이 모자라라서 미션을 하지못한 경우이다. | |
if(check_enter_member(mission_condi,user_num)==False): | |
#인원 부족한 상태를 반환한다. | |
return static.GAME_MISSION_ABSENT | |
else: | |
logger_celery.info('[MISSION_RESULT]==> Enough member') | |
#미션조건으로부터 연산 조건을 뽑아와 arr_cond_oper에 넣는다. | |
check_conditions(mission_condi) | |
for row in rows: | |
#해당유저가 미션을 성공했는지 확인을한다. | |
chcked_user = checking_user(row,mission_condi) | |
#미션성공시+1 을 해준다. | |
if(chcked_user == True): | |
mission_success_num = mission_success_num + 1 | |
logger_celery.info('[MISSION_RESULT_success_num]==> '+str(mission_success_num)) | |
#만약 미션성공 판닪마수에서 True가오면 미션이성공이게된다. | |
if(check_nec_member(mission_condi,mission_success_num,user_num)==True): | |
return static.GAME_MISSION_SUC | |
else: | |
return static.GAME_MISSION_FAILE | |
#유저가 게임을 통과했는지 판단하는 함수. | |
def checking_user(row,mission_condi): | |
oper_score = arr_cond_oper[0] | |
oper_accuracy = arr_cond_oper[1] | |
oper_speed = arr_cond_oper[2] | |
condition = mission_condi['codition'] | |
options = condition['value'] | |
#기본 모두 트루.하나라도 거짓이면 조건에 만족하지 못한것임으로 미션 실패이다. | |
is_score_suc = True | |
is_accur_suc = True | |
is_speed_suc = True | |
#SCORE!!! | |
if(oper_score!='dc'): | |
# (미션조건 값, 비교구문, 유저값)이 들어간다. | |
is_score_suc = compare(options['score'],oper_score,row['score']) | |
#accuracy!!! | |
if(oper_accuracy!='dc'): | |
# (미션조건 값, 비교구문, 유저값)이 들어간다. | |
is_accur_suc = compare(options['accuracy'],oper_accuracy,row['accuracy']) | |
#SPEED!!! | |
if(oper_speed!='dc'): | |
# (미션조건 값, 비교구문, 유저값)이 들어간다. | |
is_speed_suc = compare(options['speed'],oper_speed,row['speed']) | |
#여기서 해당유저가 조건에 모두 맞게 랭킹을 먹었는지를 확인한다. | |
if(is_score_suc == True and is_speed_suc == True and is_accur_suc == True): | |
logger_celery.info('[MISSION_RESULT]==> '+str(row['user_id'])+'==> missino success') | |
return True | |
else: | |
logger_celery.info('[MISSION_RESULT]==> '+str(row['user_id'])+'==> missino fail') | |
return False | |
#유저 값과, 미션요구사항 값이 비교하는 로직. | |
def compare(mission_val,comp,user_val): | |
if(comp == 'upper'): | |
if(user_val>mission_val): | |
return True | |
else: | |
return False | |
elif(comp == 'same'): | |
if(user_val==mission_val): | |
return True | |
else: | |
return False | |
elif(comp == 'lower'): | |
if(user_val<mission_val): | |
return True | |
else: | |
return False | |
#미션이 어떤 조건인지 받아오는 함수이다. | |
#옵션 작동 배열에 조건에필요한 것들을 받아온다. | |
def check_conditions(mission_condi): | |
condition = mission_condi['codition'] | |
options = condition['options'] | |
score_opt = options['score_opt'] | |
accuracy_opt = options['accuracy_opt'] | |
speed_opt = options['speed_opt'] | |
arr_cond_oper.append(score_opt) | |
arr_cond_oper.append(accuracy_opt) | |
arr_cond_oper.append(speed_opt) | |
#조건을 만족하는 사람의수. | |
#최종 조건이된다. 그리고 이 조건은 모두/ 일경우혹은 nec_member보다 크거나 같을경우에만 성립되도록 설정한다. | |
def check_nec_member(mission_condi,checked_user,user_num): | |
condition = mission_condi['codition'] | |
options = condition['options'] | |
nec_member = options['nec_member'] | |
#모든 멤버가 참여해야만 하는 미션이다. | |
if(nec_member == "all"): | |
logger_celery.info('[MISSION_RESULT]==> '+'all member necc') | |
#성공한 유저가 모든멤버수 같으면 성공이다. | |
if(checked_user == user_num): | |
logger_celery.info('[MISSION_RESULT]==> all Member sucess '+str(user_num)+"명"); | |
return True | |
else: | |
logger_celery.info('[MISSION_RESULT]==> all Member faile'+str(user_num)+"명"); | |
return False | |
else: | |
#성공한유저가 필수멤버보다 많다면 서공이다. | |
if(checked_user>=nec_member): | |
logger_celery.info('[MISSION_RESULT]==> necc Member success'+str(user_num)+"/"+str(nec_member)); | |
return True | |
else: | |
logger_celery.info('[MISSION_RESULT]==> necc Member fail'+str(user_num)+"/"+str(nec_member)); | |
return False | |
#미션조건과 유저수를 받아 최초 참석 유저수가 조건에 부합한지를 판단한다. | |
def check_enter_member(mission_condi,user_num): | |
enter_members = mission_condi['enter_members'] | |
enter_members_opt = mission_condi['enter_members_opt'] | |
#유저 조건이 초과이고, 실제참여멤버가 조건보다 높으면 true를 반환한다. | |
if(enter_members_opt == 'upper' and user_num>enter_members): | |
return True | |
elif(enter_members_opt == 'upper' and user_num<enter_members): | |
return False | |
#유저 조건이 미만이고, 실제참여멤버가 조건보다 낮으면 true를 반환한다. | |
elif(enter_members_opt == 'lower' and user_num<enter_members): | |
return True | |
elif(enter_members_opt == 'lower' and user_num>enter_members): | |
return False | |
#유저 조건이 같다이고, 실제참여멤버가 조건과 같으면 true를 반환한다. | |
elif(enter_members_opt == 'same' and user_num==enter_members): | |
return True | |
elif(enter_members_opt == 'same' and user_num!=enter_members): | |
return False |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment