Exemplo n.º 1
0
def ciuserViewer(request, strCIUserUID=None):
    raidUtil = RaidUtility()
    intRaidPV = 0
    userHost = raidUtil.getUserByCIUSerUID(strCIUserUID=strCIUserUID)
    if userHost is not None:
        #計算 團隊 PV
        intRaidPV = raidUtil.calculateRaidPV(userHost)
    return render(request, "core/ciuserViewer.html", locals())
Exemplo n.º 2
0
def clearLeader(request):
    #清除領導人結果 字串
    strClearResult = None
    #團隊操作工具
    raidUtil = RaidUtility()
    if request.method == "POST":
        #清除 領導人
        raidUtil.clearLeader(user=request.user)
        #完成字串
        strClearResult = "已完成清除領導人"
    else:
        strClearResult = "只允許 POST 方式設定領導人"
    return JsonResponse({"clear_result": strClearResult}, safe=False)
Exemplo n.º 3
0
def retrieveLstDicFollower(request):
    #取得追隨者結果 字串
    strRetrieveResult = None
    #追隨者 列表
    lstDicFollower = []
    #團隊操作工具
    raidUtil = RaidUtility()
    if request.method == "POST":
        #取得 指定 strCIUserUID
        strCIUserUID = request.POST.get("strCIUserUID", None)
        #目標
        targetUser = None
        #優先查詢 指定user
        if strCIUserUID is not None:
            #若有指定 strCIUserUID 嘗試取得該 指定user
            userSpecified = raidUtil.getUserByCIUSerUID(strCIUserUID)
            if userSpecified is not None:
                #有找到 指定user 則取得 指定user 的追隨者
                targetUser = userSpecified
            else:
                #沒找到 指定user
                strRetrieveResult = "錯誤的 strCIUserUID 無法找到 指定user"
        elif request.user.is_authenticated():
            #有登入
            targetUser = request.user
        else:
            #沒登入 也沒 指定user
            strRetrieveResult = "必須登入 或 指定 strCIUserUID"
        #開始查詢
        if targetUser is not None:
            qsetCIUserFollower = raidUtil.getQsetFollower(user=targetUser)
            #轉換為 json 物件再回傳
            for ciuserFollower in qsetCIUserFollower:
                dicFollower = {
                    "strAvatarThumbnailUrl":
                    ciuserFollower.avatarThumbnail.url,
                    "strDisplayName": ciuserFollower.strDisplayName,
                    "strCIUserUID": ciuserFollower.strCIUserUID,
                    "intPointVolume": ciuserFollower.intPointVolume
                }
                lstDicFollower.append(dicFollower)
            strRetrieveResult = "完成取得 追隨者"
    else:
        strRetrieveResult = "只允許 POST 方式取得 追隨者"
    return JsonResponse(
        {
            "retrieve_result": strRetrieveResult,
            "lstDicFollower": lstDicFollower
        },
        safe=False)
Exemplo n.º 4
0
def rejectApplication(request):
    #結果 字串
    strResult = None
    if request.method == "POST":
        strQID = request.POST.get("strQID", None)
        #檢查申請人
        strApplicantCIUserUID = request.POST.get("strApplicantCIUserUID", None)
        raidUtil = RaidUtility()
        userApplicant = raidUtil.getUserByCIUSerUID(strApplicantCIUserUID)
        if userApplicant is not None:
            #拒絕申請
            ciuserApplicant = userApplicant.ciuser
            questUtil = QuestUtility()
            questUtil.rejectApplication(ciuserRequest=request.user.ciuser,
                                        strQID=strQID,
                                        ciuserApplicant=ciuserApplicant)
            #完成字串
            strResult = "已完成 拒絕申請"
    else:
        strResult = "只允許 POST 方式操作任務"
    return JsonResponse({"result": strResult}, safe=False)
Exemplo n.º 5
0
 def determineVisitorRole(self, userVisitor, userHost):
     raidUtil = RaidUtility()
     #預設為 路人
     strRole = "role:anonymous"
     #判斷 是否登入
     if userVisitor is not None:
         strRole = "role:ciuser"
         #判斷 是否為追隨者
         qsetCIUserFollower = raidUtil.getQsetFollower(user=userHost)
         for ciuserFollower in qsetCIUserFollower:
             if userVisitor.ciuser.strCIUserUID == ciuserFollower.strCIUserUID:
                 strRole = "role:follower"
                 break
         #判斷 是否為頻道主人
         if userVisitor.ciuser.strCIUserUID == userHost.ciuser.strCIUserUID:
             strRole = "role:host"
         #判斷 是否為領導人
         if raidUtil.isLeaderOrLeaderOfLeader(
                 user=userHost,
                 strLeaderUID=userVisitor.ciuser.strCIUserUID):
             strRole = "role:leader"
     return strRole
