示例#1
0
文件: bot.py 项目: RcdFdz/IRC-Bot
	def register(self, e, cmd):
		nick = e.source.nick
		c = self.connection
		cmdSplit = cmd.split(" ")
		passwd = cmdSplit[1]
		if len(cmdSplit) > 1: 
			if login.isUserRegistred(nick):
				c.privmsg(nick, "The user '" + nick + "' already exists!")
			else:
				login.register(nick, passwd)
				c.privmsg(nick, "Done! Now you can use 'identify'")
		else:
			c.privmsg(nick, "Your command is incorrect, use: register <pass>")
示例#2
0
def welcome():
    print("*" * 30)
    print("Quiz Game".center(30, "*"))
    print("*" * 30)
    print(" 1. Login and Play".center(30, "*"))
    print(" 2. Register ".center(30, "*"))
    print(" 3. Leaderboard ".center(30, "*"))
    print(" 4. Exit".center(30, "*"))
    print("*" * 30)
    n = int(input("Enter a number >>"))
    if n == 1:
        players = login.login()
    if n == 2:
        login.register()
        welcome()
    if n == 3:
        return leaderboard()
    if n == 4:
        return exit()
    if players:
        game(players[0], players[1])
    else:
        welcome()
示例#3
0
def register():
    if request.method == "GET":
        return render_template("register.html")
    else:
        usern = request.form["Username"].encode('ascii', 'ignore')
        passw = request.form["Password required"].encode('ascii', 'ignore')
        cpassw = request.form["Confirm Password"].encode('ascii', 'ignore')
        if cpassw == passw:
            if lawgin.register(usern, passw):
                return redirect("/login")
            else:
                return redirect("/error")
        else:
            return redirect("/error")
def register():
    if request.method == "GET":
        return render_template ("register.html")
    else:
        usern = request.form["Username"].encode('ascii','ignore')
        passw = request.form["Password required"].encode('ascii','ignore')
        cpassw = request.form["Confirm Password"].encode('ascii','ignore')
	if cpassw == passw:
		if lawgin.register(usern,passw):
			return redirect ("/login")
		else:
			return redirect ("/error")
	else:
		return redirect ("/error")
示例#5
0
 def app_loop(self):
     Exit = False
     print(
         '''Hello, Welcome to JavinDrive.\nFor assistance please type help into the command'''
     )
     while not Exit:
         user_input = input('JavinDrive: ')
         if user_input == 'help':
             print('help,quit,login,register,logout')
         if user_input == 'quit':
             Exit = True
         if user_input == 'login':
             if self.user != None:
                 print(self.user + ' is logged on already.')
             else:
                 try:
                     self.user, self.name = login.logScreen(
                         self.conn, self.cursor)
                 except:
                     pass
         if user_input == 'register':
             if self.user == None:
                 try:
                     self.user, self.name = login.register(
                         self.conn, self.cursor)
                 except:
                     pass
             else:
                 print(self.user + ' is logged on already.')
         if user_input == 'logout':
             self.user = None
             self.name = None
             print('Logged out')
         if user_input == 'menu':
             self.menu.showMenu()
         if user_input == 'offer ride':
             rides.offerRide(self.user, self.conn, self.cursor)
         if user_input == 'search ride':
             rides.searchRide(self.user, self.conn, self.cursor)
         if user_input == 'post request':
             requests.postRequest(self.user, self.conn, self.cursor)
         if user_input == 'delete request':
             requests.deleteRequest(self.user, self.conn, self.cursor)
         if user_input == 'take request':
             requests.searchRequest(self.user, self.conn, self.cursor)
         if user_input == 'book member':
             bookings.bookMembers(self.user, self.conn, self.cursor)
         if user_input == 'cancel booking':
             bookings.cancelBook(self.user, self.conn, self.cursor)
示例#6
0
def register_process():
    if request.method == 'POST':
        user = json.loads(request.data)

        username = user['login']
        password = user['password']
        user_id = login.register(username, password)
        if user_id:
            login.login(username, password)
            session['username'] = username
            session['logged_in'] = True
            session['user_id'] = user_id
            return json.dumps({'success': True})
        else:
            return json.dumps({'success': 'in_use'})
