BaseAdmin: an admin system that you can base stuff off of

Version 1.67 is now released.

This is now fixed, anyone worried about security now has nothing to worry about.


Additions
  • When opening UI in first person, keybinds will be provided to close the UI. If this breaks anything, please let me know.

  • Loading other versions is now possible with the ‘loadversion’ command. You can view the versions available with the ‘versions’ command.

  • BasicCommands now contains a new function called getCommand. This function allows the retrieval of commands with a name, and will return an error message when not found. A few other internal functions were added onto this, such as getCommandRank and getFastCommandRank. The difference between those two is getFastCommandRank does not check for custom restrictions set on a command, while getCommandRank does.

Fixes
  • Fixed a bug that prevented the ‘buyvip’ command from prompting purchases of gamepasses.
Changes
  • Setting ranks can no longer be done directly from the server without access to the processAdminSavedData service.

  • Commands list gives an option to show commands for a certain rank, and now by default only shows commands for the current player’s rank.

  • Features will now have environment variables of the MainModule passed to them through the 2nd parameter. This affects both external and non-external Features, as a minor change. Current external features will continue to work normally.

  • Minor text changes for various internal messages.


Notes:

For those who need to set ranks outside of BaseAdmin, and are prevented by the security update

“AdminRank” and “SetRank”, present in “BaseAdminPlayerData”, can no longer be changed directly. To change these values, you must use the syntax: ModulesHandler.run("processAdminSavedData", Player, "setRank", type (dependency name of BaseAdminPlayerData), value).

To retrieve the ModulesHandler from a plugin
local data = {}

local env = {}

local ModulesHandler

data.name = 'e'
data.disabled = false --turn off if you want to test out a plugin.

data.plugin = {function(Player, arg)
	for i, obj in pairs(env) do
		print(i, obj)
	end
end, 'desc', '<arg>', 2}

function init()
	env = getfenv(2)
	ModulesHandler = getfenv(3).ModulesHandler
	return data
end

return init
To retrieve the ModulesHandler from an external or non-external feature

This is now possible with the latest template.

return function(set, env)
	--init function
	local modulesHandler = env.ModulesHandler
	if not modulesHandler then warn("No ModulesHandler!") end
	local s,e = pcall(function()
		--Place your code here
	end)
	if not s then
		--Available options are Retry and Abort.
		--Return: StatusCode, pcallStatus, pcallError
		--if the status code is Abort, pcallStatus can also be used as a string to identify an error code.
		--example: return "Abort", "Unknown error"
		--or, the Abort status can be used normally
		--example: return "Abort", false, "Parse error"
		
		return "Retry", s, e
	end
end

If you need more information, I would be happy to help you!


Loader updates:
The loader will receive a minor version increment, from 0.78 to 0.781, as nothing has changed in the settings module yet. The latest version has an updated “extFeatures” example module which contains the 2nd “env” parameter.


Known Issues:

  • When ranking a user in-game, the exploit protection might prevent instant ranking to accomplish. A workaround is to have the target player rejoin the game to become ranked. This issue is fixed as of v1.68b1.
2 Likes

There’s a chance v1.68 will be rolling out today! Stay tuned!

The update will include the ragdoll commands working again. I’ll provide more info in the update post.

1 Like

Version 1.68 is now released.


Additions
  • Ragdoll v5.2 and v6.1 have been implemented in BaseAdmin.

  • The new service addition, “CorePrompt”, will use the :SetCore function to either prompt players or send a core notification. If you need information and syntax, please reply.

Fixes
  • When ranking a user in game, their new rank will be denied. The cause of this was the exploit protection implemented in v1.67; v1.68 is now updated to apply this fix.
Changes
  • BasicCommands now uses the CorePrompt service for notifications when a dependency of a command is restricted.

  • Internal ragdoll command changes.


Notes:

Wait, Ragdoll 5.x used glue, how is it back!?

A little thing I called “ReplaceGlueWithAttachments” fixes this. It is coded very badly, but the Ragdoll 5 system is needed for R6 characters as the Ragdoll 6 system’s R6 functionality was limited when Glue was obsoleted. This caused Ragdoll 6 to become unstable when it came to R6, and it also did not work with RagdollCombatTools, which only worked with Ragdoll 5.

Ragdoll 5.2 and 6.1 are now included in BaseAdmin. Ragdoll 5 has very limited support with R15, but it does work.

