Ejemplo n.º 1
0
    def recvfrom_user(self, time, target, sender, cmd, recv_args, ):
        '''
            time  :    见recvfrom_server
            target:    见recvfrom_server
            sender:   消息发送者的名字
            cmd   :    见recvfrom_server
            recv_args: 见recvfrom_server
        '''

        # print("sender:%s,cmd:%s,recv_args:%s" % (sender, cmd, recv_args))

        if cmd == 'chatdata':  # 聊天信息
            content = recv_args

            if target.dtype == 'user':  # 发送给个人的
                msg = MsgType(type=MsgType.MSG_FRIENDLIST,
                              msgtype=MsgType.CHAT_ORGIN_DATA,
                              msg=(sender, content))
                self.send_queue.put(msg)
            else:  # 群聊
                print(formattime(time), sender, '[%s]:\n' % target.name, content)

        if cmd == 'mkfriend':
            # 有人向你请求添加好友,参数为好友名
            # print(sender, '请求添加你为好友,是否同意 Y/N')
            # print('')
            # 同意,不同意则不理睬
            # self.make_friend(sender)
            msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ADDFRIEND, msg=['add_recv', sender])
            self.send_queue.put(msg)
Ejemplo n.º 2
0
 def connect_server(self):
     try:
         msg = MsgType(type=MsgType.MSG_SOCKET, msgtype=MsgType.SUCCESS)
         self.client = netClient.ClientNet(application.server_addr,
                                           application.rev_msg_queue)
     except:
         msg.msgtype = MsgType.FAILURE
         time.sleep(1)
     else:
         msg.msgtype = MsgType.SUCCESS
     finally:
         application.dlg_msg_queue.put(msg)
Ejemplo n.º 3
0
 def loginDlgClickLogin(self):
     username = self.loginDlg.usernamelineEdit.text()
     passwd = self.loginDlg.passwdlineEdit.text()
     if username == '' or passwd == '':
         QtWidgets.QMessageBox.information(self.registerDlg, '提示', '用户名密码不能为空', QtWidgets.QMessageBox.Ok)
     else:
         msg = MsgType(type=MsgType.MSG_LOGIN,msgtype=MsgType.USER_DATA,msg = {'username':username,'passwd':passwd})
         self.send_queue.put(msg)
Ejemplo n.º 4
0
 def registerDlgClickRegister(self):
     username = self.registerDlg.usernamelineEdit.text()
     passwd = self.registerDlg.passwdlineEdit.text()
     passwdsure = self.registerDlg.passwdsurelineEdit.text()
     if username == '' or passwd == '' or passwdsure == '':
         QtWidgets.QMessageBox.information(self.registerDlg, '提示', '用户名密码不能为空', QtWidgets.QMessageBox.Ok)
     elif passwd != passwdsure:
         QtWidgets.QMessageBox.information(self.registerDlg, '提示', '两次密码不一致', QtWidgets.QMessageBox.Ok)
     else:
         msg = MsgType(type=MsgType.MSG_REGISTER, msgtype=MsgType.USER_DATA,msg={'username': username, 'passwd': passwd})
         self.send_queue.put(msg)
Ejemplo n.º 5
0
    def handle_rev_queue(self):
        if not self.rev_queue.empty():
            msg = self.rev_queue.get()
            if msg.type == MsgType.MSG_SYS:
                if msg.msgtype == MsgType.EXIT:
                    sys.exit(msg.msg)

            elif msg.type == MsgType.MSG_SOCKET:
                if msg.msgtype == MsgType.FAILURE:
                    self.server_connect_display(True)
                else:
                    self.server_connect_display(False)

            elif msg.type == MsgType.MSG_REGISTER:
                d = {MsgType.FAILURE:'注册失败',MsgType.SUCCESS:'注册成功'}
                QtWidgets.QMessageBox.information(self.registerDlg, '提示', d[msg.msgtype], QtWidgets.QMessageBox.Ok)

            elif msg.type == MsgType.MSG_LOGIN:
                if msg.msgtype == MsgType.FAILURE:
                    QtWidgets.QMessageBox.information(self.loginDlg, '提示', '登录失败', QtWidgets.QMessageBox.Ok)
                else:
                    m = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.USER_DATA,msg={'username': self.loginDlg.usernamelineEdit.text(), 'passwd': self.loginDlg.passwdlineEdit.text()})
                    self.send_queue.put(m)
                    QtCore.QCoreApplication.instance().quit()