示例#7
0
 def register(self, user_name, passwd):
     p = self.do_find_same(user_name, passwd)
     if p:
         return False
     # 加密处理
     hash = hashlib.md5((user_name + "the-salt").encode())
     hash.update(passwd.encode())
     try:
         sql = login.register(self.table, user_name, hash.hexdigest())
         self.cur.execute(sql)
         self.db.commit()
         return True
     except Exception as e:
         self.db.rollback()
         print('Failed:', e)
         return False
     pass
示例#8
0
def register():
    #To be improved
    session.pop('user', None)
    if request.method == 'GET':
        return render_template('register.html')
    else:
        username = request.form['username']
        password = request.form['password']
        state = login.register(connHolder.conn, username, password)
        if state is True:  #state is either 'True' or a string with error message
            session['user'] = username
            return flask.redirect('/dashboard')
        else:
            return flask.redirect(
                url_for('.custom',
                        message="Error: " + str(state),
                        type="register"))
def register():
    if request.method == "POST":
        if request.form['b'] == "Logout":
            return logout()
        user = request.form["username"]
        pword = request.form["password"]
        pword2 = request.form["confirm_password"]
        name = request.form["name"]
        msg = login.register(user,pword,pword2,name)
        if msg == "Successfully registered.":
            return redirect(url_for("home"))
        else:
            return render_template("register.html",message=msg)
    else:
        if "user" in session:
            return render_template("textwithlogout.html",message="You are already logged in.")
        return render_template("register.html")
示例#10
0
def main_account_screen():
    global main_screen
    main_screen = Tk()
    main_screen.geometry("300x250")
    main_screen.title("Okno logowania")
    Label(text="Wybierz logowanie albo rejestracja",
          bg="#49A",
          width="300",
          height="2",
          font=("Arial", 13)).pack()
    Label(text="").pack()
    Button(text="Logowanie",
           height="2",
           width="30",
           command=lambda: login.login(main_screen)).pack()
    Label(text="").pack()
    Button(text="Rejestracja",
           height="2",
           width="30",
           command=lambda: login.register(main_screen)).pack()

    main_screen.mainloop()
示例#11
0
    def rsubmit():
        if request.method == "POST":
            rname = request.form["rname"]
            rpass = request.form["rpass"]
            remail = request.form["remail"]
            print(rname, rpass, remail)
        if rname == "" or rpass == "" or remail == "":
            flash("Fill out all fields!")
            return redirect(url_for("mainPage"))

        reg = login.register(rname, rpass)
        if reg == "user_exists":
            flash("User already exists!", "info")
            return redirect(url_for("mainPage"))

        with open("users.json", "r") as ur:
            cf = json.load(ur)
        cf[list(cf)[0]].append(remail)
        with open("users.json", "w") as uf:
            json.dump(cf, uf)

        session["current_page"] = "home"
        return redirect(url_for("mainPage"))
示例#12
0
    print('\t' + "╔" + "═" * 62 + "╗")
    print('\t' + "║" + " " * 62 + "║")
    print('\t' + "║" + " " * 24 + "GoodUniversity" + " " * 24 + "║")
    print('\t' + "║" + " " * 62 + "║")
    print('\t' + "╠" + "═" * 62 + "╣")
    print('\t' + "║" + " " * 2 + listGenrator.lenFit(str(getTime.persianDate() + " | " + getTime.time()), 60) + "║")
    print('\t' + "╠" + "═" * 62 + "╣")
    print('\t' + "║" + "  Please choose from the menu:" + " " * 32 + "║")
    print('\t' + "║" + " " * 62 + "║")
    print('\t' + "║" + "    L : Login" + " " * 49 + "║")
    print('\t' + "║" + "    R : Register" + " " * 46 + "║")
    print('\t' + "║" + "    E : Exit" + " " * 50 + "║")
    print('\t' + "║" + " " * 62 + "║")
    print('\t' + "╚" + "═" * 62 + "╝")

    request = str(input("             Your request:"))
    if request == 'R' or request == 'r':
        typeof = str(input("             Your type:"))
        username = str(input("             Your username:"******"             Your password:"******"             Username:"******"             Password:"******"005"))