To ragdoll, use “;ragdoll me” and then “;forceragdoll me true”. To use combat tools, use “;combat” and then “;clone”. Now, you can test out the system (combat tool animations do not play outside of the places owned by my account).


Loader updates:
A new update with a minor version increment brings the loader to v0.782, with the new addition of the setting “PromptToViewErrors”. When enabled, this setting will notify users with the “Owner” rank about errors and ask if they want to view them, using the CorePrompt service.

1 Like

Version 1.69 is now released.


Additions
  • None
Fixes
  • When using BaseAdmin without DataStoreService working, BaseAdmin would not add you as an admin and load the legacy version via loader error. This was a problem with a previous update changing the way BaseAdmin retrieves admin metadata, but this is now fixed. If you still experience this issue, please reply to this post.
Changes
  • The noclip command now has better functionality.

  • The plane command now can load the backup plane.

  • The car command behaves differently when spawning a backup car.

  • Due to the ChatService partial deprecation warning, BasicCommands now moderates text using TextService instead of Chat.


Notes:

I noticed that SafeServer doesn't load in game, was this fixed yet?

I have noticed this bug for a while now and I’m not quite able to reproduce it correctly. SafeServer loads in the development place 100% of the time and I cannot reproduce the issue. When enabling the SafeServer feature, if you experience the issue, I’ll do my best to fix this issue in the next release.

This release was planned to go live later when more features were added, but due to the DataStore bug I decided to release it early. That’s why there’s no additions.


Loader updates:
The loader has not been changed.

1 Like

Version 1.70 is now released.


Additions
  • GuiService is a new service used to create GUIs.

  • userDataService is a new service to manage user data. For more information, use the services command.

  • Gui themes have been added for more customizability. Use the theme command for more info.

  • Setting user data manually is possible through the setuserdata command. It will be available to nonadmins, so make your secure data saved in tables!

  • The guihelpv2 command can be used to test out the new theme service.

Fixes

No bugs were found with this release.

Changes
  • ModulesHandler now supports returning multiple arguments. This was a required change due to the addition of GuiService.

  • addAdmin is now obsolete. To use it, you must use env.var.addAdmin. This was an unnecessary argument that was taking up memory and it wasn’t used.


Notes:

What if a user wants to delete their BaseAdmin data?

This version of BaseAdmin is meant to introduce new features. Do not fork the module.

This feature will be added in the next release of BaseAdmin, using the all new ImmersiveGui to create a wizard to do so.


Loader updates:
The loader has not been changed.

1 Like

Version 1.71 is now released. This update comes with some security patches and new features.


Additions
  • BaseAdmin is now compatible with custom chat systems such as SocialChat. More information can be found in the Details section of the release notes.

  • Users can now delete their user data with the ‘deleteuserdata’ command. Keep in mind that this will not delete their name from the admins list or the admin metadata.

Fixes
  • Fixed a vulnerability for the command bar’s remote event. BaseAdmin will notify you if anyone tries to exploit yours.
  • Restricted access to env.t commands. Use env.useCommand instead.
  • Fixed an issue where the notify sound would play when in Run mode.
Changes
  • Changed some strings for kick and warning messages.

Details:

Using BaseAdmin with a custom chat system

You can use BaseAdmin with a custom chat system like SocialChat. Here is a code example:

--Place in the Settings Module.
config.getCustomMessageEvent = function(plr)
	return game:GetService("ReplicatedStorage"):WaitForChild("SocialChat",5).Remotes.ChatReplicate.OnServerEvent
end--If your game uses a custom chat system, place a function here that returns an event when the player chatted.

The function basically returns a RBXScriptSignal connection value. The arguments passed should be player : Instance, message : string

This was tested, and it worked. If you are unable to get the example working, please reply to this post.


Loader updates:
The loader has been updated, but the version number won’t change, since none of the text in the loader was actually modified. You can now specify an “event getter” function for custom chat systems, using config.getCustomMessageEvent.

2 Likes

Version 1.72 is now released. This update comes with some security patches, bug fixes, and new features.


Additions
  • The addition of PageViewer allows viewing pages with links inside of BaseAdmin. It is currently in beta and there’s several known issues with the system.

  • getConfig is an internal function that allows retrieving configuration data. If the path specified does not exist, it will use a default value. This function generally clears clutter in the scripts that use the settings module.

  • New theme: “BaseAdminLight” for light theme users. This will not replace the default theme.

  • “testerror” command is for testing the internal error handler.

  • “CommandTasks”

  • The new “tasks” command allows you to view commands currently being run by admins, and a history of them.

  • The new “docs” command allows you to view some documentation using PageViewer.