Ejemplo n.º 6
0
 def sys_exit(self):
     m = MsgType(type=MsgType.MSG_SYS, msgtype=MsgType.EXIT, msg=0)
     application.net_msg_queue.put(m)
     application.rev_msg_queue.put(m)
     application.dlg_msg_queue.put(m)
Ejemplo n.º 7
0
    def recvfrom_server(self, time, target, cmd, send_args, recv_args):
        ''' 主要有些函数,比如查询某个组内成员,需要知道发送的什么参数。
            所以有个send_args的变量,不知道怎么用就打印出来看看就知道来了

            time:   为了时间同步问题,所以时间全部都是服务器上获取的(不然某一客户端改了本地时间就全乱了)
                    离线信息的时间为系统存储离线信息的时间

            target: 消息的目标位置,客户端收到的现在有两个属性 group 和 user ,如果为user则是发送给本人的
                    如果为group,则需要判断是发给哪个群组的。

            cmd:    表明是哪个消息的返回
            send_args: 为了方便客户端处理,客户端发送的参数也一并被带下来了
            recv_args: 指令处理的结果

        '''
        print('time:%s,target:%s,cmd:%s,send:%s,recv:%s' % (formattime(time), target, cmd, send_args, recv_args))

        if cmd == 'sign_up': # 注册结果
            msg = MsgType(type=MsgType.MSG_REGISTER,msgtype=MsgType.SUCCESS if recv_args else MsgType.FAILURE)
            self.send_queue.put(msg)

        if cmd == 'sign_in': # 登录结果
            if recv_args != False:
                self.user = recv_args
            msg = MsgType(type=MsgType.MSG_LOGIN, msgtype=MsgType.SUCCESS if recv_args else MsgType.FAILURE)
            self.send_queue.put(msg)

        if cmd == 'make_friend':
            # 如果拒绝则不会返回,这里返回False的原因是:
            # 1.两者中有一个不是用户
            # 2.双方已经是好友了
            result, userA, userB = recv_args  # A为发起者
            msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ADDFRIEND,msg=['add_res',result,userA,userB])
            self.send_queue.put(msg)

        if cmd == 'delete_friend':
            # 如果失败则说明双方不是好友
            # A删除B
            result, userA, userB = recv_args
            if self.user == userA:
                msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.DELFRIEND,
                              msg=['del_res', result, userA, userB])
                self.send_queue.put(msg)
            else:
                msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.DELFRIEND,
                              msg=['del_ret', result, userA, userB])
                self.send_queue.put(msg)

        if cmd == 'get_friends':
            data = []
            groupList = []
            self.is_online(recv_args)
            for i in recv_args:
                if recv_args[i] not in groupList:
                    groupList.append(recv_args[i])
                    data.append([recv_args[i],[i]])
                else:
                    for group in data:
                        if group[0] == recv_args[i]:
                            group[1].append(i)
            msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.FRIENDLIST,msg=json.dumps(data))
            self.send_queue.put(msg)

        if cmd == 'get_groups':
            group_list = recv_args
            print('群组列表:', group_list)

            for group in group_list:
                self.group_get_member(group)

        if cmd == 'group_create':
            # send_args:group_name,members
            # recv_args:True/False
            group_name, members = send_args
            result = recv_args

            print('创建组{}:{} {}'.format(group_name, members, fmt(recv_args)))

            # 测试获取组员
            # self.group_get_member(group_name)

            # 测试添加组员
            self.group_append(group_name, 'antony')
            # 测试发送组消息
            self.send_data(UserID('group', group_name), 'hello,everyone')

            # #测试删除组员
            # self.group_delete(group_name,'a')

            # #测试删除群
            # self.group_drop(group_name)

            # 测试群转让
            # self.group_transfer(group_name,'antony')
        if cmd == 'group_drop':
            group_name, user = send_args
            result = recv_args

            print('{}删除组{}:'.format(user, group_name, fmt(result)))

        if cmd == 'group_get_member':
            group_name = send_args[0]
            group_list = recv_args
            print('获取到了组员', group_name, group_list)

        if cmd == 'group_append':
            group_name, new_member = send_args
            result = recv_args
            print('群{}添加{}{}'.format(group_name, new_member, fmt(result)))

        if cmd == 'group_delete':
            group_name, admin, old_member = send_args
            result = recv_args
            print('群{},{}删除{}{}'.format(group_name, admin, old_member, fmt(result)))

        if cmd == 'group_transfer':
            group_name, old_admin, new_admin = send_args
            result = recv_args
            if result == True:
                print('{}成功把群{}转让给了{}'.format(old_admin, group_name, new_admin))
            else:
                print('{}想把群{}转让给{},但是失败了'.format(old_admin, group_name, new_admin))

        if cmd == 'get_user':
            regexp, start, stop = send_args
            result = recv_args

            if start == None:
                start = ''

            if stop == None:
                stop = ''

            print('所有用户:"%s"[%s:%s:1]=%s' % (regexp, start, stop, result))

        if cmd == 'get_online_user':
            regexp, start, stop = send_args
            result = recv_args

            if start == None:
                start = ''

            if stop == None:
                stop = ''

            print('在线用户:"%s"[%s:%s:1]=%s' % (regexp, start, stop, result))

        if cmd == 'is_online':
            user_list = send_args
            result_list = recv_args
            msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ONLINE, msg=zip(user_list,result_list))
            self.send_queue.put(msg)

        if cmd == 'go_online':
            # 好友上线通知
            msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ONLINE, msg=[(recv_args,True)])
            self.send_queue.put(msg)

        if cmd == 'go_offline':
            # 好友下线通知
            msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ONLINE, msg=[(recv_args,False)])
            self.send_queue.put(msg)

        if cmd == 'group_and_members':
            # 上线时,服务器主动下发组和组内成员
            #{'group1':m1,m2,..],'group2':[m1,m2,...]}
            group_list = recv_args
            print('群-成员表')
            # msg = MsgType(type=MsgType.MSG_REGISTER, msgtype=MsgType.SUCCESS if recv_args else MsgType.FAILURE)
            # self.send_queue.put(msg)
            for group in group_list:
                print("%s:\n\t%s" % (group, group_list[group]))

        if cmd == 'distribute_belong':
            user,friend,belong = send_args
            # result = recv_args
            # print('已变更%s为"%s"'%(friend,belong))
            msg = MsgType(type=MsgType.MSG_FRIENDLIST, msgtype=MsgType.ADDFRIEND,
                          msg=['change_belong_res', friend,belong,recv_args])
            self.send_queue.put(msg)
