Skip to content

Instantly share code, notes, and snippets.

@JSpiner
Last active November 21, 2016 12:28
Show Gist options
  • Save JSpiner/012784e6c31941a4aee26316fc66cf46 to your computer and use it in GitHub Desktop.
Save JSpiner/012784e6c31941a4aee26316fc66cf46 to your computer and use it in GitHub Desktop.
# 해당하는 팀과의 소켓을 연결함
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