Fixes
  • Fixed a vulnerability where a user could exploit the search box. This is referred to as Security Patch #8.

  • Memory leak fix for when a player leaves. For the most part this has been patched in v1.32, but it is now disconnecting all events. This fix should not change any functionality.

  • Fixed a theme issue with the SSecurity theme.

  • Removed the close button from the AdminSuite themes.

  • Fixed an issue where text color would not display properly for lighter themed backgrounds.

Changes
  • The release note print is now an init module (like it should be)

  • BaseAdmin themes will now truncate text in the title bar if it is too long.

  • Changed some strings for kick and warning messages.

  • Changed some wait statements to task.wait.


Details:

Nothing at the moment. Everything should be self-explanitory.


Loader updates:
The loader has been updated internally but no public update releases are currently available for this update.


As always, please report any issues you encounter due to this update.

2 Likes

Version 1.73 is now released. This applies enhancements to BaseAdmin along with some minor bug fixes. This will be the last update for 2022.


Additions
  • Internally added a layout for beta versions:
Started! Version 1.73b3 (Build date: 12/31/2022)
	Beta 1:
	√ Fix for fly command and deferred SignalBehavior.
	√ Fix for GuiButton.Active unreliability.
	√ Update for GUI window close animation.
	Beta 2:
	√ Organized version layout for beta versions
	√ Update BaseAdmin games.
	Beta 3:
	→ Plan: Remove the "No Command" warning when the command is a blank string or a string with whitespace.
	Below will be rescheduled for the next BaseAdmin version.
	⌛ Plan: Start working on a ModuleScript version of the command interpreter. This will be used in the future to run on the client.
Fixes
  • Fix for the ‘fly’ command where it would not function with deferred SignalBehavior.

  • Due to the new keyboard navigation support update not supporting the GuiButton.Active property, this has been fixed inside of the script for the buttons for the GUI.

  • Fixed a bug where BaseAdmin would STILL play the notify sound in the studio run mode, despite it being fixed twice before.

Changes

Improvements

  • The “No Command” warning does not display when you add a suffix to the prefix that is less than three characters long.

  • Update for BaseAdmin games. Games should be more performant now.

General Changes

  • Update to the GUI window close animation where it will fade out instead of shrinking. This behavior will be customizable long in the future.
Delayed Updates
  • BaseAdmin command interpreter module that can be run on the client to run client commands instantly. This update will be delayed.

Details:

BaseAdmin games are games that are either integrated into BaseAdmin or are specified in the loader as “extGames.” Access it via “;games” and play them using the “game” command.


Loader updates:
The loader has been updated internally to fix a bug where the notify sound would play in studio run mode. Navigate to the notify sound in LegacyAdminSuite to apply this fix.


I am aware of some issues with the command “genericListForInstances.” This will be looked into.


As always, please report any issues you encounter due to this update. See you in the new year!

2 Likes

Version 1.74 is now released. This update is a long-term support update (like the previous update). It services some known bugs of BaseAdmin to keep it functioning as intended, as well as providing small content updates to enhance the user experience of BaseAdmin.

BaseAdmin is now living in 2023 and is now over three years old.


Additions
  • Added new “Clear” theme. It allows you to see what’s going on behind the window you’re working in. To access it, use the “;theme Clear” command.

  • Made default theme more modernized. You can still access the old ones under the name “LegacyBaseAdmin” and “LegacyBaseAdminLight”.

Fixes
  • Fixed some theming issues. Particularly how the search bar placeholder emoji will not be transparent when closing the window.

  • Fixed command and game sorting system.

  • Updates to processAdminSavedData to allow support for deferred SignalBehavior. This is the most likely part to cause bugs or issues, so please let me know if things go wrong!

Changes

Improvements

  • Search module general improvements (relevance sorting).
  • Improved error and warning strings inside of BaseAdmin to be clearer to the user.

General Changes


Details:

ACTION REQUIRED: Changing default parent of BaseAdminServer to ServerStorage for clarity. If you do not use this feature, you are unaffected. Otherwise, you will need to change references.

The behavior can be edited by adding a value called “ServerCommandsParent” in the config and setting it to your desired value.


Loader updates:
New ServerCommandsParent setting. Comment changes for new version clarity.


I am aware of an issue that causes the user data service to sometimes not load. However, this issue was present in the previous release, and has not been tested for this one.