示例#13
0
	def run(self):
		inputs = [self.sock]
		outputs = []
		msgQueues = {}
		while self.runFlag:
			readable,writable,exceptional=select.select(inputs,outputs,inputs,0.1)
			for s in readable:
				if s is self.sock:
					conn,cli_addr = s.accept()
					conn.setblocking(0)
					print "connection from",cli_addr
					inputs.append(conn)
					msgQueues[conn]=Queue.Queue()
				else:#connection is created
					data = s.recv(1024)
					if data:
						#print "received ",data," from ", s.getpeername()
                                                #print data
						a,b,c,d = struct.unpack(DGRAM_FORMAT,data)
						a = a.strip("\x00")
						#注册新用户
						if a=='SIGN_IN':
                                                        user_no = login.register(b.strip("\x00"),c.strip("\x00"),d.strip("\x00"))
                                                        print u"随机生成一个OC号:",user_no
                                                        user_no = "%i" %user_no
                                                        msgQueues[s].put(user_no)
                                                        friends.addFriend(user_no,user_no)
                                                #登录验证
                                                elif a=='LOGIN':
                                                        uno = b.strip("\x00")
                                                        reply = login.loginCheck(uno,c.strip("\x00"))
                                                        msgQueues[s].put(reply)
                                                        if reply!="LOGIN FAIL":#登录成功
                                                                self.onlineUser.append(uno)
                                                                sdata = struct.pack("50s50s50s","UP",uno,"")
                                                                for kno in self.cmd_sock:
                                                                        if self.cmd_sock[kno] in msgQueues:
                                                                                msgQueues[self.cmd_sock[kno]].put(sdata)
                                                #客户端下线通知
                                                elif a =='DOWN':
                                                        uno = b.strip("\x00")
                                                        print u"%s下线通知" %uno
                                                        if uno in self.onlineUser:
                                                                self.onlineUser.remove(uno)
                                                        if uno in self.sessions:
                                                                for fno in self.sessions[uno]:
                                                                        usock = self.sessions[uno][fno]
                                                                        if usock:
                                                                                usock.close()
                                                                        self.sessions.pop(uno)
        
                                                        sdata = struct.pack("50s50s50s","DOWN",uno,"")
                                                        for kno in self.cmd_sock:
                                                                if self.cmd_sock[kno] in msgQueues:
                                                                        msgQueues[self.cmd_sock[kno]].put(sdata)
                                                #每个客户端一个cmd socket
                                                elif a=='CMD_SOCKET':
                                                        uno = b.strip('\x00')
                                                        self.cmd_sock[uno]=s
                                                #查找好友列表,返回user_no, nickname
                                                elif a=='GET_FRIENDS':
                                                        reply = friends.getFriends(b.strip("\x00"))
                                                        msgQueues[s].put(reply)
                                                #获取当前在线的所账号
                                                elif a=='GET_ONLINE':
                                                        reply = "OK"+self.getOnline()
                                                        msgQueues[s].put(reply)
                                                #查找好友
                                                elif a=='FIND_FRIEND':
                                                        reply = friends.findFriend(b.strip("\x00"))
                                                        msgQueues[s].put(reply)
                                                #添加好友,双向添加,默认不提示被动添加的一方
                                                elif a=='ADD_FRIEND':
                                                        uno = b.strip("\x00")
                                                        fno = c.strip("\x00")
                                                        
                                                        reply = friends.addFriend(fno,uno)
                                                        reply = friends.addFriend(uno,fno)
                                                        if reply == 'ADD_SUCCESS':
                                                                ret = friends.findFriend(fno)
                                                                fnick=ret.split('[')[1].split(']')[0]
                                                                state = "OFFLINE"
                                                                if fno in self.onlineUser:
                                                                        state = 'ONLINE'
                                                                reply = u"%s|%s|%s" %(fno,fnick,state)
                                                        msgQueues[s].put(reply)
                                                        

                                                #查找离线消息,返回send_user_no, msg
                                                elif a=='OFFLINE_MSG':
                                                        uno = b.strip('\x00')
                                                        sdata = message.getOfflineMsg(uno)
                                                        print u"离线消息:%s" %sdata
                                                        msgQueues[s].put(sdata)
                                                #建立会话、或接收会话
                                                elif a=='NEW_SESSION':
                                                        #or a=='ACC_SESSION':
                                                        user_no = b.strip("\x00")
                                                        friend_no = c.strip("\x00")
                                                        if user_no not in self.sessions.keys():
                                                                self.sessions[user_no]={}
                                                        self.sessions[user_no][friend_no] = s
                                                        print "new session between %s and %s" %(user_no,friend_no)
                                                                
                                                #转发消息
                                                elif a=='MESG':
                                                        user_no = b.strip("\x00")
                                                        friend_no = c.strip("\x00")
                                                        msg = d.strip('\x00')
                                                        print u"to %s: %s" %(friend_no,msg)
                                                        if friend_no not in self.onlineUser:
                                                                #写入离线消息文件,并提示
                                                                message.saveOfflineMsg(user_no,friend_no,msg)
                                                                msg = u"%s处于离线状态!" %friend_no
                                                                msgQueues[self.sessions[user_no][friend_no]].put(msg)
                                                                
                                                        else:
                                                                #如果friend_no和user_no还没有建立会话,那么先建立socket
                                                                if friend_no not in self.sessions.keys() or \
                                                                   user_no not in self.sessions[friend_no].keys():
                                                                        fsock = self.cmd_sock[friend_no]
                                                                        print "... cmd socket ",friend_no,fsock.getpeername()
                                                                        sdata = struct.pack("50s50s50s","NEW_SESSION",str(user_no),msg)
                                                                        msgQueues[fsock].put(sdata)
                                                                        print "MESG....deubg"
                                                                else:
                                                                        msgQueues[self.sessions[friend_no][user_no]].put(msg)
                                                                message.write2file(user_no,friend_no,msg)
                                                #上传文件
                                                elif a=='UPLOAD':
                                                        b = b.strip('\x00')
                                                        if len(b)==6:
                                                                sno = b.strip('\x00')
                                                                rno = c.strip('\x00')
                                                                fname = d.strip('\x00')
                                                                #print fname
                                                                msgQueues[self.sessions[sno][rno]].put(u"正在上传...")

                                                                msgQueues[s].put("RECV_NOTICE")
                                                                files.recordFileInfo(sno,rno,fname)
                                                        else:
                                                                dlen = string.atoi(b)
                                                                fname = c.strip('\x00')
                                                                cont = d
                                                                files.write2file(fname,cont[0:dlen])
                                                                msgQueues[s].put("RECV_OK")
                                                #上传完成
                                                elif a=='UPLOAD_FINISH':
                                                        sno = b.strip('\x00')
                                                        rno = c.strip('\x00')
                                                        fname = d.strip('\x00')
                                                        if rno in self.sessions and sno in self.sessions[rno]:
                                                                sdata = u"FILE\r\n%s|%s" %(sno,fname)
                                                                msgQueues[self.sessions[rno][sno]].put(sdata)
                                                        elif rno in self.onlineUser:
                                                                fsock = self.cmd_sock[rno]
                                                                print "... cmd socket ",rno,fsock.getpeername()
                                                                msg = u"%s正在向你传送文件:%s" %(sno,fname)
                                                                sdata = struct.pack("50s50s50s","NEW_SESSION",str(sno),str(msg))
                                                                msgQueues[fsock].put(sdata)
                                                                print "FILE....deubg"
                                                                
                                                                
                                                #可以下载的离线文件
                                                elif a=='DOWN_FILE_NAME':
                                                        fnames = files.getFileLists(b.strip("\x00"),c.strip("\x00"))
                                                        msgQueues[s].put(fnames)
                                                elif a=='DOWNLOAD':
                                                        fname = b.strip('\x00')
                                                        recvd_bytes = string.atoi(d.strip('\x00'))
                                                        if c.strip('\x00')=="RECV_OK":
                                                                rdata = files.getFileContent(fname,recvd_bytes,1024)
                                                                if len(rdata)<1:
                                                                        rdata = 'FILE_END\r\n'
                                                                msgQueues[s].put(rdata)
						if s not in outputs:
							outputs.append(s)
					else:
						print u"关闭socket: ", s.getpeername()
						if s in outputs:
							outputs.remove(s)
						for k1 in self.sessions.keys():
                                                        for k2 in self.sessions[k1].keys():
                                                                if self.sessions[k1][k2]==s:
                                                                        self.sessions[k1].pop(k2)
                                                                        break
						inputs.remove(s)
						s.close()
						del msgQueues[s]
			for s in writable:
                                if s not in msgQueues:
                                        continue
				try:
                                        nextMsg = msgQueues[s].get_nowait()
                                        #print u"sending %s to %s" %(nextMsg,s.getpeername())
                                        s.send(nextMsg)
				except Queue.Empty:
                                        pass
                                        
			for s in exceptional:
				print "exceptional condition on ",s.getpeername()
				inputs.remove(s)
				if s in outputs:
					outputs.remove(s)
				s.close()
				del msgQueues[s]