Exemplo n.º 6
0
def searchLeader(request):
    #頁面標題
    strPageTitle = "搜尋領導人"
    #form 的 action 目標 url
    strFormActionUrl = "/core/searchLeader/"
    #尋找結果字串
    strSearchResult = None
    #尋找結果
    qsetMatchedCIUser = None
    #團隊操作工具
    raidUtil = RaidUtility()
    if request.method == "POST":
        strKeyword = request.POST.get("strKeyword", None)
        #比對 strDisplayName
        queryObject = Q(strDisplayName__iregex="^.*{strDisplayName}.*$".format(
            strDisplayName=strKeyword))
        #查尋
        qsetMatchedCIUser = CIUser.objects.filter(queryObject)
        #移除自己(user)
        qsetMatchedCIUser = qsetMatchedCIUser.exclude(
            strCIUserUID=request.user.ciuser.strCIUserUID)
        #若已有領導人,移除原有的領導人
        ciuserLeader = request.user.ciuser.leader
        if ciuserLeader is not None:
            qsetMatchedCIUser = qsetMatchedCIUser.exclude(
                strCIUserUID=ciuserLeader.strCIUserUID)
        #移除 該選項的上層領導人有自己(user) 的選項 - 避免領導人無限迴圈
        for matchedCIUser in qsetMatchedCIUser:
            if raidUtil.isLeaderOrLeaderOfLeader(
                    user=matchedCIUser.user,
                    strLeaderUID=request.user.ciuser.strCIUserUID):
                qsetMatchedCIUser = qsetMatchedCIUser.exclude(
                    strCIUserUID=matchedCIUser.strCIUserUID)
        #todo 若更換的對像為 原有領導人的領導人 是否該移除 (再討論)
        strSearchResult = "查尋 {strKeyword} 共找到 {intResultCount} 個用戶".format(
            strKeyword=strKeyword, intResultCount=qsetMatchedCIUser.count())
    else:
        strSearchResult = "請輸入搜尋字串"
    return render(request, "core/searchLeader.html", locals())
Exemplo n.º 7
0
def loadHistoryMessage(request, strCIUserUID=None):
    raidUtil = RaidUtility()
    wsUtil = WebsocketUtility()
    userHost = raidUtil.getUserByCIUSerUID(strCIUserUID=strCIUserUID)
    strLoadResult = None
    lstDicHistoryMessage = []
    if request.method == "POST":
        #排序 舊到新
        qsetCIChatMsgHistory = CIChatMessage.objects.filter(
            strChannelID=strCIUserUID).order_by("dtCreated")
        #保留最新 666 筆
        if qsetCIChatMsgHistory.count() > 666:
            #反轉排序為 新到舊 取得最新 666 筆 id 列表
            lstIdToKeepCIChatMsgHistory = qsetCIChatMsgHistory.reverse(
            )[:666].values_list("id", flat=True)
            #除了這 666 筆 id 以外皆刪除
            qsetCIChatMsgHistory.exclude(
                pk__in=list(lstIdToKeepCIChatMsgHistory)).delete()
        for cichatmsgHistory in qsetCIChatMsgHistory:
            #轉為 json 物件
            dicHistoryMessage = wsUtil.buildWsJsonMessage(
                strRole=cichatmsgHistory.strRole,
                strMsgAlign=cichatmsgHistory.strMessageAlign,
                strMsg=cichatmsgHistory.strMessageContent,
                strVisitorDisplayName=cichatmsgHistory.ciuserSender.
                strDisplayName if cichatmsgHistory.ciuserSender else "路人")
            lstDicHistoryMessage.append(dicHistoryMessage)
        strLoadResult = "完成 讀取頻道歷史訊息"
    else:
        strLoadResult = "只允許 POST 方式 讀取頻道歷史訊息"
    return JsonResponse(
        {
            "load_result": strLoadResult,
            "lstDicHistoryMessage": lstDicHistoryMessage
        },
        safe=False)