As always, please report any issues you encounter due to this update. If you really need an older version of BaseAdmin to keep your game functioning, I’ll be able to provide it here, when asked.

3 Likes

Version 1.75 is now released. This update includes some major performance optimizations and a couple security fixes, as well as a couple new features and many improvements. But in the name of compatibility, this could seriously break with plugins you may have installed. Read the changes section for more details.


Additions
  • BaseAdmin themes can now be loaded directly through the loader instead of having to create your own FeatureModule to inject them or fork the module.

  • ‘chatmute’ command. This command is infinitely more secure than the legacy mute and unmute commands. It only functions with the new TextChatService.

  • New “Modern” theme.
    image
    use the command “theme Modern” to use it.

Fixes

It’s been a while, but I haven’t fixed very many things, mostly because last version was a stable release. If there’s an issue, inform me by replying, and I’ll have it fixed.

  • A side effect of the new environment update removes the GuiService environment finder. This allows it to be used in many more contexts and fixes existing issues with existing contexts.

  • Fixed genericListForInstances.

  • Fixed a bug where the errors would be suppressed without reason when running a command. This was due to the tasks update not having the correct time fallback.

Changes (read if you experience compatibility issues, mind the wall of text)

IMPORTANT:

BaseAdmin no longer uses the legacy getfenv function for its internals. This change provides benefits to BaseAdmin’s optimizations but may also seriously impact compatibility. Here’s what’s changed:

New “environment” variable. You can access most of the stuff you could using getfenv from anywhere without having to specify a level.

The new plugin template no longer requires init to be called before accessing the plugin. It returns the data table, which contains init as a function. Don’t worry, init will certainly be called before the plugin is used.

How to identify the version of your plugin template, and what to change

There are three plugin template versions. I call them legacy, ENV, and new.

Here’s what legacy looks like:

image
As you can see, it returns ‘data’. But it also does not have an init function. This form of plugin template is NO LONGER SUPPORTED! I don’t expect any of you to be using this version. If you are, you can use the loadversion command to load AdminSuite version 1.48 or 1.37. There are two variants to this plugin version, but the 2nd one broke long ago (and was used in a beta of 1.37 but made its way to the example in the loader).

Here’s what the ENV plugin template looks like:


The ENV plugin template returns an init function to obtain the environment, and then returns data. This plugin template is deprecated, but it still works for the time being. Chances are you have this plugin template installed, so you will need to upgrade it.

New plugin template:

image
The new template will return data AND have an init function. templateVersion is for future compatibility but is not required. You only need to modify one variable in the plugin essentials.

To migrate your ENV plugin, you will need to change the bottom init section from this:

function init()
	env = getfenv(2)
	return data
end

return init

to this:

function data.init(newEnv)
	env = newEnv
end

data.templateVersion = 1

return data

After you’ve replaced the ENV plugin with the new template, you should be good to go. Keep in mind that there’s certain variables that the new environment might not yet support, so keep reading for more information about compatibility.

Features and services now use the new environment. This includes the features loader, and all built in services. External features should not be affected by this change as the environment is passed as a parameter instead of relying on an initialization function, so the feature should see no difference.

The new environment does not have as many variables as the old one.

This is going to be the thing that keeps you up at 3 AM if you have an old plugin or feature. I’ll simplify this for you.

Variables the old environment has:

doEverything
getCommandRank
getFastCommandRank
Cdisplay
ModulesHandler
commandcheck
getMessage
getPlayers
CdisplayNotification
CdisplayHint
isRankHigher
preventJoin
var
notifyplayersystemmessage
script
getCommand
muteUnmute
t
isVip
CdisplayMessage
init
useCommand
purchase
getFilteredMessage
rankAllowed
getPlayerRun
isRankAllowed
http

Variables the new environment has:

getFilteredMessage
getFastCommandRank
Cdisplay
notifyplayersystemmessage
var
CdisplayNotification
CdisplayHint
isRankHigher
script
ModulesHandler
rankAllowed
t
isVip
getPlayerRun
getCommand
useCommand
purchase
getMessage
getCommandRank
CdisplayMessage
isRankAllowed
getPlayers
preventJoin

Some of the globals (such as SERVERPLAYER) were never meant to be accessed directly through env. They were always in var, which is a store for variables and functions inside the MainModule. Some functions like commandcheck are deprecated since version 1.65 and used internally. Others like init are internal functions used by BasicCommands and running them elsewhere might break the system or duplicate it. Don’t worry about those.

