0
\$\begingroup\$

I just finished working on a personal project, it is a sort of email type program where you create an account and you can message people, the code works (as far as I’m aware) but it requires review, different areas have different indents, I add more variable than I need, I print things that don’t need to be printed and probably way more than that.

(I realise that it will say import getpass ,and have nothing for it in the code , that is because i forgot to change the password inputs to getpass inputs before putting it on my drive.)

Where the code is located in your files you need a folder called Data with txt files: accountIDs, addCommandList, isAdmin, names, nicknames, passwords.

A folder called messages in it a folder called received.

import random
from random import *
import datetime
import string
import os
import getpass
global usernames
global passwords
global jointPassList
usernames = [line.strip()for line in open('Data/names.txt', 'r')]
passwords = [line.strip()for line in open('Data/passwords.txt', 'r')]
isAdmin = [line.strip()for line in open('Data/isAdmin.txt', 'r')]
accountIDs = [line.strip()for line in open('Data/accountIDs.txt', 'r')]
nicknames = [line.strip()for line in open('Data/nicknames.txt', 'r')]
jointPassList ='\n'.join(map(str, passwords))

def main():
                print('\n')
                print('\n')
                print('/help (1/2) for help')
                currentUserIndex = usernames.index(ascname)
                command =input('>>>')
                if command =='/help':

                                print('/signout       | sign out\n/details        | account details\n/setpas        | set password\n/userlist     | all users\n/mymessages | your messages\n/message | message\n/addcommand | add command')
                                input()
                                main()
                if command =='/details':

                                print('Name:      ', ascname)
                                print('AccountID: ', accountIDs[currentUserIndex])
                                print('Nickname:  ', nicknames[currentUserIndex])
                                input()
                                main()
                if command =='/setpas':

                                newpas =input('Enter your new password: ')
                                passwords[currentUserIndex] = newpas
                                jointPassList ='\n'.join(map(str, passwords))
                                openfile =open('Data/passwords.txt', 'w')
                                openfile.write(jointPassList)
                                openfile.close()                      
                                input()
                                main()
                if command =='/userlist':
                                userlist =open('Data/names.txt').read()
                                print(userlist)
                                input()
                                main()
                if command =='/message':
                                whatuser =input('What user: ')
                                if whatuser in usernames:
                                    message =input('What message would you like to send: ')
                                    openfile =open('Data/messages/recieved/'+whatuser+'.txt', 'a')
                                    date = str(datetime.datetime.now())
                                    openfile.write(date + ' : ')
                                    openfile.write(message+'\n')
                                    openfile.close()
                                    input()
                                    main()

                                elif whatuser not in usernames:
                                                print('Nobody was found.')
                                                input()
                                                main()

                if command =='/mymessages':
                                messagesList = [line.strip()for line in open('Data/messages/recieved/'+ascname+'.txt', 'r')]
                                messages = '\n'.join(messagesList)
                                print(messages)
                                input()
                                main()

                if command =='/addcommand':
                                openfile =open('Data/addCommandList.txt', 'a')
                                addcommand =input('What would you like see added to this database: ')
                                openfile.write(addcommand+'\n')
                                openfile.close()
                                input()
                                main()

                if command =='/admin':
                                print(isAdmin[currentUserIndex])                               
                                if isAdmin[currentUserIndex] =='True':
                                                print('Nice :)')
                                                input()
                                                main()

                                elif isAdmin[currentUserIndex] =='False':
                                                print('You are not an Admin')
                                                change =input()
                                                if change =='False':
                                                                isAdmin[currentUserIndex] = True
                                                                main()
                                                else:
                                                                main()

                                if isAdmin[currentUserIndex] =='False':
                                                delete =input('Are you sure you would like to delete your account: ')
                                                if delete =='y':
                                                                accountIDs.remove(accountIDs[currentUserIndex])
                                                                isAdmin.remove(isAdmin[currentUserIndex])
                                                                usernames.remove(usernames[currentUserIndex])
                                                                passwords.remove(passwords[currentUserIndex])
                                                                nicknames.remove(nicknames[currentUserIndex])
                                                                os.remove('Data/messages/recieved/'+ascname+'.txt')
                                                                openfile = open('Data/names.txt', 'w')
                                                                openfile.write(name + '\n')
                                                                openfile.close()

                                                                openfile = open('Data/accountIDs.txt', 'w')
                                                                openfile.write(str(accountID) + '\n')
                                                                openfile.close()

                                                                openfile = open('Data/nicknames.txt', 'w')
                                                                openfile.write(nickname + '\n')
                                                                openfile.close()

                                                                openfile = open('Data/passwords.txt', 'w')
                                                                openfile.write(password + '\n')
                                                                openfile.close()

                                                                openfile = open('Data/isAdmin.txt', 'w')
                                                                openfile.write(adminFalse + '\n')
                                                                openfile.close()
                                                                print('Complete...')
                                                                signin()


                if command =='/signout':

                                areYouSure =input('Are you sure you would like to sign out(y/n): ')
                                if areYouSure =='y':
                                                print('Signing out\n.\n.\n.')
                                                signin()
                                elif areYouSure =='n':
                                                main()
                                else:
                                                main()


                else:
                                print(command, 'is not a command in our library, type /addcommand to request new command.')
                                input()
                                main()