示例#14
0
while True:

    populate()

    ANS1 = ['1', '2']
    ans = None

    print('\nHi visitor!')

    while ans not in ANS1:
        print(f'possible actions:')
        ans = input('1. Register \n2. Sign in\nplease choose :')

    if ans == '1':
        active_user = register()
    else:
        active_user = sign_in()

    ans = None

    if active_user.role == 'user':
        ANS2 = ['1', '2']

        while ans not in ANS2 and ans != '2':
            print(f'possible actions:')
            ans = input('1. Add post \n2. Sign out\nplease choose :')

            if ans == '1':
                name = active_user.u_name
                title = input('type your post title: ')
示例#15
0
文件: server.py 项目: onestraw/pychat
    def run(self):
        self.sock = self.newSocket()
        inputs = [self.sock]
        outputs = []
        msgQueues = {}
        while self.runFlag:
            readable, writable, exceptional = \
                    select.select(inputs, outputs, inputs, 0.1)

            for s in readable:
                if s is self.sock:
                    conn, cli_addr = s.accept()
                    conn.setblocking(0)
                    logger.info('connection from {}'.format(cli_addr))
                    inputs.append(conn)
                    msgQueues[conn] = Queue.Queue()
                else:  # connection is created
                    data = s.recv(1024)
                    if data:
                        raw_fields = struct.unpack(DGRAM_FORMAT, data)
                        fields = [e.strip('\x00') for e in raw_fields]
                        a, b, c, d = fields
                        logger.debug('recv {} from {}'.format('#'.join(fields),
                                     s.getpeername()))

                        # 注册新用户
                        if a == 'SIGN_IN':
                            uid = login.register(b, c, d)
                            logger.info(u'随机生成一个OC号: {}'.format(uid))
                            msgQueues[s].put(uid)
                            friends.addFriend(uid, uid)

                        # 登录验证
                        elif a == 'LOGIN':
                            uid, pwd = b, c
                            reply = login.loginCheck(uid, pwd)
                            msgQueues[s].put(reply)
                            if reply != 'LOGIN FAIL':   # 登录成功
                                self.onlineUser.append(uid)
                                msg = struct.pack(CMD_FORMAT, 'UP', uid, '')
                                for kno in self.cmd_sock:
                                    if self.cmd_sock[kno] in msgQueues:
                                        msgQueues[self.cmd_sock[kno]].put(msg)

                        # 客户端下线通知
                        elif a == 'DOWN':
                            uid = b
                            logger.info(u'{} 下线通知'.format(uid))
                            if uid in self.onlineUser:
                                self.onlineUser.remove(uid)
                            if uid in self.sessions:
                                for fid in self.sessions[uid]:
                                    usock = self.sessions[uid][fid]
                                    if usock:
                                        usock.close()
                                self.sessions.pop(uid)

                            sdata = struct.pack(CMD_FORMAT, 'DOWN', uid, '')
                            for kno in self.cmd_sock:
                                if self.cmd_sock[kno] in msgQueues:
                                    msgQueues[self.cmd_sock[kno]].put(sdata)

                        # 每个客户端一个cmd socket
                        elif a == 'CMD_SOCKET':
                            uid = b
                            self.cmd_sock[uid] = s

                        # 查找好友列表,返回uid, nickname
                        elif a == 'GET_FRIENDS':
                            reply = friends.getFriends(b)
                            msgQueues[s].put(reply)

                        # 获取当前在线的所账号
                        elif a == 'GET_ONLINE':
                            ou = '|'.join(self.onlineUser)
                            reply = 'OK|' + ou
                            msgQueues[s].put(reply)

                        # 查找好友
                        elif a == 'FIND_FRIEND':
                            reply = friends.findFriend(b)
                            msgQueues[s].put(reply)

                        # 添加好友,双向添加,默认不提示被动添加的一方
                        elif a == 'ADD_FRIEND':
                            uid, fid = b, c

                            reply = friends.addFriend(uid, fid)
                            if reply == 'ADD_SUCCESS':
                                reply = friends.addFriend(fid, uid)
                                ret = friends.findFriend(fid)
                                fnick = ret.split('[')[1].split(']')[0]
                                state = 'OFFLINE'
                                if fid in self.onlineUser:
                                    state = 'ONLINE'

                                reply = u'{}|{}|{}'.format(fid, fnick, state)
                                msgQueues[s].put(reply)
                            else:
                                msgQueues[s].put(reply)

                        # 查找离线消息,返回send_uid, msg
                        elif a == 'OFFLINE_MSG':
                            uid = b
                            sdata = message.getOfflineMsg(uid)
                            logger.info(u'离线消息:{}'.format(sdata))
                            msgQueues[s].put(sdata)

                        # 建立会话、或接收会话
                        elif a == 'NEW_SESSION':
                            uid, fid = b, c
                            if uid not in self.sessions.keys():
                                self.sessions[uid] = {}
                            self.sessions[uid][fid] = s
                            logger.info('new session between {} and {}'.format(uid, fid))

                        # 转发消息
                        elif a == 'MESG':
                            uid, fid, msg = b, c, d
                            logger.info(u'to {}: {}'.format(fid, msg))
                            if fid not in self.onlineUser:
                                # 写入离线消息文件,并提示
                                message.saveOfflineMsg(uid, fid, msg)
                                msg = u'{}处于离线状态!'.format(fid)
                                msgQueues[self.sessions[uid][fid]].put(msg)
                            else:
                                # 如果fid和uid还没有建立会话,那么先建立socket
                                if fid not in self.sessions.keys() or \
                                        uid not in self.sessions[fid].keys():
                                    fsock = self.cmd_sock[fid]
                                    logger.info('... cmd socket {} {}'.format(
                                                fid, fsock.getpeername()))
                                    sdata = struct.pack(CMD_FORMAT,
                                                        'NEW_SESSION',
                                                        str(uid),
                                                        msg)
                                    msgQueues[fsock].put(sdata)
                                    logger.debug('MESG....deubg')
                                else:
                                    msgQueues[self.sessions[fid][uid]].put(msg)

                                message.write2file(uid, fid, msg)

                        # 上传文件
                        elif a == 'UPLOAD':
                            if len(b) == 6 and len(c) == 6:  # todo: 区分upload cmd和data
                                send_uid, recv_uid, filename = b, c, d
                                msgQueues[self.sessions[send_uid][recv_uid]].\
                                    put(u'正在上传...')

                                msgQueues[s].put('RECV_NOTICE')
                                files.recordFileInfo(send_uid, recv_uid, filename)
                            else:
                                datalen = string.atoi(b)
                                filename, content = c, raw_fields[-1]
                                files.write2file(filename, content[0:datalen])
                                msgQueues[s].put('RECV_OK')

                        # 上传完成
                        elif a == 'UPLOAD_FINISH':
                            send_uid, recv_uid, filename = b, c, d

                            if recv_uid in self.sessions and \
                                    send_uid in self.sessions[recv_uid]:
                                sdata = u'FILE\r\n{}|{}'.format(send_uid, filename)
                                msgQueues[self.sessions[recv_uid][send_uid]].put(sdata)
                            elif recv_uid in self.onlineUser:
                                fsock = self.cmd_sock[recv_uid]
                                logger.info('... cmd socket {} {}'.format(
                                            recv_uid, fsock.getpeername()))
                                msg = u'{}正在向你传送文件:{}'.format(send_uid, filename)
                                sdata = struct.pack(CMD_FORMAT, 'NEW_SESSION',
                                                    send_uid, str(msg))
                                msgQueues[fsock].put(sdata)
                                logger.debug('FILE....deubg')

                        # 可以下载的离线文件
                        elif a == 'DOWN_FILE_NAME':
                            fs = files.getFileLists(b, c)
                            msgQueues[s].put(fs)
                        elif a == 'DOWNLOAD':
                            filename, status, size = b, c, d
                            recvd_bytes = string.atoi(size)
                            if status == 'RECV_OK':
                                rdata = files.getFileContent(filename, recvd_bytes, 1024)
                                if len(rdata) < 1:
                                    rdata = 'FILE_END\r\n'
                                msgQueues[s].put(rdata)

                        if s not in outputs:
                            outputs.append(s)
                    else:   # data is None
                        logger.info(u'关闭socket: {}'.format(s.getpeername()))
                        if s in outputs:
                            outputs.remove(s)
                        for k1 in self.sessions.keys():
                            for k2 in self.sessions[k1].keys():
                                if self.sessions[k1][k2] == s:
                                    self.sessions[k1].pop(k2)
                                    break
                        inputs.remove(s)
                        s.close()
                        del msgQueues[s]

            for s in writable:
                if s not in msgQueues:
                    continue
                try:
                    nextMsg = msgQueues[s].get_nowait()
                    s.send(nextMsg)
                except Queue.Empty:
                    pass

            for s in exceptional:
                logger.error('exceptional condition on {}'.format(s.getpeername()))
                inputs.remove(s)
                if s in outputs:
                    outputs.remove(s)
                s.close()
                del msgQueues[s]