Ejemplo n.º 8
0
 def closeEvent(self, QCloseEvent):
     msg = MsgType(type=MsgType.MSG_CHAT,msgtype=MsgType.CLOSE_DLG,msg = self.targetname)
     self.send_queue.put(msg)
Ejemplo n.º 9
0
 def closeEvent(self, QCloseEvent):
     msg = MsgType(type=MsgType.MSG_CALENDAR,msgtype=MsgType.CLOSE_DLG,msg = os.getpid())
     self.send_queue.put(msg)
Ejemplo n.º 10
0
 def TetrisButton_clicked(self):
     if MsgType.TETRIS_DLG not in self.dlgstate:
         self.dlgstate.append(MsgType.TETRIS_DLG)
         msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.TETRIS_DLG)
         self.send_queue.put(msg)
Ejemplo n.º 11
0
 def snackButton_clicked(self):
     if MsgType.SNACK_DLG not in self.dlgstate:
         self.dlgstate.append(MsgType.SNACK_DLG)
         msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.SNACK_DLG)
         self.send_queue.put(msg)
Ejemplo n.º 12
0
 def calendarButton_clicked(self):
     if MsgType.CALENDAR_DLG not in self.dlgstate:
         self.dlgstate.append(MsgType.CALENDAR_DLG)
         msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.CALENDAR_DLG)
         self.send_queue.put(msg)
