Exemplo n.º 1
0
class Logic(object):

    #0.初始化
    def __init__(self):
        self.serverList = ServeList()
        self.dbEngine = DBEngine()
        self.groupInit()

    #1.输入是否合法,防止sql注入
    def findBadInput(self, inputstring):

        if '\'' in inputstring:
            return True
        elif '\"' in inputstring:
            return True
        elif '`' in inputstring:
            return True
        elif ' ' in inputstring:
            return True

    #2.初始化群组
    def groupInit(self):
        db_groups = self.dbEngine.get_all_group()
        for db_group in db_groups:
            group = GroupObject(db_group)
            self.serverList.addNewGroup(group)
            self.getGroupMemberWithDB(group)

    #3.重置服务器
    def reset(self):
        self.serverList.reset()

    ####################################################################################
    # 一.协议处理部分
    ####################################################################################

    #0.逻辑处理部分
    def handlePackage(self, connection , package):
        if isinstance(package, PackageRegister):                        #请求邮箱认证码状态返回
            print('package register')
            self.handleUserRegister(connection, package)
        elif isinstance(package, PackageRegisterAuth):                  #注册状态返回
            print('package registerauth')
            self.handleUserRegisterAuth(connection, package)
        elif isinstance(package, PackageLogin):                         #登陆状态返回
            print('package login')
            self.handleUserLogin(connection, package)
        elif isinstance(package, PackageDg):                            #获取DG证书
            print('package dg')
            self.handleDG(connection, package)
        elif isinstance(package, PackagePublicDg):                      #获取DG公钥证书
            print('package publicdg')
            self.handlePublicDg(connection, package)
        elif isinstance(package, PackageAddFriendRequest):              #转发添加好友申请
            print('package addfriend')
            self.handleAddFriendRequest(connection, package)
        elif isinstance(package, PackageAddFriendStatus):               #返回好友添加结果
            print('package addfriendstatus')
            self.handleAddFriendRequestStatus(connection, package)
        elif isinstance(package, PackageDeleteFriend):                  #删除好友通知
            print('package delfriend')
            self.handleDeleteFriend(connection, package)
        elif isinstance(package, PackageGetFriends):                    #好友列表返回
            print('package getfriends')
            self.handleGetFriends(connection, package)
        elif isinstance(package, PackageGetFriendDetail):               #获取好友信息
            print('package getfrienddetail')
            self.handleGetFriendDetail(connection, package)
        elif isinstance(package, PackageJoinGroup):                     #好友加群提醒
            print('package joingroup')
            self.handleJoinGroup(package)
        elif isinstance(package, PackageGetGroupList):                  #获取群列表
            print('package getgrouplist')
            self.handleGetGroupList(connection, package)
        elif isinstance(package, PackageGetGroupMember):                #获取群成员
            print('package getgroupmember')
            self.handleGetGroupMember(connection, package)
        elif isinstance(package, PackageExitGroup):                     #好友退群提醒
            print('package exitgroup')
            self.handleExitGroup(package)
        elif isinstance(package, PackageSendChatMessage):               #发送聊天信息
            print('package sendchatmsg')
            self.handleSendChatMessage(connection, package)

    #1.根据connection断开连接
    def closeConnection(self, connection):
        print("Connection closed")
        user = self.serverList.getUserByConnection(connection)
        if user:
            self.serverList.deleteUserByUser(user)
            friends = user.getAllFriends()
            if len(friends) > 0:
                self.broadcastOnlineStatusToAllFriend(user, 0)

    ####################################################################################
    # 二.逻辑处理
    ####################################################################################


    #----0.请求邮箱认证码状态返回----#
    def handleUserRegister(self, connection, package):

        retPackage = SendToClientPackage('register')

        #step 1,检查参数合法性
        if self.findBadInput(package.username):
            #帐号异常#
            retPackage.errcode = PACKAGE_ERRCODE_INPUTWRONG

        #step 2,检查参数长度
        elif len(package.username) < 5 or len(package.username) > 13:
            #长度太小#
            retPackage.errcode = PACKAGE_ERRCODE_LENGTHTOSHORT

        else:
            #step 3,检查用户是否存在
            db_user = self.dbEngine.isUserExist(package.username, package.password)

            #已经存在用户,返回重新注册
            if db_user:
                retPackage.errcode = PACKAGE_ERRCODE_USERISEXIST

            #不存在,插入数据库
            else:
                #检查邮箱是否已经被注册
                db_mail = self.dbEngine.isMailExist(package.mail)
                if db_mail:
                    retPackage.errcode = PACKAGE_ERRCODE_USEDMAIL
                else:
                    #发送验证码至邮箱
                    print('authcode')
                    authcode = self.getauthcode()
                    self.dbEngine.wirte_mail_auth(package.mail, authcode)
                    self.sendmailauth(package.mail, authcode)
                    self.createDGPairs(package.username)
                    #将该验证码存至数据库
                    self.dbEngine.register_new_user(package.username, package.password, package.mail, package.sex)
                    retPackage.status = 1

        connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----1.注册状态返回----#
    def handleUserRegisterAuth(self,connection, package):

        retPackage = SendToClientPackage('registerauth')
        #step 1 #
        correctcode = self.dbEngine.getauthbymail(package.mail)
        print(correctcode.authword)
        print(package.auth)
        if correctcode.authword == package.auth:
            retPackage.status = 1
            #修改数据库
            self.dbEngine.finish_new_user(package.mail)
            print('change')
        else:
            retPackage.errcode = PACKAGE_ERRCODE_AUTHFAILED
        #step 2
        connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----2.登陆状态返回----#
    def handleUserLogin(self, connection, package):

        retPackage = SendToClientPackage('login')

        #step 1,检查参数合法性
        if self.findBadInput(package.username):
            retPackage.errcode = PACKAGE_ERRCODE_INPUTWRONG

        else:
            #step 2. 查询数据库
            
            db_user = self.dbEngine.isUserExist(package.username, package.password)
            if not db_user:
                #用户不存在,提醒注册
                retPackage.errcode = PACKAGE_ERRCODE_USERUNEXIST

            elif db_user.authsuccess == 0:
                retPackage.errcode = PACKAGE_ERRCODE_MAILNOTCONFIRM

            else:
                #step 1. 枚举在线用户,如果在线,退掉
                online_user = self.serverList.getUserExistByUsername(package.username)
                if online_user:
                    #step 1.发送异地登录消息
                    another = SendToClientPackage('anotherlogin')
                    another.errcode = PACKAGE_ERRCODE_ANOTHERLOGIN
                    another.obj = SendToClientPackageAnotherLogin(self.serverList.users[package.username].connection._address[0])

                    online_user.connection.send_message(json.dumps(another, cls=ComplexEncoder))

                    #step 2.关闭联接
                    online_user.connection.close()

                #重新加入到在线用户
                user = UserObject(connection, db_user)
                self.serverList.addNewOnlineUser(user)

                #XMLCertificate = self.createXMLCertificate() 生成XML证书

                retPackage.status = 1
                retPackage.obj = SendToClientPackageUser(user.username,
                                                         user.DBUser.sex,
                                                         user.DBUser.mail)
                #加载好友列表
                print ('getUserFriendsWithDBAndOnLineUsers')
                self.getUserFriendsWithDBAndOnLineUsers(user)

                #广播好友列表,通知本人上线
                print ('broadcastOnlineStatusToAllFriend')
                self.broadcastOnlineStatusToAllFriend(user, 1)

                #修改在线列表,本人上线
                print ('setUserOnlineInOnlineUsersFriends')
                self.setUserOnlineInOnlineUsersFriends(user)

        connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
        if retPackage.status == 1:
            my_user = self.serverList.getUserByConnection(connection)
            #检查离线消息,是否有人希望添加我为好友
            print ('getAllAddFriendRequestFromDBAndSendToClient')
            self.getAllAddFriendRequestFromDBAndSendToClient(my_user)
            #是否有发给我的离线消息
            print ('getOfflineChatMessageAndSendWithUser')
            self.getOfflineChatMessageAndSendWithUser(my_user)
    
    #----3.获取公钥数字证书----#
    def handleDG(self, connection, package):
        user = self.serverList.getUserByConnection(connection)
        retPackage = SendToClientPackage('applymydg')
        #自己的name
        if user.DBUser.username == package.username:
            retPackage.status = 1
            return_obj = SendToClientPackageDG(user.DBUser.username,self.getDGPublicKey(user.DBUser.username))
            retPackage.obj = return_obj
        else:
            retPackage.errcode = PACKAGE_ERRCODE_USERID
        user.connection.send_message(json.dumps(retPackage,cls=ComplexEncoder))

    #----4.获取私钥证书----#
    def handlePublicDg(self, connection, package):
        user = self.serverList.getUserByConnection(connection)
        retPackage = SendToClientPackage('applyfrienddg')
        #自己的name
        if user.DBUser.username == package.username:
            retPackage.status = 1
            return_obj = SendToClientPackageDG(package.friendname,self.getDGPrivateKey(package.friendname))
            retPackage.obj = return_obj
        else:
            retPackage.errcode = PACKAGE_ERRCODE_USERID
        user.connection.send_message(json.dumps(retPackage,cls=ComplexEncoder))

    #----5.转发添加好友申请----#
    def handleAddFriendRequest(self, connection, package):

        user = self.serverList.getUserByConnection(connection)
        retPackage = SendToClientPackage('returnaddfriend')
        bFriendship = False

        #检查是否是自己并且自己不是自己想要添加自己为好友
        if user.DBUser.username == package.fromname and user.DBUser.username != package.toname:
            isexist = self.dbEngine.getUserInfoWithUserName(package.toname)
            #检查用户是否存在
            if isexist:
                friend = user.getFriendWithUsername(package.toname)
                if friend:
                    bFriendship = True

                if not bFriendship:
                    retPackage.status = 1
                    user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

                    #step2 在线,发送添加
                    online_user = self.serverList.getUserExistByUsername(package.toname)

                    if online_user:
                        add_obj = []
                        addreq = SendToClientPackageRecvAddFriendRequest(package.fromname,
                                                                         package.toname,
                                                                         user.DBUser.sex,
                                                                         package.msg,
                                                                         datetime.datetime.now())
                        add_obj.append(addreq)
                        retPackagetofriend = SendToClientPackage('addfriend')
                        retPackagetofriend.status = 1
                        retPackagetofriend.obj = add_obj

                        online_user.connection.send_message(json.dumps(retPackagetofriend, cls=ComplexEncoder))
                    else:
                        #插入数据库,等待上线时候通知
                        print('Insert datebase')
                        self.dbEngine.setOfflineAddFriendReuqest(package.toname, package.fromname, package.msg, datetime.datetime.now())
                else:
                    #已经是好友,返回错误信息
                    retPackage.errcode = PACKAGE_ERRCODE_FRIENDSHIPEXIST
                    user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
            else:
                retPackage.errcode = PACKAGE_ERRCODE_NOTHISUSER
                user.connection.send_message(json.dumps(retPackage,cls=ComplexEncoder))
        else:
            #用户ID错误,或者用户ID等于好友ID
            retPackage.errcode = PACKAGE_ERRCODE_USERFRIENDID
            user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----6.返回好友添加结果----#
    def handleAddFriendRequestStatus(self, connection, package):

        user = self.serverList.getUserByConnection(connection)
        retPackage = SendToClientPackage('returnaddfriendstatus')

        #自己的ID是目标ID && 自己不能添加自己为好友
        if user.DBUser.username == package.toname and user.DBUser.username != package.fromname:

            #如果同意
            if package.agree:

                #step 1. 检查是否是自己的好友
                if not self.dbEngine.getFriendshipWithUserFriendName(package.fromname, package.toname):
                    db_friend = self.dbEngine.getUserInfoWithUserName(package.fromname)
                    #在线列表中
                    usob = self.serverList.getUserByUsername(package.fromname)
                    #存在数据库中
                    if db_friend:#判断用户是否存在
                        retPackage.status = 1
                        #保存关系到数据库
                        self.dbEngine.setFriendshipWithUserNames(package.toname, package.fromname)
                        return_obj=[]
                        if usob:#用户在在线列表中

                            return_tem = SendToClientPackageFriendsList(package.fromname,
                                                                        db_friend.sex,
                                                                        db_friend.mail,
                                                                        usob.connection._address[0],
                                                                        package.agree)
                        else:
                            return_tem = SendToClientPackageFriendsList(package.fromname,
                                                                        db_friend.sex,
                                                                        db_friend.mail,
                                                                        '',
                                                                        package.agree)
                        return_obj.append(return_tem)
                        retPackage.obj = return_tem

                        user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
                        #检查是否在线,在线发送上线通知
                        online_friend = self.serverList.getUserExistByUsername(package.fromname)
                        if online_friend:
                            #当前在线
                            retPackagetofriendstatus = SendToClientPackage('addfriendstatus')
                            online_obj = []
                            online_status = SendToClientAddFriendStatus(package.fromname,
                                                                        package.toname,
                                                                        user.DBUser.sex,
                                                                        user.DBUser.mail,
                                                                        user.connection._address[0],
                                                                        package.msg,
                                                                        package.agree,
                                                                        user.online)
                            online_obj.append(online_status)
                            retPackagetofriendstatus.status = 1
                            retPackagetofriendstatus.obj = online_status
                            #发送有人添加好友申请
                            online_friend.connection.send_message(json.dumps(retPackagetofriendstatus, cls=ComplexEncoder))

                            #添加到我的好友列表
                            user.addFriend(online_friend)
                            online_friend.addFriend(user)
                        else:
                            new_friend = UserObject(None,self.dbEngine.getUserInfoWithUserName(package.fromname))
                            user.addfriend(new_friend)
                            #此处应该添加系统回复消息至数据库
                            #用户上线时,将此消息发送

                    else:
                        retPackage.errcode = PACKAGE_ERRCODE_NOTHISUSER

                        #返回添加好友状态
                        user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

                else:
                    #已经是好友提示
                    retPackage.errcode = PACKAGE_ERRCODE_FRIENDSHIPEXIST

                    user.connection.send_message(json.dumps(retPackage, cls= ComplexEncoder))

            else:
                #返回状态
                retPackage.status = 1
                #返回添加好友状态
                user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

                #TODO:拒绝不提示
                pass

        else:
            #用户ID异常
            retPackage.errcode = PACKAGE_ERRCODE_USERFRIENDID
            user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----7.删除好友通知----#
    def handleDeleteFriend(self, connection, package):

        user = self.serverList.getUserByConnection(connection)
        retPackage = SendToClientPackage('delfriend')

        # 自己的id
        if user.DBUser.username == package.username and user.DBUser.username != package.friendname:
            retPackage.status = 1

            # 从数据库中删除
            self.dbEngine.deleteFriendshipByUserAndFriendName(package.username, package.friendname)

            user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

            # 给在线好友发送通知,删除
            online_friend = self.serverList.getUserExistByUsername(package.friendname)
            if online_friend:
                sendObj = SendToClientPackageUser(user.DBUser.username,
                                                  user.DBUser.sex,
                                                  user.DBUser.mail)
                retPackage.obj = sendObj
                online_friend.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
                online_friend.deleteFriend(user)
                # 从维护的好友列表中删除
                user.deleteFriend(online_friend)

        else:
            retPackage.errcode = PACKAGE_ERRCODE_USERID
            user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----8.好友列表返回----#
    def handleGetFriends(self, connection, package):

        user = self.serverList.getUserByConnection(connection)
        retPackage = SendToClientPackage('getfriends')

        #自己的name
        if user.DBUser.username == package.username:

            retFriend = self.getUserFriendsWithUserAndPage(user, int(package.page))

            if len(retFriend) > 0:
                retPackage.obj = retFriend

            retPackage.status = 1

        else:
            retPackage.errcode = PACKAGE_ERRCODE_USERID
        print('getfriends')
        user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----9.获得好友信息----#
    def handleGetFriendDetail(self, connection, package):

        user = self.serverList.getUserByConnection(connection)
        retPackage = SendToClientPackage('getfrienddetail')

        #自己的id
        if user.DBUser.uid == int(package.uid) and user.DBUser.uid != int(package.fid):
            retPackage.status = 1

            #获取用户详细资料返回

        else:
            retPackage.errcode = PACKAGE_ERRCODE_USERID
            user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----10.加入群组----#
    def handleJoinGroup(self, package):

        user = self.serverList.getUserByUsername(package.username)
        group = self.serverList.getGroupByGroupname(package.groupname)
        retPackage = SendToClientPackage('memberjoinexitgroup')
        if group:#群组已存在
            # step 1. 检查未入群
            if not user.DBUser.username in self.serverList.group[package.groupname].members:
                retPackage.status = 1
                #维护在线列表
                group.addMember(user)
                #保存关系到数据库
                self.dbEngine.add_user_into_group(package.groupname,package.username)
                my_group = self.dbEngine.findGroupidWithGroupname(package.groupname)
                return_obj = SendToClientPackageGroupsList(my_group.groupname,my_group.groupnumber)
                retPackage.obj = return_obj
                user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
                #广播进退群消息(进群)
                self.broadcastJoinExitStatusToAllMember(package.username, package.groupname, True)

            #已经在群里
            else:
                retPackage.errcode = PACKAGE_ERRCODE_INGROUP
                user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
        else:
            retPackage.status = 1
            self.dbEngine.register_new_group(package.groupname)
            self.dbEngine.add_user_into_group(package.groupname,package.username)
            db_gp = self.dbEngine.findGroupidWithGroupname(package.groupname)
            GO_gp = GroupObject(db_gp)
            self.serverList.addNewGroup(GO_gp)
            db_user = self.dbEngine.findIdWithName(package.username)
            GO_user = UserObject(None,db_user)
            GO_gp.addMember(GO_user)
            return_obj = SendToClientPackageGroupsList(package.groupname,1)
            retPackage.obj = return_obj
            user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----11.获取群列表----#
    def handleGetGroupList(self, connection, package):
        user = self.serverList.getUserByConnection(connection)
        retPackage = SendToClientPackage('getgrouplist')

        #自己的name
        if user.DBUser.username == package.username:
            return_obj = self.getGroupListWithUser(user)
            if len(return_obj) > 0:
                retPackage.obj =return_obj
            retPackage.status = 1
        else:
            retPackage.errcode = PACKAGE_ERRCODE_USERID
        print ('getgrouplist')
        user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----12.获取群成员----#
    def handleGetGroupMember(self, connection, package):
        user = self.serverList.getUserByConnection(connection)
        group = self.serverList.getGroupByGroupname(package.groupname)
        retPackage = SendToClientPackage('getgroupmember')

        #自己的name
        if user.DBUser.username == package.username:
            #群组是否存在
            if group:
                #用户是群组成员
                if user.DBUser.username in group.members:
                    retPackage.status = 1
                    return_obj = self.getGroupMember(group)
                    if len(return_obj) > 0:
                        retPackage.obj = return_obj
                else:
                    retPackage.errcode = PACKAGE_ERRCODE_NOTINGROUP
            else:
                retPackage.errcode = PACKAGE_ERRCODE_GROUPNOTEXIST
        else:
            retPackage.errcode = PACKAGE_ERRCODE_USERID
        user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #----13.退出群组----#
    def handleExitGroup(self, package):

        user = self.serverList.getUserByUsername(package.username)
        group = self.serverList.getGroupByGroupname(package.groupname)
        retPackage = SendToClientPackage('memberjoinexitgroup')
        
        #1群存在
        if group:
            #在群里
            if user.DBUser.username in self.serverList.group[package.groupname].members:
                retPackage.status = 1
                #更新群组成员列表
                group.deleteMember(user)
                #从数据库中删除
                print (package.groupname,package.username)
                self.dbEngine.del_user_from_group(package.groupname,package.username)
                #维护该群的群成员列表
                db_user = self.dbEngine.findIdWithName(package.username)
                GO_user = UserObject(None,db_user)
                group.deleteMember(GO_user)
                #返回退群成功包
                user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
                #获得当前此时群人数
                length = self.dbEngine.get_group_number(package.groupname)
                #群能否继续存在
                if length == 0:
                    #删除该群
                    self.dbEngine.del_the_group(package.groupname)
                    #维护服务器群列表缓存
                    self.serverList.deleteGroupByGroup(group)
                else:
                    #广播进退群消息
                    self.broadcastJoinExitStatusToAllMember(package.username, package.groupname, False)

            #不在群里
            else:
                retPackage.errcode = PACKAGE_ERRCODE_NOTINGROUP
                user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
        else:
            retPackage.errcode = PACKAGE_ERRCODE_NOTINGROUP
            user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))


    #----14.发送聊天消息----#
    def handleSendChatMessage(self, connection, package):

        user = self.serverList.getUserByConnection(connection)
        retPackage = SendToClientPackage('sendchatmsg')

        #不是群组消息
        if package.groupname == '':
            print ("private message")
            #自己的name
            if user.DBUser.username == package.fromname and user.DBUser.username != package.toname:

                #寻找好友
                for friend in user.getAllFriends():

                    if friend.DBUser.username == package.toname:
                        #发送消息给好友
                        retPackage.status = 1

                        user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
                        chat_obj = []
                        chat = SendToClientPackageChatMessage(package.fromname,
                                                              package.toname,
                                                              '',
                                                              package.chatmsg,
                                                              datetime.datetime.now())
                        chat_obj.append(chat)
                        retPackage.obj = chat_obj

                        #在线
                        if friend.connection:
                            friend.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
                        #不在线,数据库插入离线消息
                        else:
                            self.dbEngine.addOfflineChatMessageWithUserName(package.fromname,
                                                                            package.toname,
                                                                            '',
                                                                            package.chatmsg,
                                                                            datetime.datetime.now())
                            print ("insert offlinechatmessage")
                print ('not find friend')
            else:
                retPackage.errcode = PACKAGE_ERRCODE_USERID
                user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

        #是群组消息
        else:
            #判断自己在群内
            if user.DBUser.username in self.serverList.group[package.groupname].members:
                #发送群组消息返回包
                retPackage.status = 1
                user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
                #寻找群内成员
                for member in self.serverList.group[package.groupname].members:
                    #跳过自己
                    if user.DBUser.username == member:
                        continue
                    #构造群组消息
                    chat_obj = []
                    chat = SendToClientPackageChatMessage(package.fromname,
                                                          '',
                                                          package.groupname,
                                                          package.chatmsg,
                                                          datetime.datetime.now())
                    chat_obj.append(chat)
                    retPackage.obj = chat_obj
                    #在线
                    onlineuser = self.serverList.getUserExistByUsername(member)
                    if onlineuser:
                        onlineuser.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))
                    #不在线,数据库插入离线消息
                    else:
                        print ('insert datebase')
                        self.dbEngine.addOfflineChatMessageWithUserName(package.fromname,
                                                                        member,
                                                                        package.groupname,
                                                                        package.chatmsg,
                                                                        datetime.datetime.now())
            else:
                retPackage.errcode = PACKAGE_ERRCODE_NOTINGROUP
                user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))


    ####################################################################################
    # 三.逻辑中的部分细节处理
    ####################################################################################

    #----1.生成认证码----#
    #----from: 0.handleUserRegister----#
    def getauthcode(self):

        authcode = ''
        for i in range(4):
            authcode += random.choice('abcdefghijklmnopqrstuvwxyz')
        return authcode

    #----2.发送邮箱认证码----#
    #----from: 0.handleUserRegister----#
    def sendmailauth(self, mail, authcode):

        smtp_server = 'smtp.sina.com'
        username = '******'
        password = '******'
        from_addr = '*****@*****.**'
        to_addr = mail
        message = 'authcode:' + authcode
        msg = MIMEText(message, 'plain', 'utf-8')
        server = smtplib.SMTP(smtp_server, 25)
        #server.set_debuglevel(1)
        server.login(username, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()

    #----3.生成证书----#
    #----from: 2.handleUserLoginr----#
    def createDGPairs(self,username):

        private_path = 'private/'
        public_path = 'public/'
        private_path += username
        public_path += username
        P = PKey()
        P.generate_key(TYPE_RSA, 1024)
        #写入
        with open(public_path,'w') as f:
            f.write(dump_publickey(FILETYPE_PEM, P).decode('utf-8'))
        with open(private_path,'w') as f:
            f.write(dump_privatekey(FILETYPE_PEM, P).decode('utf-8'))

    #----4.获取私钥----#
    def getDGPrivateKey(self, username):

        path = 'private/'
        path += username
        with open(path,'r',encoding='utf-8') as f:
            PrivateKey = f.read()
        return PrivateKey

    #----5.获取公钥----#
    def getDGPublicKey(self, username):

        path = 'public/'
        path += username
        with open(path,'r',encoding='utf-8') as f:
            PublicKey = f.read()
        return PublicKey

    #----6.获取用户的所有好友信息----#
    #----from: 2.handleUserLogin----#
    def getUserFriendsWithDBAndOnLineUsers(self, user):

        #step 1.从数据库加载
        (user1Friends, user2Friends) = self.dbEngine.getUserFriendshipWithUserName(user.DBUser.username)
        for friend in user1Friends:
            db_user = self.dbEngine.getUserInfoWithUserId(friend.user2id)
            friend = UserObject(None, db_user)
            user.addFriend(friend)
            online_friend = self.serverList.getUserExistByUsername(db_user.username)
            if online_friend:
                friend.connection = online_friend.connection
                friend.online = True

        for friend in user2Friends:
            db_user = self.dbEngine.getUserInfoWithUserId(friend.user1id)
            friend = UserObject(None, db_user)
            user.addFriend(friend)
            online_friend = self.serverList.getUserExistByUsername(db_user.username)
            if online_friend:
                friend.connection = online_friend.connection
                friend.online = True

    #---5.获取群组的所有成员信息---#
    #---from: groupInit---#
    def getGroupMemberWithDB(self, group):

        members = self.dbEngine.get_group_member(group.DBGroup.groupname)

        for member in members:
            db_user = self.dbEngine.findNameWithId(member.memberid)
            member = UserObject(None,db_user)
            group.addMember(member)

    #---6.从数据库获取所有离线申请添加好友的用户并发送给用户--#
    #---from: 2.handleUserLogin---#
    def getAllAddFriendRequestFromDBAndSendToClient(self, user):

        add_requests = []
        offline_add_friend_requests = self.dbEngine.getOfflineAddFriendRequests(user.DBUser.username)
        for off_add_req in offline_add_friend_requests:

            fuser = self.dbEngine.getUserInfoWithUserId(off_add_req.fromid)
            send_request = SendToClientPackageRecvAddFriendRequest(fuser.username,
                                                                   user.DBUser.username,
                                                                   user.DBUser.sex,
                                                                   off_add_req.msg,
                                                                   off_add_req.lastdate)
            add_requests.append(send_request)

        if len(add_requests) > 0:
            #发送
            retRequest = SendToClientPackage('addfriend')
            retRequest.status = 1
            retRequest.obj = add_requests

            user.connection.send_message(json.dumps(retRequest, cls=ComplexEncoder))

            #删除离线好友请求
            self.dbEngine.deleteOfflineAddFriendRequestWithUserName(user.DBUser.username)


    #---7.获取所有离线消息并发送---#
    #---from: 2.handleUserLogin---#
    def getOfflineChatMessageAndSendWithUser(self, user):

        db_offline_chat_messages = self.dbEngine.getAllOfflineChatMessageWithUserName(user.DBUser.username)

        ret_off_chat_messages = []
        if db_offline_chat_messages:
            for off_chat_msg in db_offline_chat_messages:
                fuser = self.dbEngine.getUserInfoWithUserId(off_chat_msg.fromuserid)
                fgroup = self.dbEngine.getGroupInfoWithGroupId(off_chat_msg.groupid)
                if fgroup.groupname == '':
                    off_msg = SendToClientPackageChatMessage(fuser.username,
                                                            user.DBUser.username,
                                                            fgroup.groupname,
                                                            off_chat_msg.msg,
                                                            off_chat_msg.last_date)
                else:
                    off_msg = SendToClientPackageChatMessage(fuser.username,
                                                            '',
                                                            fgroup.groupname,
                                                            off_chat_msg.msg,
                                                            off_chat_msg.last_date)
                ret_off_chat_messages.append(off_msg)

        if ret_off_chat_messages:
            #发送离线消息
            retPackage = SendToClientPackage('sendchatmsg')
            retPackage.status = 1
            retPackage.obj = ret_off_chat_messages

            user.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

            #从数据库中删除
            self.dbEngine.deleteAllOfflineChatMessageWithUserName(user.DBUser.username)


    # ---8.将在线用户列表里面的所有状态修改为在线---#
    # ---from: 2.handleUserLogin---#
    def setUserOnlineInOnlineUsersFriends(self, user):

        for friend in user.getAllFriends():
            online_friend = self.serverList.getUserExistByUsername(friend.DBUser.username)
            if online_friend:
                myself = online_friend.getFriendWithUsername(user.DBUser.username)
                myself.connection = user.connection


    #---9.广播用户的上线下线消息---#
    #---from: 2.handleUserLogin & closeConnection---#
    def broadcastOnlineStatusToAllFriend(self, user, online):

        retPackage = SendToClientPackage('useronoffline')

        for friend in user.getAllFriends():
            #通知所有好友上下线
            retPackage.status = 1
            if online:
                obj = SendToClientUserOnOffStatus(user.DBUser.username,
                                                  user.connection._address[0],
                                                  online)
            else:
                obj = SendToClientUserOnOffStatus(user.DBUser.username,
                                                  '',
                                                  online)
            retPackage.obj = obj
            if friend.connection:
                friend.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

            if not online:  #离线
                # 清空连接
                online_friend = self.serverList.getUserExistByUsername(friend.DBUser.username)
                if online_friend:
                    # 从好友列表里面将自己的connection 清0
                    myself = online_friend.getFriendWithUsername(user.DBUser.username)
                    myself.connection = None


    #---10.广播群组成员加退群信息---#
    #---from: 8.handlejoingroup & 9.handleexitgroup---#
    def broadcastJoinExitStatusToAllMember(self, username, groupname, status):

        retPackage = SendToClientPackage('memberjoinexitgroup')
        group = self.serverList.getGroupByGroupname(groupname)
        retPackage.status = 1

        for member in group.members.values():
            #检查是否在线,在线发送上线通知
            online_member = self.serverList.getUserExistByUsername(member.DBUser.username)

            #在线
            if online_member:
                join_exit_status = SendToClientGroupMemberJoinExitStatus(username,
                                                                         groupname,
                                                                         status)
                retPackage.obj = join_exit_status

                #发送入退群通知
                online_member.connection.send_message(json.dumps(retPackage, cls=ComplexEncoder))

    #---11.获取群组列表---#
    def getGroupListWithUser(self, user):
        retList = []
        groups = self.dbEngine.get_list_group(user.DBUser.username)
        if groups:
            for group in groups:
                #根据groupid获取name
                print ("group.groupid",group.groupid)
                my_group = self.dbEngine.getGroupInfoWithGroupId(group.groupid)
                retGroup = SendToClientPackageGroupsList(my_group.groupname,
                                                         my_group.groupnumber)
                retList.append(retGroup)
        return retList
    #---12.获取群组成员
    def getGroupMember(self, group):
        retList = []
        members = group.getAllMember()
        membernum = len(members)
        print ('membernum',membernum)
        if members and membernum > 0:
            for member in members:
                print('username:'******'',
                                                                 False)

                    retFriends.append(retUser)
        return retFriends