#!/usr/bin/python  
 | 
# -*- coding: utf-8 -*-  
 | 
#  
 | 
##@package  
 | 
#  
 | 
# @todo: 受理HTTP请求  
 | 
#  
 | 
# @author: xdh  
 | 
# @date 2018-6-8 17:10:51  
 | 
# @version 1.0  
 | 
#  
 | 
# @note: 中文必须传utf8,收到的为urlencode内容  .decode('gbk').encode('utf8')  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
from bottle import Bottle, request  
 | 
import logging  
 | 
import requests  
 | 
import urllib  
 | 
import shelve  
 | 
import time  
 | 
from lib import ConfigIniReader  
 | 
import threading  
 | 
  
 | 
requests.packages.urllib3.disable_warnings()  
 | 
  
 | 
# get: request.query.username request.GET.get('username','')  
 | 
# post: request.forms.get('username')  request.POST.get('username')  
 | 
#===============================================================================  
 | 
# @myapp.route('/cool/kk/:name3/:count#\\d+#')  
 | 
# def maybe(name3, count):  
 | 
#===============================================================================  
 | 
  
 | 
myapp = Bottle()  
 | 
  
 | 
voiceInfoDict = shelve.open('voice.db', writeback=False)  
 | 
g_lastCheckTick = 0  
 | 
delCD = int(ConfigIniReader.GetConfig().GetValue('delCD'))  
 | 
outTime = int(ConfigIniReader.GetConfig().GetValue('outTime'))  
 | 
  
 | 
#存储内容 {'playerID_语音唯一ID':[time,Content],..}  
 | 
#post内容 playerID=玩家ID voiceID=语音唯一ID  content=语音内容  appid  
 | 
#dotype  upload、download  
 | 
  
 | 
@myapp.route('/voice/:dotype', method=['POST'])  
 | 
def VoiceSave(dotype):  
 | 
    global voiceInfoDict  
 | 
  
 | 
    getDict = request.POST  
 | 
      
 | 
    #logging.info("request.POST=%s"%(str(dict(getDict))))  
 | 
     
 | 
    playerID = getDict.get("playerID",'')  
 | 
    voiceID = getDict.get("voiceID",'')  
 | 
    content = getDict.get("content","")  
 | 
    #content = urllib.unquote(getDict.get("content",""))  
 | 
      
 | 
    if not playerID or not voiceID:  
 | 
        logging.error("POST未找到参数 playerID=%s,voiceID=%s"%(playerID, voiceID))  
 | 
        return  
 | 
      
 | 
    keyStr = '%s_%s'%(playerID, voiceID)  
 | 
    curTime = int(time.time())  
 | 
      
 | 
    if dotype == 'upload': #存储  
 | 
        saveData = [curTime, content]  
 | 
        voiceInfoDict[keyStr] = saveData  
 | 
        voiceInfoDict.sync()  
 | 
          
 | 
        #logging.info("upload %s-%s-%s"%(playerID, voiceID, saveData))  
 | 
        returnVoiceData= None  
 | 
          
 | 
    elif dotype == 'download':#下载  
 | 
        voiceData=voiceInfoDict.get(keyStr, [])  
 | 
        if not voiceData:  
 | 
            logging.info("download not find voice %s-%s-%s"%(playerID, voiceID, voiceData))  
 | 
            returnVoiceData = {"playerID":playerID, "voiceID":voiceID}  
 | 
        else:  
 | 
            #logging.info("download %s-%s-%s"%(playerID, voiceID, voiceData))  
 | 
            returnVoiceData = {"playerID":playerID, "voiceID":voiceID, "content":voiceData[1]}  
 | 
          
 | 
    else:  
 | 
        logging.error("dotype not in [download, upload] %s-%s-%s"%(playerID, voiceID, dotype))  
 | 
        return  
 | 
      
 | 
    #voiceInfoDict.close()  
 | 
    #触发一次处理旧数据(放最后)  
 | 
    DelOldVoice(curTime)  
 | 
    return returnVoiceData  
 | 
t1 = None  
 | 
def DelOldVoice(tick):  
 | 
    #处理旧数据  
 | 
    global g_lastCheckTick  
 | 
    global t1  
 | 
    if g_lastCheckTick and tick - g_lastCheckTick < delCD:  
 | 
        #半小时处理一次  
 | 
        return  
 | 
    g_lastCheckTick = tick  
 | 
    #新开线程处理删除逻辑,防止数据过大导致回复慢  
 | 
    if t1 and t1.isAlive():  
 | 
        return  
 | 
    #print threading.activeCount()  
 | 
    t1 = threading.Thread(target=__DelOldVoice)  
 | 
    t1.start()  
 | 
    return  
 | 
  
 | 
def __DelOldVoice():  
 | 
    global voiceInfoDict  
 | 
      
 | 
    tick = int(time.time())  
 | 
    for voiceKey, voiceData in voiceInfoDict.items():  
 | 
        saveTime = voiceData[0]  
 | 
        if tick - saveTime > outTime: #删除超过半小时的数据  
 | 
            if voiceInfoDict.pop(voiceKey, 0):  
 | 
                voiceInfoDict.sync()  
 | 
                #logging.info("del old record voiceKey=%s"%voiceKey)  
 | 
    #voiceInfoDict.close()  
 | 
      
 | 
    return 
 |