Exemplo n.º 8
0
def resetLeader(request):
    #重設領導人結果 字串
    strResetResult = None
    #團隊操作工具
    raidUtil = RaidUtility()
    if request.method == "POST":
        strCIUserUID = request.POST.get("strCIUserUID", None)
        userLeader = raidUtil.getUserByCIUSerUID(strCIUserUID=strCIUserUID)
        #驗證 leader 是否存在 及 leader 是否設定 此用戶 為 leader - 避免領導人無限迴圈
        if userLeader and not raidUtil.isLeaderOrLeaderOfLeader(
                user=userLeader,
                strLeaderUID=request.user.ciuser.strCIUserUID):
            #重設 領導人 並重置 PV 值
            raidUtil.resetLeaderAndPV(user=request.user,
                                      strLeaderUID=strCIUserUID)
            #完成字串
            strResetResult = "已完成重設領導人為 {strLeaderDisplayName}".format(
                strLeaderDisplayName=request.user.ciuser.leader.strDisplayName)
        else:
            #無效的領導人 UID
            strResetResult = "無效的領導人 UID"
    else:
        strResetResult = "只允許 POST 方式設定領導人"
    return JsonResponse({"reset_result": strResetResult}, safe=False)
Exemplo n.º 9
0
 def receive(self, content, **kwargs):
     wsUtil = WebsocketUtility()
     raidUtil = RaidUtility()
     strChannelRoom = kwargs.get("strHostCIUserUID", None)
     strVisitorCIUserUID = content.get("strVisitorCIUserUID", None)
     strType = content.get("strType", None)
     strMsg = content.get("strMsg", None)
     strMsgAlign = content.get("strMsgAlign", None)
     #嘗試取得 使用者 物件
     userVisitor = raidUtil.getUserByCIUSerUID(
         strCIUserUID=strVisitorCIUserUID)
     userHost = raidUtil.getUserByCIUSerUID(
         strCIUserUID=kwargs.get("strHostCIUserUID", None))
     #判斷 造訪者 的角色
     strRole = self.determineVisitorRole(userVisitor, userHost)
     #造訪者 顯示名稱
     strVisitorDisplayName = userVisitor.ciuser.strDisplayName if userVisitor else "路人"
     #系統訊息
     if strType == "type:sys":
         #有新使用者加入頻道
         if strMsg == "ci_ws_established":
             #建構回覆訊息
             strSysRespMsg = "{strVisitorDisplayName} 加入頻道".format(
                 strVisitorDisplayName=strVisitorDisplayName)
             #建構系統訊息
             jsonRespMsg = wsUtil.buildWsJsonMessage(
                 strRole=strRole,
                 strMsgAlign=strMsgAlign,
                 strMsg=strSysRespMsg,
                 strVisitorDisplayName=strVisitorDisplayName)
             #記錄訊息
             CIChatMessage.objects.create(
                 strChannelID=strChannelRoom,
                 ciuserSender=userVisitor.ciuser if userVisitor else None,
                 strMessageContent=strSysRespMsg,
                 strMessageAlign=strMsgAlign,
                 strRole=strRole)
             #廣播訊息至頻道
             self.group_send(strChannelRoom, jsonRespMsg)
     #動作訊息
     elif strType == "type:action":
         pass
     #大喊訊息
     elif strType == "type:yell":
         jsonRespMsg = wsUtil.buildWsJsonMessage(
             strRole=strRole,
             strMsgAlign=strMsgAlign,
             strMsg=strMsg,
             strVisitorDisplayName=strVisitorDisplayName)
         #記錄訊息
         CIChatMessage.objects.create(
             strChannelID=strChannelRoom,
             ciuserSender=userVisitor.ciuser if userVisitor else None,
             strMessageContent=strMsg,
             strMessageAlign=strMsgAlign,
             strRole=strRole)
         #廣播訊息至頻道
         self.group_send(strChannelRoom, jsonRespMsg)
     #密語訊息
     elif strType == "type:whisper":
         pass
     else:
         pass
Exemplo n.º 10
0
def channel(request, strCIUserUID=None):
    raidUtil = RaidUtility()
    userHost = raidUtil.getUserByCIUSerUID(strCIUserUID=strCIUserUID)
    return render(request, "chat/channel.html", locals())