kgb_admin_color_chat
kgb_admin_color_chat
Download : Click Here
#include <amxmodx>
#define MAX_MESSAGE_SIZE 256
#define MAX_COMMAND_SIZE 10
#define AMX_CHAT_CHAR_RECOGNITION ‘@’ // What character we look for when we decide if the message should go to the admins
#define AMX_PSAY_CHAR_RECOGNITION ‘#’ // Character to look for when sending PMs
// Error Codes
#define TOO_MANY_MATCHED -1
#define NONE_MATCHED -2
#define AMX_PSAY_FINDNICK_ERROR_TOO_MANY “^x04[AMXX]: Greska <Previse igraca sa takvim nickom>”
#define AMX_PSAY_FINDNICK_ERROR_NONE “^x04[AMXX]: Greska <Nema takvih nick-ova>”
#define AMX_PSAY_FINDNICK_ERROR_UNKNOWN “^x04[AMXX]: Greska <Nepoznata greska>”
// Text defines, PREFIX is text before and SUFFIX is text after the username in a message.
// Feel free to change these. Also note that ^x01 and ^x04 is color codes.
#define AMX_CHAT_PREFIX “^x04″ // Text before the username in amx_chat command
#define AMX_CHAT_SUFFIX ” adminima: ” // Text after the username in amx_chat command
#define AMX_PSAY_SEND_PREFIX “^x04″ // Text before the username in a PM that you send
#define AMX_PSAY_SEND_SUFFIX ” ti salje PM: ^x01″ // Text after the username in a PM that you send
#define AMX_PSAY_BACK_TO_SENDER_PREFIX “^x04Poslao si PM ” // Text before the username in the confimation notice of the PM you send
#define AMX_PSAY_BACK_TO_SENDER_SUFFIX “: ^x01” // Text after the username in the confimation notice of the PM you send
#define AMX_SAY_PREFIX “^x04” // Text before the username in the amx_say command
#define AMX_SAY_SUFFIX “: ^x01” // Text after the username in the amx_say command
// E. g. an amx_chat message with the current settings will be as following example shows
// Command by player with the nick “Martin Van der Cal”:
// amx_chat Hello admins
// Shows as:
// Martin Van der Cal tells admins: Hello admins
// Also note that with only the color code in the prefix the whole line will show as green to all admins
new gmsgSayText
public plugin_init()
{
register_plugin(“Std Admin Color Chat”, “1.0”, “Van der Cal”)
register_clcmd(“say”, “SayHandler”, ADMIN_CHAT, “# <name or #userid> <message> – Sends a PM”)
register_clcmd(“say_team”, “SayTeamHandler”, 0, “@ <message> – Displays message to admins”)
register_concmd(“amx_say”, “ConCmdACCSay”, ADMIN_CHAT, “<message> – Displays message to all players”)
register_concmd(“amx_psay”, “ConCmdACCPM”, ADMIN_CHAT, “# <name or #userid> <message> – Sends a PM”);
register_concmd(“amx_chat”, “ConCmdACCAdmins”, ADMIN_CHAT, “<message> – Displays message to admins”);
gmsgSayText = get_user_msgid(“SayText”)
}
// Runs if anything is said in say
public SayHandler(iPlayerID)
{
new sTemp[MAX_MESSAGE_SIZE]
new sMessage[MAX_MESSAGE_SIZE]
new sCmd[MAX_COMMAND_SIZE]
read_argv(1, sTemp, MAX_MESSAGE_SIZE – 1)
// if the player has admin chat rights
if ( get_user_flags(iPlayerID) & ADMIN_CHAT )
{
// if the chat starts with AMX_PSAY_CHAR_RECOGNITION. That is, if an admin wants to send a PM
if ( sTemp[0] == AMX_PSAY_CHAR_RECOGNITION )
{
// server_print(“[DEBUG] “)
if (sTemp[1] == ‘ ‘)
{
// Remove the chat recognition chars
strbreak(sTemp, sCmd, MAX_COMMAND_SIZE-1, sMessage, MAX_MESSAGE_SIZE-1)
}
else
{
// Remove the chat recognition chars without the space
sTemp[0] = ‘ ‘
trim(sTemp)
copy(sMessage, MAX_MESSAGE_SIZE-1, sTemp)
}
// Now we have our nick and message only in sMessage and thus, time for the next stage
BaseSendPM(sMessage, iPlayerID)
return PLUGIN_HANDLED
}
}
return PLUGIN_CONTINUE
}
// Runs if anything is said in team_say
public SayTeamHandler(iPlayerID)
{
new sTemp[MAX_MESSAGE_SIZE]
new sCmd[MAX_COMMAND_SIZE]
new sMessage[MAX_MESSAGE_SIZE]
read_argv(1, sTemp, MAX_MESSAGE_SIZE – 1)
// if the chat starts with AMX_CHAT_CHAR_RECOGNITION then we are supposed to send it to all admins
if ( sTemp[0] == AMX_CHAT_CHAR_RECOGNITION )
{
// Somehow I cant get trim to work as I want, so if there are a space after @, then I had to resort to using strbreak
if (sTemp[1] == ‘ ‘)
{
// Remove the chat recognition chars, sMessage will contain the message and the message only
strbreak(sTemp, sCmd, MAX_COMMAND_SIZE-1, sMessage, MAX_MESSAGE_SIZE-1)
}
else
{
// Remove the chat recognition chars without the space.
sTemp[0] = ‘ ‘
trim(sTemp)
copy(sMessage, MAX_MESSAGE_SIZE-1, sTemp)
}
remove_quotes(sMessage)
SendAdminMessage(sMessage, iPlayerID)
return PLUGIN_HANDLED
}
else if ( get_user_flags(iPlayerID) & ADMIN_CHAT )
{
// if the chat starts with AMX_PSAY_CHAR_RECOGNITION. That is, if an admin wants to send a PM
if ( sTemp[0] == AMX_PSAY_CHAR_RECOGNITION )
{
if (sTemp[1] == ‘ ‘)
{
// Remove the chat recognition chars
strbreak(sTemp, sCmd, MAX_COMMAND_SIZE-1, sMessage, MAX_MESSAGE_SIZE-1)
}
else
{
// Remove the chat recognition chars without the space
sTemp[0] = ‘ ‘
trim(sTemp)
copy(sMessage, MAX_MESSAGE_SIZE-1, sTemp)
}
BaseSendPM(sMessage, iPlayerID)
return PLUGIN_HANDLED
}
}
return PLUGIN_CONTINUE
}
// Console command, amx_say <message>
public ConCmdACCSay(iPlayerID)
{
// if the user is an admin with ADMIN_CHAT flag
if ( get_user_flags(iPlayerID) & ADMIN_CHAT )
{
new sMessage[MAX_MESSAGE_SIZE]
read_args(sMessage, MAX_MESSAGE_SIZE-1)
remove_quotes(sMessage)
new sUser[MAX_MESSAGE_SIZE]
get_user_name(iPlayerID, sUser, MAX_MESSAGE_SIZE-1)
// The message that we will actually send
new sRealMessage[MAX_MESSAGE_SIZE] = AMX_SAY_PREFIX
add(sRealMessage, MAX_MESSAGE_SIZE-1, sUser)
add(sRealMessage, MAX_MESSAGE_SIZE-1, AMX_SAY_SUFFIX)
add(sRealMessage, MAX_MESSAGE_SIZE-1, sMessage, MAX_MESSAGE_SIZE-strlen(sRealMessage)-1)
// Get the steamid for the sake of logging
new sSendSteamID[MAX_MESSAGE_SIZE]
get_user_authid(iPlayerID, sSendSteamID, MAX_MESSAGE_SIZE-1)
// Get all current players
new nCurPlayers
new iArrCurPlayers[32]
get_players(iArrCurPlayers, nCurPlayers, “c”)
// Log the message
log_amx(“Chat (ALL), From: ^”%s<%d><%s><>^” Message: ^”%s^””, sUser, iPlayerID, sSendSteamID, sMessage)
log_message(“^”%s<%d><%s><>^” triggered ^”amx_say^” (text ^”%s^”)”,sUser, iPlayerID, sSendSteamID, sMessage)
// For every player
for (new iID = 0; iID < nCurPlayers; iID++)
SendMessage(sRealMessage, iArrCurPlayers[iID]) // Send the message to the player
}
return PLUGIN_HANDLED;
}
// Console command, amx_psay <nick or steamid> <message>
public ConCmdACCPM(iPlayerID)
{
// if the user is an admin
if ( get_user_flags(iPlayerID) & ADMIN_CHAT )
{
new sArgs[MAX_MESSAGE_SIZE]
read_args(sArgs, MAX_MESSAGE_SIZE-1)
BaseSendPM(sArgs, iPlayerID)
}
return PLUGIN_HANDLED
}
// Console Command, amx_chat <message>
public ConCmdACCAdmins(iPlayerID)
{
new sArgs[MAX_MESSAGE_SIZE]
read_args(sArgs, MAX_MESSAGE_SIZE-1)
remove_quotes(sArgs)
SendAdminMessage(sArgs, iPlayerID)
return PLUGIN_HANDLED
}
// Returns the id of the player, IF and only IF it found ONLY one player with which contains the nick provided, otherwise it returns less than 0
FindPlayerWithNick(sNick[MAX_MESSAGE_SIZE])
{
new iArrPlayers[32]
new nPlayers
new sUser[MAX_MESSAGE_SIZE]
new iPlayerID = -100
get_players(iArrPlayers, nPlayers, “c”)
// for every player
for (new iID = 0; iID < nPlayers; iID++)
{
get_user_name(iArrPlayers[iID], sUser, MAX_MESSAGE_SIZE-1)
// Check if their nick contains the nick part provided, ignore caps
if ( containi(sUser, sNick) >= 0 || equali(sUser,sNick) )
{
// if we havent found anyone yet, else return we have found too many
if (iPlayerID == -100)
iPlayerID = iArrPlayers[iID]
else
return TOO_MANY_MATCHED
}
}
if (iPlayerID == -100)
return NONE_MATCHED
else
return iPlayerID
return 0
}
// Returns the id of the player with the correct steamid if it find any, otherwise it returns less than 0
FindPlayerWithSteamID(sSteamID[MAX_MESSAGE_SIZE])
{
new iArrPlayers[32]
new nPlayers
new sUser[MAX_MESSAGE_SIZE]
new iResult
get_players(iArrPlayers, nPlayers, “c”)
for (new iID = 0; iID < nPlayers; iID++)
{
get_user_authid(iArrPlayers[iID], sUser, MAX_MESSAGE_SIZE-1)
// The steam id must be strictly equal
iResult = equal(sUser, sSteamID)
if ( iResult == 1 )
{
// Since steamid is unique, we dont have to check anyone else
return iArrPlayers[iID]
}
}
return NONE_MATCHED
}
// This is where we build the message to be sent, logs the message and find out who the admins are
SendAdminMessage(sMessage[], iSenderID)
{
// The message that is going to be sent. ^x04 is green color
new sRealMessage[MAX_MESSAGE_SIZE] = AMX_CHAT_PREFIX
// Get the username of the sender
new sUser[MAX_MESSAGE_SIZE]
get_user_name(iSenderID, sUser, MAX_MESSAGE_SIZE – 1)
// Add user, “user friendly text” and the message to the message we are going to send
add(sRealMessage, MAX_MESSAGE_SIZE, sUser)
add(sRealMessage, MAX_MESSAGE_SIZE, AMX_CHAT_SUFFIX)
add( sRealMessage, MAX_MESSAGE_SIZE, (sMessage), (MAX_MESSAGE_SIZE-strlen(sRealMessage)-1) )
// Get the steamid for the sake of logging
new sSendSteamID[MAX_MESSAGE_SIZE]
get_user_authid(iSenderID, sSendSteamID, MAX_MESSAGE_SIZE-1)
// Get all current players
new nCurPlayers
new iArrCurPlayers[32]
get_players(iArrCurPlayers, nCurPlayers, “c”)
// Log the message
log_amx(“ADMINS amx_chat, From: ^”%s<%d><%s><>^” Message: ^”%s^””, sUser, iSenderID, sSendSteamID, sMessage)
log_message(“^”%s<%d><%s><>^” triggered ^”amx_chat^” (text ^”%s^”)”,sUser, iSenderID, sSendSteamID, sMessage)
// For every player
for (new iID = 0; iID < nCurPlayers; iID++)
if ( get_user_flags(iArrCurPlayers[iID]) & ADMIN_CHAT ) // If the player is an admin
SendMessage(sRealMessage, iArrCurPlayers[iID]) // Send the message to the player(admin)
}
// This is where we prepare the PM, breaks out the nick and the message from the original message,
// finds who the reciever is and sends it. Also sends error if none or several matches found
BaseSendPM(sArgs[], iPlayerID)
{
new sNick[MAX_MESSAGE_SIZE]
new sMessage[MAX_MESSAGE_SIZE]
// Get the nick/steamid
strbreak(sArgs, sNick, MAX_MESSAGE_SIZE-1, sMessage, MAX_MESSAGE_SIZE-1)
// Remove all those nasty quotes ! ! !
remove_quotes(sNick)
replace(sMessage, MAX_MESSAGE_SIZE-1, “^””, “”)
// Get the players id by comparing the players nick with the one the user supplied
new iResult
if ( equal(sNick, “STEAM_”, 6) )
iResult = FindPlayerWithSteamID(sNick)
else
iResult = FindPlayerWithNick(sNick)
if ( iResult >= 0 ) // if we found “ONE” player with that nick, then we send the PM
{
SendPM(sMessage, iPlayerID, iResult)
}
else // if we found none or several with that nick. Then we send back an error message to the admin
{
new sSendSteamID[MAX_MESSAGE_SIZE]
get_user_authid(iPlayerID, sSendSteamID, MAX_MESSAGE_SIZE-1)
if ( iResult == TOO_MANY_MATCHED )
format(sMessage, MAX_MESSAGE_SIZE-1, AMX_PSAY_FINDNICK_ERROR_TOO_MANY)
else if ( iResult == NONE_MATCHED )
format(sMessage, MAX_MESSAGE_SIZE-1, AMX_PSAY_FINDNICK_ERROR_NONE)
else
format(sMessage, MAX_MESSAGE_SIZE-1, AMX_PSAY_FINDNICK_ERROR_UNKNOWN)
// if the sender is an admin or infact the server itself.
if ( equal(sSendSteamID, “STEAM_”, 6) )
SendMessage(sMessage, iPlayerID)
else
server_print(sMessage)
}
}
// Here we build the PM message, logs it and sends it
SendPM(sMessage[], iSenderID, iRecieverID)
{
new sRealMessage[MAX_MESSAGE_SIZE] = AMX_PSAY_SEND_PREFIX
// To the person
new sUser[MAX_MESSAGE_SIZE]
get_user_name(iSenderID, sUser, MAX_MESSAGE_SIZE – 1)
add(sRealMessage, MAX_MESSAGE_SIZE-1, sUser)
add(sRealMessage, MAX_MESSAGE_SIZE-1, AMX_PSAY_SEND_SUFFIX)
add(sRealMessage, MAX_MESSAGE_SIZE-1, sMessage, MAX_MESSAGE_SIZE-strlen(sRealMessage)-1)
new sRecvSteamID[MAX_MESSAGE_SIZE]
new sSendSteamID[MAX_MESSAGE_SIZE]
new sRecvName[MAX_MESSAGE_SIZE]
get_user_authid(iSenderID, sSendSteamID, MAX_MESSAGE_SIZE-1)
get_user_authid(iRecieverID, sRecvSteamID, MAX_MESSAGE_SIZE-1)
get_user_name(iRecieverID, sRecvName, MAX_MESSAGE_SIZE – 1)
log_amx(“PM From: ^”%s<%d><%s><>^” To: ^”%s<%d><%s><>^” Message: ^”%s^””, sUser, iSenderID, sSendSteamID, sRecvName, iRecieverID, sRecvSteamID, sMessage)
log_message(“^”%s<%d><%s><>^” triggered ^”amx_psay^” against ^”%s<%d><%s><>^” (text ^”%s^”)”,
sUser, iSenderID, sSendSteamID, sRecvName, iRecieverID, sRecvSteamID, sMessage)
SendMessage(sRealMessage, iRecieverID)
// And to the admin who sent it
new sToAdmin[MAX_MESSAGE_SIZE] = AMX_PSAY_BACK_TO_SENDER_PREFIX
add(sToAdmin, MAX_MESSAGE_SIZE-1, sRecvName)
add(sToAdmin, MAX_MESSAGE_SIZE-1, AMX_PSAY_BACK_TO_SENDER_SUFFIX)
add(sToAdmin, MAX_MESSAGE_SIZE-1, sMessage, MAX_MESSAGE_SIZE-strlen(sToAdmin)-1)
// if the sender is an admin or infact the server
if ( equal(sSendSteamID, “STEAM_”, 6) )
SendMessage(sToAdmin, iSenderID)
else
server_print(sToAdmin)
}
// General method for sending chat messages, params are the message to be sent and the id of the player who should get it
SendMessage(sMessage[], iRecieverID)
{
message_begin(MSG_ONE, gmsgSayText, {0,0,0}, iRecieverID)
write_byte(iRecieverID)
write_string(sMessage)
message_end()
}