def signin():
                existingAccount =input('Do you have an existing account (y/n): ')
                if existingAccount =='y':
                                global ascname
                                global ascpass
                                ascname =input('Enter your username: ')
                                currentUsername = ascname
                                if ascname in usernames:
                                                userIndex = usernames.index(ascname)
                                                print('Correct username.')
                                                ascpass =input('Enter your password: ')
                                                while ascpass in passwords:
                                                                passcheck = passwords.index(ascpass)
                                                                if userIndex == passcheck:
                                                                                print('welcome back', ascname + '.')
                                                                                main()

                                                                else:
                                                                                wrongPass =input('Incorrect password.')
                                                                                input()
                                                                                signin()
                                                print('Yes')
                                                wrongPass =input('Incorrect password.')
                                                input()
                                                signin()
                                elif ascname not in usernames:
                                                wrongName =input('Incorrect username.')
                                                input()
                                                signin()
                                else:
                                                #debuging
                                                print('Error')
                                                singin()

                elif existingAccount =='n':
                                name =str(input('Enter your name: '))
                                while len(name) == 0:
                                                name =input("You haven't entered anything, try again.")
                                                input()
                                                signin()
                                if name in open('Data/names.txt').read():
                                                name =input('That name already exists.')
                                                input()
                                                signin()
                                usernames.append(name)
                                password =input('Enter your new password: ')
                                while len(password) < 4:
                                                password =input('Your password must be 5 characters long.')
                                                input()
                                                signin()
                                passwords.append(password)

                                nickname =input('Enter your nickname: ')
                                accountID =random()
                                while accountID in accountIDs:
                                                accountID =random()

                                adminFalse = str(False)
                                isAdmin.append(adminFalse)

                                openfile = open('Data/messages/recieved/' +name+ '.txt',  'w+')
                                openfile.write('\n')
                                openfile.close()

                                openfile = open('Data/names.txt', 'a')
                                openfile.write(name + '\n')
                                openfile.close()

                                openfile = open('Data/accountIDs.txt', 'a')
                                openfile.write(str(accountID) + '\n')
                                openfile.close()

                                openfile = open('Data/nicknames.txt', 'a')
                                openfile.write(nickname + '\n')
                                openfile.close()

                                openfile = open('Data/passwords.txt', 'a')
                                openfile.write(password + '\n')
                                openfile.close()

                                openfile = open('Data/isAdmin.txt', 'a')
                                openfile.write(adminFalse + '\n')
                                openfile.close()



                                signin()

                else:
                                signin()

signin()
\$\endgroup\$
  • 6
    \$\begingroup\$ Why don't you clean up the things that you know should be cleaned up (such as indentation) before asking for our advice? \$\endgroup\$ – 200_success Mar 23 at 14:49
  • \$\begingroup\$ Thank you Emma for the edit, I am very new to this. There were no incorrect indents and i have added comments. \$\endgroup\$ – King_0_king Mar 23 at 18:24
  • 2
    \$\begingroup\$ An answer was written while you proposed changes, invalidating the edit. This is not a forum where you should keep the most updated version in your question. Please see what you may and may not do after receiving answers. Feel free to incorporate the suggested changes and post a follow-up question instead. Please note, it may be beneficial to wait at least 2 days before doing so. \$\endgroup\$ – Mast Mar 23 at 19:11