示例#16
0
    def run(self):
        self.sock = self.newSocket()
        inputs = [self.sock]
        outputs = []
        msgQueues = {}
        while self.runFlag:
            readable, writable, exceptional = \
                    select.select(inputs, outputs, inputs, 0.1)

            for s in readable:
                if s is self.sock:
                    conn, cli_addr = s.accept()
                    conn.setblocking(0)
                    logger.info('connection from {}'.format(cli_addr))
                    inputs.append(conn)
                    msgQueues[conn] = Queue.Queue()
                else:  # connection is created
                    data = s.recv(1024)
                    if data:
                        raw_fields = struct.unpack(DGRAM_FORMAT, data)
                        fields = [e.strip('\x00') for e in raw_fields]
                        a, b, c, d = fields
                        logger.debug('recv {} from {}'.format(
                            '#'.join(fields), s.getpeername()))

                        # 注册新用户
                        if a == 'SIGN_IN':
                            uid = login.register(b, c, d)
                            logger.info(u'随机生成一个OC号: {}'.format(uid))
                            msgQueues[s].put(uid)
                            friends.addFriend(uid, uid)

                        # 登录验证
                        elif a == 'LOGIN':
                            uid, pwd = b, c
                            reply = login.loginCheck(uid, pwd)
                            msgQueues[s].put(reply)
                            if reply != 'LOGIN FAIL':  # 登录成功
                                self.onlineUser.append(uid)
                                msg = struct.pack(CMD_FORMAT, 'UP', uid, '')
                                for kno in self.cmd_sock:
                                    if self.cmd_sock[kno] in msgQueues:
                                        msgQueues[self.cmd_sock[kno]].put(msg)

                        # 客户端下线通知
                        elif a == 'DOWN':
                            uid = b
                            logger.info(u'{} 下线通知'.format(uid))
                            if uid in self.onlineUser:
                                self.onlineUser.remove(uid)
                            if uid in self.sessions:
                                for fid in self.sessions[uid]:
                                    usock = self.sessions[uid][fid]
                                    if usock:
                                        usock.close()
                                self.sessions.pop(uid)

                            sdata = struct.pack(CMD_FORMAT, 'DOWN', uid, '')
                            for kno in self.cmd_sock:
                                if self.cmd_sock[kno] in msgQueues:
                                    msgQueues[self.cmd_sock[kno]].put(sdata)

                        # 每个客户端一个cmd socket
                        elif a == 'CMD_SOCKET':
                            uid = b
                            self.cmd_sock[uid] = s

                        # 查找好友列表,返回uid, nickname
                        elif a == 'GET_FRIENDS':
                            reply = friends.getFriends(b)
                            msgQueues[s].put(reply)

                        # 获取当前在线的所账号
                        elif a == 'GET_ONLINE':
                            ou = '|'.join(self.onlineUser)
                            reply = 'OK|' + ou
                            msgQueues[s].put(reply)

                        # 查找好友
                        elif a == 'FIND_FRIEND':
                            reply = friends.findFriend(b)
                            msgQueues[s].put(reply)

                        # 添加好友,双向添加,默认不提示被动添加的一方
                        elif a == 'ADD_FRIEND':
                            uid, fid = b, c

                            reply = friends.addFriend(uid, fid)
                            if reply == 'ADD_SUCCESS':
                                reply = friends.addFriend(fid, uid)
                                ret = friends.findFriend(fid)
                                fnick = ret.split('[')[1].split(']')[0]
                                state = 'OFFLINE'
                                if fid in self.onlineUser:
                                    state = 'ONLINE'

                                reply = u'{}|{}|{}'.format(fid, fnick, state)
                                msgQueues[s].put(reply)
                            else:
                                msgQueues[s].put(reply)

                        # 查找离线消息,返回send_uid, msg
                        elif a == 'OFFLINE_MSG':
                            uid = b
                            sdata = message.getOfflineMsg(uid)
                            logger.info(u'离线消息:{}'.format(sdata))
                            msgQueues[s].put(sdata)

                        # 建立会话、或接收会话
                        elif a == 'NEW_SESSION':
                            uid, fid = b, c
                            if uid not in self.sessions.keys():
                                self.sessions[uid] = {}
                            self.sessions[uid][fid] = s
                            logger.info('new session between {} and {}'.format(
                                uid, fid))

                        # 转发消息
                        elif a == 'MESG':
                            uid, fid, msg = b, c, d
                            logger.info(u'to {}: {}'.format(fid, msg))
                            if fid not in self.onlineUser:
                                # 写入离线消息文件,并提示
                                message.saveOfflineMsg(uid, fid, msg)
                                msg = u'{}处于离线状态!'.format(fid)
                                msgQueues[self.sessions[uid][fid]].put(msg)
                            else:
                                # 如果fid和uid还没有建立会话,那么先建立socket
                                if fid not in self.sessions.keys() or \
                                        uid not in self.sessions[fid].keys():
                                    fsock = self.cmd_sock[fid]
                                    logger.info('... cmd socket {} {}'.format(
                                        fid, fsock.getpeername()))
                                    sdata = struct.pack(
                                        CMD_FORMAT, 'NEW_SESSION', str(uid),
                                        msg)
                                    msgQueues[fsock].put(sdata)
                                    logger.debug('MESG....deubg')
                                else:
                                    msgQueues[self.sessions[fid][uid]].put(msg)

                                message.write2file(uid, fid, msg)

                        # 上传文件
                        elif a == 'UPLOAD':
                            if len(b) == 6 and len(
                                    c) == 6:  # todo: 区分upload cmd和data
                                send_uid, recv_uid, filename = b, c, d
                                msgQueues[self.sessions[send_uid][recv_uid]].\
                                    put(u'正在上传...')

                                msgQueues[s].put('RECV_NOTICE')
                                files.recordFileInfo(send_uid, recv_uid,
                                                     filename)
                            else:
                                datalen = string.atoi(b)
                                filename, content = c, raw_fields[-1]
                                files.write2file(filename, content[0:datalen])
                                msgQueues[s].put('RECV_OK')

                        # 上传完成
                        elif a == 'UPLOAD_FINISH':
                            send_uid, recv_uid, filename = b, c, d

                            if recv_uid in self.sessions and \
                                    send_uid in self.sessions[recv_uid]:
                                sdata = u'FILE\r\n{}|{}'.format(
                                    send_uid, filename)
                                msgQueues[self.sessions[recv_uid]
                                          [send_uid]].put(sdata)
                            elif recv_uid in self.onlineUser:
                                fsock = self.cmd_sock[recv_uid]
                                logger.info('... cmd socket {} {}'.format(
                                    recv_uid, fsock.getpeername()))
                                msg = u'{}正在向你传送文件:{}'.format(
                                    send_uid, filename)
                                sdata = struct.pack(CMD_FORMAT, 'NEW_SESSION',
                                                    send_uid, str(msg))
                                msgQueues[fsock].put(sdata)
                                logger.debug('FILE....deubg')

                        # 可以下载的离线文件
                        elif a == 'DOWN_FILE_NAME':
                            fs = files.getFileLists(b, c)
                            msgQueues[s].put(fs)
                        elif a == 'DOWNLOAD':
                            filename, status, size = b, c, d
                            recvd_bytes = string.atoi(size)
                            if status == 'RECV_OK':
                                rdata = files.getFileContent(
                                    filename, recvd_bytes, 1024)
                                if len(rdata) < 1:
                                    rdata = 'FILE_END\r\n'
                                msgQueues[s].put(rdata)

                        if s not in outputs:
                            outputs.append(s)
                    else:  # data is None
                        logger.info(u'关闭socket: {}'.format(s.getpeername()))
                        if s in outputs:
                            outputs.remove(s)
                        for k1 in self.sessions.keys():
                            for k2 in self.sessions[k1].keys():
                                if self.sessions[k1][k2] == s:
                                    self.sessions[k1].pop(k2)
                                    break
                        inputs.remove(s)
                        s.close()
                        del msgQueues[s]

            for s in writable:
                if s not in msgQueues:
                    continue
                try:
                    nextMsg = msgQueues[s].get_nowait()
                    s.send(nextMsg)
                except Queue.Empty:
                    pass

            for s in exceptional:
                logger.error('exceptional condition on {}'.format(
                    s.getpeername()))
                inputs.remove(s)
                if s in outputs:
                    outputs.remove(s)
                s.close()
                del msgQueues[s]