def namesCmd(cn, args): '''@description Display names used by client @usage cn @public''' if master_required and not isAtLeastMaster(cn): insufficientPermissions(cn) return if args == '': raise UsageError() return try: tcn = int(args) names = dbmanager.query(IpToNick).filter( IpToNick.ip == sbserver.playerIpLong(tcn)).all() if len(names) == 0: sbserver.playerMessage(cn, info('No names found')) return except NoResultFound: sbserver.playerMessage(cn, info('No names found')) return except ValueError: sbserver.playerMessage(cn, error('Invalid cn')) return namestr = 'Other known names: ' for name in names: namestr += name.nick + ' ' sbserver.playerMessage(cn, info(namestr))
def namesCmd(cn, args): '''@description Display names used by client @usage cn @public''' if master_required and not isAtLeastMaster(cn): insufficientPermissions(cn) return if args == '': raise UsageError() return try: tcn = int(args) names = dbmanager.query(IpToNick).filter(IpToNick.ip==sbserver.playerIpLong(tcn)).all() if len(names) == 0: sbserver.playerMessage(cn, info('No names found')) return except NoResultFound: sbserver.playerMessage(cn, info('No names found')) return except ValueError: sbserver.playerMessage(cn, error('Invalid cn')) return namestr = 'Other known names: ' for name in names: namestr += name.nick + ' ' sbserver.playerMessage(cn, info(namestr))
def isUserAdmin(user_id): try: priv = dbmanager.query(UserPrivilege).filter( UserPrivilege.user_id == user_id).filter( UserPrivilege.privilege == ADMIN).one() return True except NoResultFound: return False
def onRecentBans(cn, args): '''@description Recently added bans @usage''' p = player(cn) if args != '': raise UsageError() else: recent = dbmanager.query(Ban).order_by(Ban.time.desc())[:5] for ban in recent: p.message(info('Nick: %s' % ban.nick))
def onConnect(cn): try: same = dbmanager.query(IpToNick).filter(IpToNick.ip==sbserver.playerIpLong(cn)).filter(IpToNick.nick==sbserver.playerName(cn)).all() if len(same) > 0: return except NoResultFound: pass ent = IpToNick(sbserver.playerIpLong(cn), sbserver.playerName(cn)) session.add(ent) session.commit()
def onChangepass(cn, args): '''@description Link name to server account, and reserve name. @usage @public''' args = args.split(' ') if len(args) != 2: raise UsageError() if not isLoggedIn(cn): raise StateError('You must be logged in to change your password') try: dbmanager.query(User).filter(User.id==loggedInAs(cn).id).filter(User.password==args[0]).one() except NoResultFound: raise StateError('Incorrect password.') except MultipleResultsFound: pass else: dbmanager.query(User).filter(User.id==loggedInAs(cn).id).update({ 'password': args[1] }) session.commit() return
def onRegisterCommand(cn, args): '''@description Register account with server @usage email password @public''' args = args.split(' ') if len(args) != 2: raise UsageError() try: dbmanager.query(User).filter(User.email==args[0]).one() except NoResultFound: if not isValidEmail(args[0]): raise ArgumentValueError('Invalid email address') user = User(args[0], args[1]) session.add(user) session.commit() sbserver.playerMessage(cn, info('Account created')) return except MultipleResultsFound: pass raise StateError('An account with that email already exists')
def onConnect(cn): try: same = dbmanager.query(IpToNick).filter( IpToNick.ip == sbserver.playerIpLong(cn)).filter( IpToNick.nick == sbserver.playerName(cn)).all() if len(same) > 0: return except NoResultFound: pass ent = IpToNick(sbserver.playerIpLong(cn), sbserver.playerName(cn)) session.add(ent) session.commit()
def onLinkName(cn, args): '''@description Link name to server account, and reserve name. @usage @public''' if args != '': raise UsageError() if not isLoggedIn(cn): raise StateError('You must be logged in to link a name to your account') if sbserver.playerName(cn) in blocked_names: raise StateError('You can not reserve this name') try: dbmanager.query(NickAccount).filter(NickAccount.nick==sbserver.playerName(cn)).one() except NoResultFound: user = loggedInAs(cn) nickacct = NickAccount(sbserver.playerName(cn), user.id) session.add(nickacct) session.commit() sbserver.playerMessage(cn, info('Your name is now linked to your account.')) sbserver.playerMessage(cn, info('You may now login with /setmaster password')) return except MultipleResultsFound: pass raise StateError('Your name is already linked to an account')
def userPrivSetCmd(cn, tcn, args): user_id = player(tcn).user.id if args == 'user': try: if isUser(player(tcn).user.id): sbserver.playerMessage(cn, error('%s already has user permissions.' % sbserver.playerName(tcn))) return except (ValueError, AttributeError): pass else: try: user = loggedInAs(tcn) except AttributeError: sbserver.playerMessage(cn, error('%s is not logged in.' % sbserver.playerName(tcn))) else: dbmanager.query(UserPrivilege).filter(UserPrivilege.user_id==user_id).update({ 'privilege': None }) session.add(UserPrivilege(0, user.id)) session.commit() sbserver.playerMessage(cn, info('User privilege has been given to %s (%s)' % (sbserver.playerName(tcn), user.email))) elif args == 'master': try: if isUserMaster(player(tcn).user.id): sbserver.playerMessage(cn, error('%s already has master permissions.' % sbserver.playerName(tcn))) return except (ValueError, AttributeError): pass else: try: user = loggedInAs(tcn) except AttributeError: sbserver.playerMessage(cn, error('%s is not logged in.' % sbserver.playerName(tcn))) else: dbmanager.query(UserPrivilege).filter(UserPrivilege.user_id==user_id).update({ 'privilege': None }) session.add(UserPrivilege(1, user.id)) session.commit() sbserver.playerMessage(cn, info('Master privilege has been given to %s (%s)' % (sbserver.playerName(tcn), user.email))) elif args == 'admin': try: if isUserAdmin(player(tcn).user.id): sbserver.playerMessage(cn, error('%s already has admin permissions.' % sbserver.playerName(tcn))) return except (ValueError, AttributeError): pass else: try: user = loggedInAs(tcn) except AttributeError: sbserver.playerMessage(cn, error('%s is not logged in.' % sbserver.playerName(tcn))) else: dbmanager.query(UserPrivilege).filter(UserPrivilege.user_id==user_id).update({ 'privilege': None }) session.add(UserPrivilege(2, user.id)) session.commit() sbserver.playerMessage(cn, info('Admin privilege has been given to %s (%s)' % (sbserver.playerName(tcn), user.email))) else: sbserver.playerMessage(cn, error('Privilege level must be \'master\' to set master permissions and \'admin\' to set master or admin permissions'))
def onSetMaster(cn, givenhash): p = player(cn) adminhash = sbserver.hashPassword(cn, sbserver.adminPassword()) try: na = dbmanager.query(NickAccount).filter(NickAccount.nick==p.name()).one() except NoResultFound: if givenhash != adminhash: p.message(error('Your name is not assigned to any accounts')) except MultipleResultsFound: p.message(error('Multiple names linked to this account. Contact the system administrator.')) else: nickhash = sbserver.hashPassword(cn, na.user.password) if givenhash == nickhash: login(cn, na.user) else: if givenhash != adminhash: p.message(error('Invalid password'))
def getCurrentBanByNick(nick): return dbmanager.query(BanNick).filter(BanNick.nick==nick).one()
def clearBans(): bans = dbmanager.query(Ban).filter('expiration>' + str(time.time())).all() for b in bans: session.delete(b) session.commit()
def isUserAdmin(user_id): try: priv = dbmanager.query(UserPrivilege).filter(UserPrivilege.user_id==user_id).filter(UserPrivilege.privilege==ADMIN).one() return True except NoResultFound: return False
def clearBans(): bans = dbmanager.query(Ban).filter('expiration>'+str(time.time())).all() for b in bans: session.delete(b) session.commit()
def userBelongsTo(user, tag_id): try: dbmanager.query(ClanMember).filter(ClanMember.tag_id==tag_id).filter(ClanMember.user_id==user.id).one() return True except NoResultFound: return False
def tagId(tag): return dbmanager.query(ClanTag).filter(ClanTag.tag==tag).one().id
def getCurrentBanByIp(ipaddress): return dbmanager.query(Ban).filter(Ban.ip==ipaddress).filter('expiration>'+str(time.time())).one()
def userAuth(email, password): try: user = dbmanager.query(User).filter(User.email==email).filter(User.password==password).one() except (NoResultFound, MultipleResultsFound): return False return user
def nickReserver(nick): return dbmanager.query(NickAccount).filter(NickAccount.nick==nick).one()