If you find that your plugin needs something on the new environment that isn’t here, please reply to this post and I’ll add it. I do not want to clutter the environment with unnecessary material.

Services compatibility

Services are a similar story to plugins, but less complex. At the moment, services are treated identically, but this is subject to change.

The ModulesHandler service detects if the service is compatible with the new environment via the nonlgcy variable in each service. Regardless, they are currently treated the same. If your service runs into issues that cannot be solved by adding something to the new environment, please tell me and I’ll add a compatibility layer for this variable.

Version 1.48 (ENV commands beta) loaded with the ‘loadversion’ command does not have the new environment update applied for compatibility reasons.

Improvements:

  • GamePIN is more secure (security patch 9) and can run when the game starts. More details in the loader update. GamePIN now has new command ‘eplock’ that will enforce the PIN on the existing players. It also has the ‘getpin’ command that can be used to obtain the current PIN.

  • Removed legacy datastore bloat in the MainModule. This speeds up loading time by a little bit.

  • The “GuiSystemAdder” module will add the systems to new themes in real time. Don’t rely on this too much, as I’m planning to update the GUIs in the future to automatically add these instances when they’re actually used to conserve memory.

  • The command bar, which was untouched since version 1.71 (almost a year ago), now has new optimizations. Firstly, it now uses task.wait instead of wait, so it should feel more responsive. Secondly, the remote event is now stored in ReplicatedStorage under the name “BaseAdminCommandBarSendRemote” (very catchy) so there is no longer a remote for each player.

  • “version” init module now has an internal variable that determines if it should output the release in the beta “roadmap” format or the normal format. This is a simple change that only benefits me, who updates this module and adds beta version formatting to the version.

  • Miscellaneous optimizations in the MainModule.

  • notifyplayersystemmessage will now print the message if it detects the user is SERVERPLAYER (7) or RESERVEDPLAYER (5.5).

  • Changed more of the waits to task.wait in older commands, modules, and GUI scripts.

  • Some commands that teleported the player to some random places were affected by a change (the place was moderated). I changed the teleport ID of that place to one that isn’t deleted.

  • The welcome message is friendlier.

  • Updated ‘hover’ GUI script. It is now more fluid and is framerate independent.

Changes

  • init modules now have a third argument. The third argument is the new environment.
    image

  • Entirely removed obsolete ‘flush’ command.

  • Entirely removed legacy ‘spazzy’ command.

  • GuiService will now position the windows in a random variation.


Loader updates:

New version: 0.79. The last version was version 0.782, which was released over a year ago.

About GamePIN

In the startup section, you can add these commands to automate GamePIN:

config.Startup = {
	--Add commands for when the game starts. FINALLY released in BaseAdmin v1.49
	--do not add prefixes
	
	PlayerJoin = {
		--You can add commands you would like to run automatically when the player joins.
		--Use %s for the player's name, example: pm %s hello
	},
	ServerStart = {
		--You can add commands here that you would like to run when the server starts.
		'setrandompin',
		'splock true',
		'eplock'
	}
}

This example uses GamePIN to set a random PIN, lock the game, and enforce the PIN on all players currently in the server.

Advanced section finally released in new versions! You can add your own themes too!

The advanced section currently controls very little settings at the moment. This is what we currently have:

config.advanced = {
	tasks = {
		CommandTasksMax = 20
	},
	UI = {
		ErrorTweenTime = 3,
		DefaultTheme = "Example",
		ForceTheme = true
	}
}

Note: some of the settings are NOT the defaults. If you want the default, make it nil or comment it out like always.

“DefaultTheme” corresponds to a theme in the extThemes folder. You can add your own if you want. Enabling this will make the default BaseAdmin GuiService theme the value.
“ForceTheme”, when enabled, will not allow the user to use any theme other than the default.

I’ve added a template for new themes in a folder called “extThemes”. Documentation inside the loader was improved.


Known issues:
The error notification sometimes makes duplicates of itself.


Clearing up some old claims I've made

There was no wizard created, it was just the deleteuserdata command.

SafeServer is deprecated and will be revamped in a future version. It’s an anti-exploit that prevents instance-based attacks but can easily be bypassed. It was designed to prevent one single physics exploit on the client. It stopped working about two years ago and has not been touched since.

This was an issue with studio.

You can now do this by using env.ModulesHandler directly!

