Making a chat command?

Hey guys.

Well to skip to the point, I need to know how to make chat commands. Such as the AddChatCommand feature in DarkRP. I looked at the DarkRP code but couldn’t figure out how it’s done. I also searched but found nothing. So can someone tell me how to make a feature very similar to AddChatCommand(Where at the end of the function that i want to have a chat command for, I just add AddChatCommand( “What To Type”, What the function is called ))

I’d really appreciate it.
Thanks.

[lua]local _ChatCommands = { };
local _ChatPrefix = “!”; --The character before the command, eg !ban

function AddChatCommand( txt, func )

_ChatCommands[ _ChatPrefix .. txt ] = func;

end

hook.Add( “PlayerSay”, “ChatCommands”, function( ply, text, toall )

local tab = string.Explode( " ", text );
local func = _ChatCommands[ tab[1] ];

if ( func ) then

	local c = tab[1];
	table.remove( tab, 1 )
	
	func( ply, c, unpack( tab ) );
	
	return "";

end

end );

//EXAMPLE USAGE

AddChatCommand( “hello”, function( ply, command, args )

p:ChatPrint( "hello" );

end );[/lua]

This is an old script I wrote. I’ve no idea if it works. It may not work due to being old. Don’t care if you give credit or not, it’s pretty routine coding…

[lua]
chatcommand = {};

chatcommand.Commands = {};

chatcommand.Prefix = “!”;

local function Phrase©

if C.Admin then

	if C.SuperAdmin then

		return "a super admin";

	end

	return "an admin";

end

return "";

end

/*

Usage:

ChatName - Name to use in chat
Func - Callback
Desc - Description
Usage - Usage guide
ArgCount - Minimum argument count
Admin - Is it admin only
SuperAdmin - Is it super admin only

*/

function chatcommand.Add(ChatName,Func,Desc,Usage,ArgCount,Admin,SuperAdmin)

if (type(ChatName) == "string" && #ChatName > 0) && type(Func) == "function" then

	local C = {};

	C.ChatName = ChatName;
	C.Callback = Func;
	C.Desc = Desc or "";
	C.Usage = Usage or "";
	C.ArgCount = ArgCount or 0;
	C.Admin = Admin or false;
	C.SuperAdmin = SuperAdmin or false;

	if C.SuperAdmin then

		C.Admin = false;

	end

	table.insert(chatcommand.Commands,C);

end

end

function chatcommand.Hook(Player,Text)

local T = string.Explode(" ",Text);
local CName = string.lower(T[1]);

table.remove(T,1);

if string.Left(CName,1) == chatcommand.Prefix then

	CName = string.Right(CName,#CName - 1);

	for _,C in pairs(chatcommand.Commands) do

		if C.ChatName == CName then

			if (C.Admin && Player:IsAdmin()) || (C.SuperAdmin && Player:IsSuperAdmin()) || (!C.Admin && !C.SuperAdmin) then

				if #T >= AC then

					C.Callback(Player,T);

					return "";

				else

					Player:ChatPrint("Usage: "..chatcommand.Prefix..C.ChatName.." "..C.Usage);

					return "";

				end

			else

				Player:ChatPrint("You need to be "..Phrase(C).." to use this command!");

				return "";

			end

		end

	end

end

end
hook.Add(“PlayerSay”,“chatcommand.Hook”,chatcommand.Hook);

//some default commands

local function DescCommand(Player,Args)

local CName = string.lower(Args[1]);

for _,C in pairs(chatcommand.Commands) do

	if C.ChatName == CName then

		if C.Desc != "" then

			Player:ChatPrint(C.Desc);

			if C.Usage != "" then

				Player:ChatPrint("Usage: "..chatcommand.Prefix..C.ChatName.." "..C.Usage);

			end

		else

			Player:ChatPrint("No description available!");

		end

		return;

	end

end

Player:ChatPrint("Command \""..CName.."\" not found!");

end
chatcommand.Add(“desc”,DescCommand,“Prints out a description of a command”,"<command name>",1);

local function ListCommands(Player)

local T = "

";

for _,C in pairs(chatcommand.Commands) do

	T = T..chatcommand.Prefix..C.ChatName.." "..C.Usage.."

“;
T = T…C.Desc…”
";
T = T…"Minimum arguments: “…C.ArgCount…”
";
T = T…"You need to be “…Phrase©…“to use this command”;
T = T…”
";

end

Player:PrintMessage(HUD_PRINTCONSOLE,T);

Player:ChatPrint("A list of commands has been printed to your console!");

end
chatcommand.Add(“list”,ListCommands,“Prints out a list of available commands”);
[/lua]

Thanks a ton guys.

Great!