5
\$\begingroup\$
  1. Ban yourself from recursion. If you're in the function main don't call main. What you want is to have a while True loop and to use continue.

    while True:
        ...
        if invalid_username:
            continue
        ...
    
  2. json is likely to make your code much easier to use. As you don't have to have 5 lists for five attributes on a user.

  3. cmd.Cmd is probably what you want to use. This is as you can put all your functions in their own functions and you can focus on what the code does.
  4. Your code has a lot of useless print input and other nonsense statements. Follow he Unix way and remove them.
  5. Global variables are bad. Whilst the changes I'll recommend still use them, I've hidden them behind properties on a class. Which encourages safer programming practices.
  6. You should keep the database in memory, and ensure it's written to when the program ends. You can do this via try finally.
  7. I've partially changed your program to use cmd.Cmd, changing signin to also be one is up to you. I encourage you to look at the docs as the builtin help command is nice.
  8. Wrap your main code in an if __name__ == '__main__' guard.
import random
from random import *
import datetime
import cmd
import json
from pprint import pprint

try:
    f = open('Data.json')
except FileNotFoundError:
    with open('Data.json', 'w') as w:
        json.dump({}, w)
    f = open('Data.json')
finally:
    with f:
        database = json.load(f)
        database.setdefault('users', [])
        data = database.setdefault('data', {})
        data.setdefault('command_list', [])
user = None


def find_user_name(database, name):
    for user in database['users']:
        if user['name'] == name:
            return user
    return None


class Main(cmd.Cmd):
    prompt = '>>> '

    @property
    def user(self):
        return user

    @property
    def database(self):
        return database

    def do_details(self, arg):
        print('Name:      ', self.user['name'])
        print('AccountID: ', self.user['id'])
        print('Nickname:  ', self.user['nickname'])

    def do_setpas(self, arg):
        self.user['password'] = input('Enter your new password: ')

    def do_userlist(self, arg):
        pprint([u['name'] for u in self.database['users']])

    def do_message(self, target_user):
        t_user = find_user_name(self.database, target_user)
        if t_user is None:
            return

        message = input('Message: ')
        t_user['messages'].append({
            'from': self.user['name'],
            'date': str(datetime.datetime.now()),
            'message': message
        })

    def do_mymessages(self, arg):
        pprint(self.user['messages'])

    def do_addcommand(self, arg):
        self.database['data']['command_list'].append(arg)

    def do_admin(self, arg):
        if not self.user['admin'] and arg == 'True':
            self.user['admin'] = True

    def do_delete(self, arg):
        if self.user['admin']:
            return

        delete = input('Are you sure you would like to delete your account: ')
        if delete != 'y':
            return

        i = self.database.index(self.user)
        self.database.pop(i)

        return True

    def do_signout(self, arg):
        return True


def signin():
    global user

    while True:
        existing_account = input('Do you have an existing account (y/n): ')
        if existing_account == 'y':
            username = input('Username: ')
            user = find_user_name(database, username)
            if user is None:
                print('Invalid username')
                continue

            password = input('Password: ')
            if password != user['password']:
                print('Invalid password')
                continue

            Main().cmdloop()
        else:
            username = str(input('Username: '))
            while not username:
                username = input("You haven't entered anything, try again.")

            user = find_user_name(database, username)
            if user is not None:
                print('That name already exists.')
                user = None
                continue

            password = input('Password: ')
            while len(password) < 4:
                print('Your password must be 5 characters long.')
                password = input('Password: ')

            nickname = input('Enter your nickname: ')
            id_ = random()
            while id_ in [u['id'] for u in database['users']]:
                id_ = random()

            user = {
                'name': username,
                'password': password,
                'nickname': nickname,
                'id': id_,
                'messages': [],
                'admin': False
            }
            database['users'].append(user)
            Main().cmdloop()


if __name__ == '__main__':
    try:
        signin()
    finally:
        with open('Data.json', 'w') as f:
            json.dump(database, f)

Example usage:

Do you have an existing account (y/n): n
Username: Peilonrayz
Password: abcde
Enter your nickname: Peilonrayz
>>> help

Documented commands (type help <topic>):
========================================
help

Undocumented commands:
======================
addcommand  delete   message     setpas   userlist
admin       details  mymessages  signout

>>> details
Name:       Peilonrayz
AccountID:  0.5494927696334424
Nickname:   Peilonrayz
>>> admin
>>> admin True
>>> delete
>>> userlist
['Peilonrayz']
>>> signout
Do you have an existing account (y/n): 
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.