Ejemplo n.º 13
0
 def weatherButton_clicked(self):
     if MsgType.WEATHER_DLG not in self.dlgstate:
         self.dlgstate.append(MsgType.WEATHER_DLG)
         msg = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.WEATHER_DLG)
         self.send_queue.put(msg)
Ejemplo n.º 14
0
 def register_close_event(self):
     msg_dict = MsgType(type=MsgType.MSG_REGISTER, msgtype=MsgType.CLOSE_DLG)
     self.send_queue.put(msg_dict)
Ejemplo n.º 15
0
 def login_close_event(self):
     msg_dict = MsgType(type=MsgType.MSG_LOGIN,msgtype=MsgType.CLOSE_DLG)
     self.send_queue.put(msg_dict)
Ejemplo n.º 16
0
    def handleMsg(self):
        if not application.rev_msg_queue.empty():
            msg = application.rev_msg_queue.get()
            print('main:', msg)
            if msg.type == MsgType.MSG_SYS:
                if msg.msgtype == MsgType.EXIT:
                    self.join_all()
                    if self.client:
                        self.client.close()
                    sys.exit(msg.msg)

            elif msg.type == MsgType.MSG_LOGIN:
                if msg.msgtype == MsgType.CLOSE_DLG:
                    self.sys_exit()
                elif msg.msgtype == MsgType.USER_DATA:
                    try:
                        self.client.sign_in(msg.msg['username'],
                                            msg.msg['passwd'])
                    except (IOError, AttributeError):
                        m = MsgType(type=MsgType.MSG_LOGIN,
                                    msgtype=MsgType.FAILURE)
                        self.dlg_msg_queue.put(m)
                        self.unconnect_server()
                    except Exception as e:
                        print(e)
                elif msg.msgtype in [MsgType.SUCCESS, MsgType.FAILURE]:
                    application.dlg_msg_queue.put(msg)

            elif msg.type == MsgType.MSG_REGISTER:
                if msg.msgtype == MsgType.CLOSE_DLG:
                    self.sys_exit()
                elif msg.msgtype == MsgType.USER_DATA:
                    try:
                        self.client.sign_up(msg.msg['username'],
                                            msg.msg['passwd'])
                    except (IOError, AttributeError):
                        m = MsgType(type=MsgType.MSG_REGISTER,
                                    msgtype=MsgType.FAILURE)
                        self.dlg_msg_queue.put(m)
                        self.unconnect_server()
                    except Exception as e:
                        print(e)
                elif msg.msgtype in [MsgType.SUCCESS, MsgType.FAILURE]:
                    application.dlg_msg_queue.put(msg)

            elif msg.type == MsgType.MSG_FRIENDLIST:
                if msg.msgtype == MsgType.CLOSE_DLG:
                    # 好友列表对话框关闭消息
                    self.sys_exit()

                if msg.msgtype in [
                        MsgType.FRIENDLIST, MsgType.ONLINE,
                        MsgType.CHAT_ORGIN_DATA
                ]:
                    # 转发从socke接收的好友列表消息
                    application.dlg_msg_queue.put(msg)

                if msg.msgtype == MsgType.ADDFRIEND:
                    # 加好友的消息
                    if msg.msg[0] == 'add':
                        # 发起添加好友
                        self.client.request_friend(msg.msg[2])

                    if msg.msg[0] in [
                            'add_res', 'add_recv', 'change_belong_res'
                    ]:
                        # 添加好友的结果和接受到好友申请
                        application.dlg_msg_queue.put(msg)
                    if msg.msg[0] == 'change_belong':
                        self.client.distribute_belong(msg.msg[1], msg.msg[2])

                    if msg.msg[0] in ['add_recv_ret']:
                        self.client.make_friend(msg.msg[1])

                if msg.msgtype == MsgType.DELFRIEND:
                    if msg.msg[0] == 'del':
                        self.client.delete_friend(msg.msg[1])

                    if msg.msg[0] in ['del_res', 'del_ret']:
                        application.dlg_msg_queue.put(msg)

                if msg.msgtype == MsgType.MOVEFRIEND:
                    if msg.msg[0] == 'move':
                        self.client.distribute_belong()
                if msg.msgtype == MsgType.CALENDAR_DLG:
                    self.createProcess(myDlg.friendListDlg.create_calendarDlg)

                if msg.msgtype == MsgType.SNACK_DLG:
                    self.createProcess(snake_main.main)

                if msg.msgtype == MsgType.WEATHER_DLG:
                    self.createProcess(weatherApp.main)

                if msg.msgtype == MsgType.CHAT_DLG:
                    s_queue = multiprocessing.Queue(3)
                    r_queue = multiprocessing.Queue(3)
                    chatdlg_id = MsgType.CHAT_DLG + '_%s' % msg.msg[0]
                    p = multiprocessing.Process(
                        target=myDlg.friendListDlg.createChatDlg,
                        args=(
                            r_queue,
                            s_queue,
                            self.client.user,
                            msg.msg[0],
                        ),
                        name=chatdlg_id)
                    p.daemon = True
                    p.start()
                    self.processingList.append([p, r_queue, s_queue])

                if msg.msgtype == MsgType.TETRIS_DLG:
                    self.createProcess(tetris.run)

            if msg.type in [
                    MsgType.MSG_CALENDAR, MsgType.MSG_SNACK,
                    MsgType.MSG_TETRIS, MsgType.MSG_WEATHER
            ]:
                if msg.msgtype == MsgType.CLOSE_DLG:
                    application.dlg_msg_queue.put(msg)

            elif msg.type == MsgType.MSG_SOCKET:
                if msg.msgtype == MsgType.CLOSE:
                    self.unconnect_server()

                if msg.msgtype in [MsgType.FAILURE, MsgType.SUCCESS]:
                    application.dlg_msg_queue.put(msg)

            elif msg.type == MsgType.MSG_CHAT:
                p = self.get_chat_processing(MsgType.CHAT_DLG +
                                             '_%s' % msg.msg[0])
                if p:
                    p[2].put(msg)
                else:
                    print('no find chat dlg:', msg)

        else:
            for i in self.processingList:
                if not i[1].empty():
                    msg = i[1].get()
                    if msg.type in [
                            MsgType.MSG_CALENDAR, MsgType.MSG_WEATHER,
                            MsgType.MSG_SNACK, MsgType.MSG_TETRIS,
                            MsgType.MSG_CHAT
                    ]:
                        if msg.msgtype == MsgType.CLOSE_DLG:
                            i[0].join()
                            self.processingList.remove(i)
                            application.dlg_msg_queue.put(msg)

                        if msg.msgtype == MsgType.CHAT_ORGIN_DATA:
                            self.client.send_data(UserID('user', msg.msg[0]),
                                                  msg.msg[1])
Ejemplo n.º 17
0
 def closeEvent(self, QCloseEvent):
     msg_dict = MsgType(type=MsgType.MSG_FRIENDLIST,msgtype=MsgType.CLOSE_DLG)
     self.send_queue.put(msg_dict)
     QCloseEvent.ignore()