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())
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)
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)
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)
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
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())
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)
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)
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
def channel(request, strCIUserUID=None): raidUtil = RaidUtility() userHost = raidUtil.getUserByCIUSerUID(strCIUserUID=strCIUserUID) return render(request, "chat/channel.html", locals())