This has been reverted back since then and I’ve not told you guys! Not only did this double the memory used by commands, but it was also not providing very necessary security benefits, if any. The only use case for this is if you’re installing hundreds of thousands of plugins that you cannot verify the security of.

You should still use useCommand. It is a wrapper for running commands that also detects if the user has a sufficient rank. It will return the string “restricted” if the command cannot run because of permission issues.


Do not hesitate to ask a question if you’re confused, no matter how small. Suggestions are also welcome!

As always, please report any issues you encounter due to this update (I usually don’t test every single feature included in BaseAdmin). If you really need an older version of BaseAdmin to keep your game functioning, I’ll be able to provide it here, when asked.

Edit 9/27/2023: Features such as BaseAdminSafeServer and BaseAdminIntegratedSSecurity are officially deprecated as of version 1.73. Forgot to clarify this in the update post. These features will be removed soon after a few subsequent releases. Nobody should be using these features anyways as they are disabled by default.

1 Like

Update: new type module for easy creation of plugins, services, and features.

There is a new types module:

--!strict
type soundType = 'chord' | 'hardcrash' | 'notify' | 'push-notification' | 'push-notification2' | 'e' | 'random'
type cDisplayHintOrMessage = (msg:string, time:number, sound:soundType) -> nil
type serverPlayer = {
	UserId : number;
	Name : string;
	Team : Team | nil;
	Neutral : boolean;
	Character : nil;
	SERVER : true;
	BaseAdminPlayerData : {
		AdminRank : {
			Value : number
		};
		SetRank : {
			Value : number
		}
	}
};

type config = any

type service = {
	info : string
}

type command = any

type getMessage = (Player, ...string) -> string;
type getPlayers = (Player, targetplr:string, customPlayerList:Instance|nil) -> any

export type environment = {
	Cdisplay : (msg:string, time:number, sound:soundType, mode:string) -> nil;
	CdisplayMessage : cDisplayHintOrMessage;
	CdisplayHint : cDisplayHintOrMessage;
	var : {
		CommandTasks : any;
		SERVERPLAYER : serverPlayer;
		--RESERVEDPLAYER : serverPlayer;
		addAdmin : (plr:Player, rank:number) -> nil; --do not use this
		chatted : (msg:string, plr:Player) -> nil;
		sortArguments : (cmd:string, args:string, plr:Player) -> nil;
		config : config;
		configloc : Instance | nil;
		data : DataStoreService?;
		data2 : DataStore?;
		findMatchingCommand : (plr:Player, cmd:string, ...string) -> nil;
		genericF : {
			detectLoaderUpdate : (configloc:Instance, config) -> number;
			getRank : (Player) -> number;
		};
		getConfig : (path:string, defaultValue:any) -> any;
	};
	version : number;
	CdisplayNotification : cDisplayHintOrMessage;
	ModulesHandler : {
		run : (name:string, ...any) -> any;
		info : (nil) -> string;
	};
	getCommand : (cmdname:string) -> command | nil;
	getCommandRank : (cmdname:string) -> number;
	getFastCommandRank : (cmdname:string) -> number;
	getFilteredMessage : getMessage;
	getMessage : getMessage;
	getPlayerRun : getPlayers;
	getPlayers : getPlayers;
	isBetaVersion : boolean;
	isRankAllowed : (plr1:Player, plr2:Player) -> nil;
	rankAllowed : (plr1:Player, plr2:Player) -> (boolean, number, number); --allowed, plr1rank, plr2rank
	isRankHigher : (plr1:Player, plr2:Player) -> boolean;
	isVip : (Player) -> boolean;
	notifyplayersystemmessage : (msg:string, plr:Player, time:number, sound:soundType?, hintmode:boolean, forceError:boolean) -> (TextLabel, ScreenGui);
	preventJoin : (msg:string) -> nil;
	purchase : (Player, id:number, type:'g'|any) -> nil; --'g' for gamepass
	script : Instance;
	t : {command};
	useCommand : (Player, command:string, ...any) -> any | "restricted";
}

return true

it is probably poorly made since I’ve never done types before.

You can include it early into your plugin and feature templates:

local types = require(script.Parent.Parent:FindFirstChild("types")) --comment out when done (for performance reasons)!
local data = {}
local env : types.environment = {}

data.name = 'e'
data.disabled = false --turn off if you want to test out a plugin.

data.plugin = {function(Player, arg)
	for i, obj in pairs(env) do
		print(i, obj)
	end
end, 'desc', '<arg>', 2}

