about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMarius "Teelevision" Neugebauer <marius@teele.eu>2014-04-14 03:11:56 +0200
committerMarius "Teelevision" Neugebauer <marius@teele.eu>2014-04-14 03:11:56 +0200
commitc8878bd6773fb7b5847be3285144a6e20831be37 (patch)
tree40031eb27a679386f37ec01bc515b00e201fafdd /src
parentfbf4a5519a9bcd3bdb15ece82cf6147a9d7a024b (diff)
downloadzcatch-c8878bd6773fb7b5847be3285144a6e20831be37.tar.gz
zcatch-c8878bd6773fb7b5847be3285144a6e20831be37.zip
added PM chat commands /t and /ti
Diffstat (limited to 'src')
-rw-r--r--src/game/server/gamecontext.cpp120
-rw-r--r--src/game/server/gamecontext.h2
2 files changed, 103 insertions, 19 deletions
diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp
index d2de455c..f9158eb5 100644
--- a/src/game/server/gamecontext.cpp
+++ b/src/game/server/gamecontext.cpp
@@ -765,6 +765,28 @@ void CGameContext::OnClientDrop(int ClientID, const char *pReason)
 	}
 }
 
+// returns whether the player is allowed to chat, informs the player and mutes him if needed
+bool CGameContext::MuteValidation(CPlayer *player)
+{
+	int i, ClientID = player->GetCID();
+	if((i = Muted(ClientID)) > -1)
+	{
+		char aBuf[48];
+		int Expires = (m_aMutes[i].m_Expires - Server()->Tick())/Server()->TickSpeed();
+		str_format(aBuf, sizeof(aBuf), "You are muted for %d:%02d min.", Expires/60, Expires%60);
+		SendChatTarget(ClientID, aBuf);
+		return false;
+	}
+	//mute the player if he's spamming
+	else if(g_Config.m_SvMuteDuration && ((player->m_ChatTicks += g_Config.m_SvChatValue) > g_Config.m_SvChatThreshold))
+	{
+		AddMute(ClientID, g_Config.m_SvMuteDuration, true);
+		player->m_ChatTicks = 0;
+		return false;
+	}
+	return true;
+}
+
 void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
 {
 	void *pRawMsg = m_NetObjHandler.SecureUnpackMsg(MsgID, pUnpacker);
@@ -852,6 +874,82 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
 					SendChatTarget(ClientID, "You caught no one since your last death.");
 				}
 			}
+			// tell / PM someone privately
+			else if(!str_comp_nocase_num("t ", pMsg->m_pMessage + 1, 2) || !str_comp_nocase_num("ti ", pMsg->m_pMessage + 1, 3))
+			{
+				const char *recipientStart, *msgStart;
+				int recipient = -1;
+				
+				// by name
+				if(!str_comp_nocase_num("t ", pMsg->m_pMessage + 1, 2))
+				{
+					int recipientNameLength;
+					const char *recipientName;
+					recipientStart = str_skip_whitespaces((char*)pMsg->m_pMessage + 3);
+					// check _all_ players (there might be partly identical names)
+					for(int i = 0; i < MAX_CLIENTS; ++i)
+					{
+						if(m_apPlayers[i]
+							&& (recipientName = Server()->ClientName(i))
+							&& (recipientNameLength = str_length(recipientName))
+							&& !str_comp_num(recipientName, recipientStart, recipientNameLength)
+							&& recipientStart[recipientNameLength] == ' '
+						)
+						{
+							if(recipient >= 0)
+							{
+								SendChatTarget(ClientID, "Could not deliver private message. More than one player could be addressed.");
+								return;
+							}
+							msgStart = recipientStart + recipientNameLength + 1;
+							recipient = i;
+						}
+					}
+				}
+				
+				// by id
+				else if(!str_comp_nocase_num("ti ", pMsg->m_pMessage + 1, 3))
+				{
+					recipientStart = str_skip_whitespaces((char*)pMsg->m_pMessage + 4);
+					// check if int given
+					for(const char *c = recipientStart; *c != ' '; ++c)
+					{
+						if(*c < '0' || '9' < *c)
+						{
+							SendChatTarget(ClientID, "No id given, syntax is: /ti id message.");
+							return;
+						}
+					}
+					int i = str_toint(recipientStart);
+					if(m_apPlayers[i])
+					{
+						recipient = i;
+						msgStart = str_skip_whitespaces(str_skip_to_whitespace((char*)recipientStart));
+					}
+				}
+				
+				if(recipient >= 0)
+				{
+					if(MuteValidation(pPlayer))
+					{
+						// send to recipient
+						const char *msgForm = "[PM <- '%s'] %s",
+							*msgFormSender = "[PM -> '%s'] %s";
+						int len = 32 + MAX_NAME_LENGTH + str_length(msgStart);
+						char *msg = (char*)malloc(len * sizeof(char));
+						str_format(msg, len * sizeof(char), msgForm, Server()->ClientName(ClientID), msgStart);
+						SendChatTarget(recipient, msg);
+						// send to sender
+						str_format(msg, len * sizeof(char), msgFormSender, Server()->ClientName(recipient), msgStart);
+						SendChatTarget(ClientID, msg);
+						delete[] msg;
+					}
+				}
+				else
+				{
+					SendChatTarget(ClientID, "Could not deliver private message. Player not found.");
+				}
+			}
 			else
 			{
 				SendChatTarget(ClientID, "Unknown command, try /info");
@@ -859,25 +957,9 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
 		}
 		else
 		{
-			//Check if muted
-			int Pos;
-			if((Pos = Muted(ClientID)) > -1)
-			{
-				char aBuf[128];
-				int Expires = (m_aMutes[Pos].m_Expires - Server()->Tick())/Server()->TickSpeed();
-				str_format(aBuf, sizeof(aBuf), "You are muted for %d:%02d min.", Expires/60, Expires%60);
-				SendChatTarget(ClientID, aBuf);
-				return;
-			}
-			//mute the player if he's spamming
-			else if(g_Config.m_SvMuteDuration && ((pPlayer->m_ChatTicks += g_Config.m_SvChatValue) > g_Config.m_SvChatThreshold))
-			{
-				AddMute(ClientID, g_Config.m_SvMuteDuration, true);
-				pPlayer->m_ChatTicks = 0;
-				return;
-			}
-
-			SendChat(ClientID, Team, pMsg->m_pMessage);
+			// send to chat
+			if(MuteValidation(pPlayer))
+				SendChat(ClientID, Team, pMsg->m_pMessage);
 		}
 		/* end zCatch */
 	}
diff --git a/src/game/server/gamecontext.h b/src/game/server/gamecontext.h
index 987e1c71..1b980a6f 100644
--- a/src/game/server/gamecontext.h
+++ b/src/game/server/gamecontext.h
@@ -77,6 +77,8 @@ class CGameContext : public IGameServer
 	void Construct(int Resetting);
 
 	bool m_Resetting;
+	
+	bool MuteValidation(CPlayer *player);
 public:
 	IServer *Server() const { return m_pServer; }
 	class IConsole *Console() { return m_pConsole; }