.BANCHO. New privileges system, add restricted mode
This commit is contained in:
@@ -74,3 +74,6 @@ class userSilencedException(Exception):
|
||||
|
||||
class need2FAException(Exception):
|
||||
pass
|
||||
|
||||
class userRestrictedException(Exception):
|
||||
pass
|
||||
|
@@ -11,6 +11,7 @@ from constants import mods
|
||||
from helpers import generalFunctions
|
||||
from helpers import logHelper as log
|
||||
from constants import gameModes
|
||||
from constants import privileges
|
||||
|
||||
"""
|
||||
Commands callbacks
|
||||
@@ -98,7 +99,7 @@ def kickAll(fro, chan, message):
|
||||
# Kick everyone but mods/admins
|
||||
toKick = []
|
||||
for key, value in glob.tokens.tokens.items():
|
||||
if value.rank < 3:
|
||||
if value.admin == False:
|
||||
toKick.append(key)
|
||||
|
||||
# Loop though users to kick (we can't change dictionary size while iterating)
|
||||
@@ -213,7 +214,7 @@ def ban(fro, chan, message):
|
||||
return "{}: user not found".format(target)
|
||||
|
||||
# Set allowed to 0
|
||||
userHelper.setAllowed(targetUserID, 0)
|
||||
userHelper.ban(targetUserID)
|
||||
|
||||
# Send ban packet to the user if he's online
|
||||
targetToken = glob.tokens.getTokenFromUsername(target)
|
||||
@@ -236,11 +237,52 @@ def unban(fro, chan, message):
|
||||
return "{}: user not found".format(target)
|
||||
|
||||
# Set allowed to 1
|
||||
userHelper.setAllowed(targetUserID, 1)
|
||||
userHelper.unban(targetUserID)
|
||||
|
||||
log.rap(userID, "has unbanned {}".format(target), True)
|
||||
return "Welcome back {}!".format(target)
|
||||
|
||||
def restrict(fro, chan, message):
|
||||
# Get parameters
|
||||
for i in message:
|
||||
i = i.lower()
|
||||
target = message[0].replace("_", " ")
|
||||
|
||||
# Make sure the user exists
|
||||
targetUserID = userHelper.getID(target)
|
||||
userID = userHelper.getID(fro)
|
||||
if targetUserID == False:
|
||||
return "{}: user not found".format(target)
|
||||
|
||||
# Put this user in restricted mode
|
||||
userHelper.restrict(targetUserID)
|
||||
|
||||
# Send restricted mode packet to this user if he's online
|
||||
targetToken = glob.tokens.getTokenFromUsername(target)
|
||||
if targetToken != None:
|
||||
targetToken.setRestricted()
|
||||
|
||||
log.rap(userID, "has put {} in restricted mode".format(target), True)
|
||||
return "Bye bye {}. See you later, maybe.".format(target)
|
||||
|
||||
def unrestrict(fro, chan, message):
|
||||
# Get parameters
|
||||
for i in message:
|
||||
i = i.lower()
|
||||
target = message[0].replace("_", " ")
|
||||
|
||||
# Make sure the user exists
|
||||
targetUserID = userHelper.getID(target)
|
||||
userID = userHelper.getID(fro)
|
||||
if targetUserID == False:
|
||||
return "{}: user not found".format(target)
|
||||
|
||||
# Set allowed to 1
|
||||
userHelper.unrestrict(targetUserID)
|
||||
|
||||
log.rap(userID, "has removed restricted mode from {}".format(target), True)
|
||||
return "Welcome back {}!".format(target)
|
||||
|
||||
def restartShutdown(restart):
|
||||
"""Restart (if restart = True) or shutdown (if restart = False) pep.py safely"""
|
||||
msg = "We are performing some maintenance. Bancho will {} in 5 seconds. Thank you for your patience.".format("restart" if restart else "shutdown")
|
||||
@@ -287,7 +329,7 @@ def systemMaintenance(fro, chan, message):
|
||||
|
||||
# Disconnect everyone but mod/admins
|
||||
for _, value in glob.tokens.tokens.items():
|
||||
if value.rank < 3:
|
||||
if value.admin == False:
|
||||
who.append(value.userID)
|
||||
|
||||
glob.tokens.enqueueAll(serverPackets.notification("Our bancho server is in maintenance mode. Please try to login again later."))
|
||||
@@ -306,7 +348,7 @@ def systemStatus(fro, chan, message):
|
||||
data = systemHelper.getSystemInfo()
|
||||
|
||||
# Final message
|
||||
msg = "pep.py bancho server v{}\n".format(glob.VERSION)
|
||||
msg = "pep.py bancho server v{}".format(glob.VERSION)
|
||||
msg += "made by the Ripple team\n"
|
||||
msg += "\n"
|
||||
msg += "=== BANCHO STATS ===\n"
|
||||
@@ -555,14 +597,7 @@ trigger: message that triggers the command
|
||||
callback: function to call when the command is triggered. Optional.
|
||||
response: text to return when the command is triggered. Optional.
|
||||
syntax: command syntax. Arguments must be separated by spaces (eg: <arg1> <arg2>)
|
||||
minRank: minimum rank to execute that command. Optional (default = 1)
|
||||
rank: EXACT rank used to execute that command. Optional.
|
||||
|
||||
RANKS:
|
||||
1: Normal user
|
||||
2: Supporter
|
||||
3: Developer
|
||||
4: Community manager
|
||||
privileges: privileges needed to execute the command. Optional.
|
||||
|
||||
NOTES:
|
||||
- You CAN'T use both rank and minRank at the same time.
|
||||
@@ -593,70 +628,80 @@ commands = [
|
||||
}, {
|
||||
"trigger": "!alert",
|
||||
"syntax": "<message>",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_SEND_ALERTS,
|
||||
"callback": alert
|
||||
}, {
|
||||
"trigger": "!alertuser",
|
||||
"syntax": "<username> <message>",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_SEND_ALERTS,
|
||||
"callback": alertUser,
|
||||
}, {
|
||||
"trigger": "!moderated",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_CHAT_MOD,
|
||||
"callback": moderated
|
||||
}, {
|
||||
"trigger": "!kickall",
|
||||
"rank": 3,
|
||||
"privileges": privileges.ADMIN_KICK_USERS,
|
||||
"callback": kickAll
|
||||
}, {
|
||||
"trigger": "!kick",
|
||||
"syntax": "<target>",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_KICK_USERS,
|
||||
"callback": kick
|
||||
}, {
|
||||
"trigger": "!fokabot reconnect",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_MANAGE_SERVERS,
|
||||
"callback": fokabotReconnect
|
||||
}, {
|
||||
"trigger": "!silence",
|
||||
"syntax": "<target> <amount> <unit(s/m/h/d)> <reason>",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_SILENCE_USERS,
|
||||
"callback": silence
|
||||
}, {
|
||||
"trigger": "!removesilence",
|
||||
"syntax": "<target>",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_SILENCE_USERS,
|
||||
"callback": removeSilence
|
||||
}, {
|
||||
"trigger": "!system restart",
|
||||
"rank": 3,
|
||||
"privileges": privileges.ADMIN_MANAGE_SERVERS,
|
||||
"callback": systemRestart
|
||||
}, {
|
||||
"trigger": "!system shutdown",
|
||||
"rank": 3,
|
||||
"privileges": privileges.ADMIN_MANAGE_SERVERS,
|
||||
"callback": systemShutdown
|
||||
}, {
|
||||
"trigger": "!system reload",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_MANAGE_SETTINGS,
|
||||
"callback": systemReload
|
||||
}, {
|
||||
"trigger": "!system maintenance",
|
||||
"rank": 3,
|
||||
"privileges": privileges.ADMIN_MANAGE_SERVERS,
|
||||
"callback": systemMaintenance
|
||||
}, {
|
||||
"trigger": "!system status",
|
||||
"rank": 3,
|
||||
"privileges": privileges.ADMIN_MANAGE_SERVERS,
|
||||
"callback": systemStatus
|
||||
}, {
|
||||
"trigger": "!ban",
|
||||
"syntax": "<target>",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_BAN_USERS,
|
||||
"callback": ban
|
||||
}, {
|
||||
"trigger": "!unban",
|
||||
"syntax": "<target>",
|
||||
"minRank": 3,
|
||||
"privileges": privileges.ADMIN_BAN_USERS,
|
||||
"callback": unban
|
||||
}, {
|
||||
"trigger": "!restrict",
|
||||
"syntax": "<target>",
|
||||
"privileges": privileges.ADMIN_BAN_USERS,
|
||||
"callback": restrict
|
||||
}, {
|
||||
"trigger": "!unrestrict",
|
||||
"syntax": "<target>",
|
||||
"privileges": privileges.ADMIN_BAN_USERS,
|
||||
"callback": unrestrict
|
||||
}, {
|
||||
"trigger": "\x01ACTION is listening to",
|
||||
"callback": tillerinoNp
|
||||
@@ -684,7 +729,6 @@ commands = [
|
||||
# Commands list default values
|
||||
for cmd in commands:
|
||||
cmd.setdefault("syntax", "")
|
||||
cmd.setdefault("minRank", 1)
|
||||
cmd.setdefault("rank", None)
|
||||
cmd.setdefault("privileges", None)
|
||||
cmd.setdefault("callback", None)
|
||||
cmd.setdefault("response", "u w0t m8?")
|
||||
|
20
constants/privileges.py
Normal file
20
constants/privileges.py
Normal file
@@ -0,0 +1,20 @@
|
||||
USER_PUBLIC = 1
|
||||
USER_NORMAL = 2 << 0
|
||||
USER_DONOR = 2 << 1
|
||||
ADMIN_ACCESS_RAP = 2 << 2
|
||||
ADMIN_MANAGE_USERS = 2 << 3
|
||||
ADMIN_BAN_USERS = 2 << 4
|
||||
ADMIN_SILENCE_USERS = 2 << 5
|
||||
ADMIN_WIPE_USERS = 2 << 6
|
||||
ADMIN_MANAGE_BEATMAPS = 2 << 7
|
||||
ADMIN_MANAGE_SERVERS = 2 << 8
|
||||
ADMIN_MANAGE_SETTINGS = 2 << 9
|
||||
ADMIN_MANAGE_BETAKEYS = 2 << 10
|
||||
ADMIN_MANAGE_REPORTS = 2 << 11
|
||||
ADMIN_MANAGE_DOCS = 2 << 12
|
||||
ADMIN_MANAGE_BADGES = 2 << 13
|
||||
ADMIN_VIEW_RAP_LOGS = 2 << 14
|
||||
ADMIN_MANAGE_PRIVILEGES = 2 << 15
|
||||
ADMIN_SEND_ALERTS = 2 << 16
|
||||
ADMIN_CHAT_MOD = 2 << 17
|
||||
ADMIN_KICK_USERS = 2 << 18
|
@@ -69,18 +69,15 @@ def friendList(userID):
|
||||
return packetHelper.buildPacket(packetIDs.server_friendsList, friendsData)
|
||||
|
||||
def onlineUsers():
|
||||
onlineUsersData = []
|
||||
|
||||
userIDs = []
|
||||
users = glob.tokens.tokens
|
||||
|
||||
# Users number
|
||||
onlineUsersData.append([len(users), dataTypes.uInt16])
|
||||
# Create list with all connected (and not restricted) users
|
||||
for _, value in users.items():
|
||||
if value.restricted == False:
|
||||
userIDs.append(value.userID)
|
||||
|
||||
# Add all users user IDs to onlineUsersData
|
||||
for _,value in users.items():
|
||||
onlineUsersData.append([value.userID, dataTypes.sInt32])
|
||||
|
||||
return packetHelper.buildPacket(packetIDs.server_userPresenceBundle, onlineUsersData)
|
||||
return packetHelper.buildPacket(packetIDs.server_userPresenceBundle, [[userIDs, dataTypes.intList]])
|
||||
|
||||
|
||||
""" Users packets """
|
||||
@@ -88,8 +85,14 @@ def userLogout(userID):
|
||||
return packetHelper.buildPacket(packetIDs.server_userLogout, [[userID, dataTypes.sInt32], [0, dataTypes.byte]])
|
||||
|
||||
def userPanel(userID):
|
||||
# Get user data
|
||||
# Connected and restricted check
|
||||
userToken = glob.tokens.getTokenFromUserID(userID)
|
||||
if userToken == None:
|
||||
return bytes()
|
||||
if userToken.restricted == True:
|
||||
return bytes()
|
||||
|
||||
# Get user data
|
||||
username = userToken.username
|
||||
timezone = 24 # TODO: Timezone
|
||||
country = userToken.country
|
||||
@@ -99,15 +102,13 @@ def userPanel(userID):
|
||||
|
||||
# Get username color according to rank
|
||||
# Only admins and normal users are currently supported
|
||||
#rank = userHelper.getRankPrivileges(userID)
|
||||
rank = userToken.rank
|
||||
if username == "FokaBot":
|
||||
userRank = userRanks.MOD
|
||||
elif rank == 4:
|
||||
elif userHelper.isInPrivilegeGroup(userID, "community manager") == True:
|
||||
userRank = userRanks.MOD
|
||||
elif rank == 3:
|
||||
elif userHelper.isInPrivilegeGroup(userID, "developer") == True:
|
||||
userRank = userRanks.ADMIN
|
||||
elif rank == 2:
|
||||
elif userHelper.isInPrivilegeGroup(userID, "donator") == True:
|
||||
userRank = userRanks.SUPPORTER
|
||||
else:
|
||||
userRank = userRanks.NORMAL
|
||||
@@ -130,6 +131,8 @@ def userStats(userID):
|
||||
userToken = glob.tokens.getTokenFromUserID(userID)
|
||||
if userToken == None:
|
||||
return bytes() # NOTE: ???
|
||||
if userToken.restricted == True:
|
||||
return bytes()
|
||||
# Stats are cached in token object
|
||||
#rankedScore = userHelper.getRankedScore(userID, userToken.gameMode)
|
||||
#accuracy = userHelper.getAccuracy(userID, userToken.gameMode)/100
|
||||
|
Reference in New Issue
Block a user