function data.init(newEnv)
	env = newEnv
end

data.templateVersion = 1

return data
local types = require(script.Parent.Parent:FindFirstChild("types")) --comment out when done (for performance reasons)!
return function(set, env : types.environment)
	--init function
	local modulesHandler = env.ModulesHandler
	if not modulesHandler then warn("No ModulesHandler!") end
	local s,e = pcall(function()
		--Place your code here
	end)
	if not s then
		--Available options are Retry and Abort.
		--Return: StatusCode, pcallStatus, pcallError
		--if the status code is Abort, pcallStatus can also be used as a string to identify an error code.
		--example: return "Abort", "Unknown error"
		--or, the Abort status can be used normally
		--example: return "Abort", false, "Parse error"
		
		return "Retry", s, e
	end
end

Also, expect external services to come soon. This is not officially released yet, but you can apply it early. You will see this in the next loader version, 0.791.

image
I am half-glad that you stopped hard-coding yourself to have full admin in games that use this, but the fact that the comment is still there is a bit unnerving.

That said, are there any advantages of using this over, say, Redefine:A or Nano, both of which boast to have the same (if not higher) customization level?

1 Like

I gave myself admin in BaseAdmin automatically since it was a pain to do so, but in the next loader update there will be a value to turn this on or off, and by default it will be off.

Redefine and Nano are alternatives to this system, however they work differently and don’t have all the same features (such as live restrictions, which must be coded manually).

The main selling point of BaseAdmin is its readable source and plugin development tools, all of which are shared by both systems. However, the way they were constructed over the years are very different. For example, with BaseAdmin you can install or create runtime scripts that can modify the environment, called Features. In Redefine, it would require a modification to the script. In BaseAdmin, you also get auto update to fix known security issues and add more features, however in Redefine you are expected more to modify the source.

TL;DR both systems have their strengths and weaknesses. However, I’ll recommend Redefine to anyone who wants to get the beta build from the source button, which BaseAdmin does not have:

And I’ll recommend BaseAdmin to whoever doesn’t want to fork the module but still wants development features.

Bro saw the chance to self-promote
Bro took it

3 Likes

He never said in his post that you should use this over other admin systems. This is simply a resource for anyone to use or modify as they please. He has absolutely no obligation to explain to you why you should use it over other systems. Quit acting like people who post here owe you something.

3 Likes

I disagree. I think there should be a proper reason on why you should switch to different admin systems. Advertising “modifying” as a main feature is not a selling point.

If you prefer another admin system then go use that one. You don’t need to act entitled and demand reasons for why you should use something from the devforums over another resource.

2 Likes

You completely missed my point. Why would you use a different admin system when its a downgraded version?

You should ALWAYS have a selling point. Its not entitled.

It’s not just modifying; it’s modifying without forking the whole thing. You get new features and updates with ease, and you can modify it to your liking. I’ll be expanding on this concept in the next version.

Though I do agree that it isn’t much of a selling point. However, I’m not really trying to sell this since it’s a free resource. Is there a feature that other systems have that you would like to suggest?

Version 1.76 is now released. This update gives BaseAdmin some new features, updates and improves existing ones, and changes existing features. This is the first good update in a while. So much has changed that I decided to summarize it.


Additions
  • External Init Module Support. BaseAdmin now allows you to add external init modules. They are under the “extInit” folder in the BaseAdminSettings module.

  • env.loadedInitModules: an array of loaded Init module names.

  • ‘root’ Rank: an overpowered rank that allows you to do anything. More on this under the changes section.

  • DataManager Service: A service that allows you to easily manage your data. This will have its own section since it is a key new feature in this update.

  • ‘root’ Command: run something as root using this command. For more information, “;define root”.

  • ‘myrankis’ Command: see your current rank.

  • ‘bulkrank’ Command: rank multiple users.

  • ‘Clean’ Theme: A theme that looks… okay-ish? I really don’t know where I was going with this one:

  • fastData: A key part of DataManger. This is in the DataManager section.

  • External Service Support: Use services from your loader. They are placed in the “extServices” folder in the BaseAdminSettings module.

  • ‘clearui’ Command: Allows you to clear all BaseAdmin GUIs that are on your screen. Useful if you don’t want to load the ‘GuiSystemAdder’ init module, but still want to be able to use GUIs.

  • ‘env.waitFor’ Function: A callback function that is intended for init modules to use to retrieve environment variables specified after all init modules have been loaded. For example,

environment.waitFor(function()
--anything in here runs after all init modules do
end)

Note: This is disabled by default. Go to the loader updates to see how to enable it.

Fixes
  • Commands List Affiliates Search: You still cannot search affiliates, but commands that have them should be able to be searched properly and you won’t get an affiliate.

  • Theme Fixes: Fixes to various themes with various problems.

  • Fixed an error in GameUpdater.

Changes and Improvements
  • Updated documentation (the ‘docs’ command). Expect this to be removed soon in place for a much better one in #bulletin-board.

  • Ranks greater than 5 will no longer error.

  • DataStoreInfo is more useful.

  • The error tween is now a LocalScript.

  • Updated strings in “Features” module and ‘featurestatus’.

  • Various performance improvements.

  • Improved ModulesHandler so that services no longer load each time they are called.

  • Update to ‘hover’ so that it works better.

  • Display a deprecated message to users who use the deprecated or obsolete Features.

  • Changes to some rankTranslations.

  • ‘disabled’ init module priority.

  • Most GUI themes now have this:
    image

All About DataManager

What is DataManager?

To put it simply, it is a wrapper for data store requests. It is in a very early stage so expect a MessagingService improvement in the next version.

DataManger originally acted as a cache in its development. However, I decided to make something called “fastData”. A much more advanced cache.

What is fastData?

fastData is an advanced cache that automatically syncs with the server, allows for offline “virtual data store” access, and reduces requests by a significant amount.

Features:

  • Offline Access
  • Cached Backups
  • BindToClose Support
  • Default Values
  • DataStoreInfo Status Updates

fastData:

  • Virtual Data Store
  • Automatic Syncing
  • Automatic Caching
  • Manual Syncing
  • __index-based data management

How do I use DataManager?

I strongly recommend reading the source code with its many comments that explain all the advanced features. Here’s one of them:

--args: script; environment; action; key; default *if the action is SetAsync, default is the target value*
--returns: value or default or cache; success; errorMessage
--if action is SetAsync, the values returned are error message; success
--if action is RemoveAsync, the values returned are success; error message
--noFastData prevents use of fast data, but fast data could also be disabled in the configuration
--instant is whether the SetAsync fastData action should be instant or not

--example of running through the service handler: ModulesHandler.run("DataManager", "SetAsync", "isDataManagerCool", true); print(ModulesHandler.run("DataManager", "GetAsync", "isDataManagerCool")) --> true true

Loader updates:

New version: 0.792. This version removes deprecated features from the list of features, as well as adds a “rootPassword” field. “InitGetENVCallbackEnabled” was added to the advanced section of the settings module. Set to true to enable.


Known issues:
The error notification sometimes makes duplicates of itself.

Do not hesitate to ask a question if you’re confused, no matter how small. Suggestions are also welcome!

As always, please report any issues you encounter due to this update (I usually don’t test every single feature included in BaseAdmin).

Summary

Pasted from the version init module.

local ver = "1.76"

function displayBetaMessage()
	print(([[Started! Version %sb4 (Build date: 11/3/2023)
	Beta 1:
	Update documentation
	
	Beta 2:
	Add external init modules
	env.loadedInitModules
	Allow ranks > 5
	'root' rank 8
	Fix cmds list so it no longer has issues with affiliates
	New DataManager service
	DataStoreInfo is now more useful
	Theme fixes
	Fixed an error in GameUpdater init module
	Root command to run something as root
	myrankis command to retrieve the current user's rank
	bulkrank command to rank multiple users
	New "Clean" theme
	The error tween is now a LocalScript
	Minor performance improvements
	
	Beta 3:
	Improved ModulesHandler so that services no longer load each time they are called
	fastData (significant)
	Updated strings in "Features" module and featurestatus
	External services support
	New "clearui" command
	Theme improvements, fix to SNote theme so that it moves now
	
	Beta 4:
	10/28/2023 (pre): Made the text here capitalized
	'waitFor' function for init modules that allows the init module to know when other init modules have finished modifying the environment. Enable using config.advanced.InitGetENVCallbackEnabled.
	
	Release:
	Minor changes.
	Update to 'hover' so that it works better.
	Display a deprecated message to users who use the deprecated or obsolete features.
	]]):format(ver))
end

Forgot to mention: BaseAdmin feels like it loads instantly if you require it locally, disable data store, and set init module load priority to an empty array. It’s been years since that was possible.