/* EQEmu: EQEmulator Copyright (C) 2001-2026 EQEmu Development Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #pragma once #include "common/net/eqstream.h" #include "common/opcodemgr.h" #include "common/rulesys.h" #include "ucs/chatchannel.h" #include #include #define MAX_JOINED_CHANNELS 10 enum { CommandJoin = 0, CommandLeaveAll, CommandLeave, CommandListAll, CommandList, CommandSet, CommandAnnounce, CommandSetOwner, CommandOPList, CommandInvite, CommandGrant, CommandModerate, CommandVoice, CommandKick, CommandPassword, CommandToggleInvites, CommandAFK, CommandUptime, CommandGetHeaders, CommandGetBody, CommandMailTo, CommandSetMessageStatus, CommandSelectMailBox, CommandSetMailForwarding, CommandBuddy, CommandIgnorePlayer, CommandEndOfList }; struct CommandEntry { const char *CommandString; int CommandCode; }; typedef enum { ConnectionTypeUnknown, ConnectionTypeCombined, ConnectionTypeMail, ConnectionTypeChat } ConnectionType; static const CommandEntry Commands[] = { { "join", CommandJoin }, { "leaveall", CommandLeaveAll }, { "leave", CommandLeave }, { "listall", CommandListAll }, { "list", CommandList }, { "set", CommandSet }, { "announce", CommandAnnounce }, { "setowner", CommandSetOwner }, { "oplist", CommandOPList }, { "invite", CommandInvite }, { "grant", CommandGrant }, { "moderate", CommandModerate }, { "voice", CommandVoice }, { "kick", CommandKick }, { "password", CommandPassword }, { "toggleinvites", CommandToggleInvites }, { "afk", CommandAFK }, { "uptime", CommandUptime }, { "getheaders", CommandGetHeaders }, { "getbody", CommandGetBody }, { "mailto", CommandMailTo }, { "setmessagestatus", CommandSetMessageStatus }, { "selectmailbox", CommandSelectMailBox }, { "setmailforwarding", CommandSetMailForwarding }, { "buddy", CommandBuddy }, { "ignoreplayer", CommandIgnorePlayer }, { "", CommandEndOfList } }; struct CharacterEntry { int CharID; int Level; std::string Name; }; class Client { public: Client(std::shared_ptr eqs); ~Client(); std::shared_ptr ClientStream; void AddCharacter(int CharID, const char *CharacterName, int Level); void ClearCharacters() { Characters.clear(); } void SendMailBoxes(); inline void QueuePacket(const EQApplicationPacket *p, bool ack_req=true) { ClientStream->QueuePacket(p, ack_req); } std::string GetName() { if(Characters.size()) return Characters[0].Name; else return ""; } void JoinChannels(std::string& channel_name_list, bool command_directed = false); void LeaveChannels(std::string& channel_name_list, bool command_directed = false); void LeaveAllChannels(bool send_updated_channel_list = true, bool command_directed = false); void AddToChannelList(ChatChannel *JoinedChannel); void RemoveFromChannelList(ChatChannel *JoinedChannel); void SendChannelMessage(std::string Message); void SendChannelMessage(const std::string& ChannelName, const std::string& Message, Client *Sender); void SendChannelMessageByNumber(std::string Message); void SendChannelList(); void CloseConnection(); void ToggleAnnounce(const std::string& State); bool IsAnnounceOn() { return (Announce == true); } void AnnounceJoin(ChatChannel *Channel, Client *c); void AnnounceLeave(ChatChannel *Channel, Client *c); void GeneralChannelMessage(const std::string& Message); void GeneralChannelMessage(const char *Characters); void SetChannelPassword(std::string ChannelPassword); void ProcessChannelList(const std::string& Input); void AccountUpdate(); int ChannelCount(); std::string RemoveDuplicateChannels(std::string& in_channels); inline void SetAccountID(int inAccountID) { AccountID = inAccountID; } inline int GetAccountID() { return AccountID; } inline void SetAccountStatus(int inStatus) { Status = inStatus; } inline void SetHideMe(bool inHideMe) { HideMe = inHideMe; } inline void SetKarma(uint32 inKarma) { TotalKarma = inKarma; } inline int GetAccountStatus() { return Status; } inline bool GetHideMe() { return HideMe; } inline uint32 GetKarma() { return TotalKarma; } void SetChannelOwner(std::string CommandString); void OPList(std::string CommandString); void ChannelInvite(std::string CommandString); void ChannelGrantModerator(std::string CommandString); void ChannelGrantVoice(std::string CommandString); void ChannelKick(std::string CommandString); void ChannelModerate(std::string CommandString); std::string ChannelSlotName(int ChannelNumber); void ToggleInvites(); bool InvitesAllowed() { return AllowInvites; } bool IsRevoked() { return Revoked; } void SetRevoked(bool r) { Revoked = r; } inline bool IsChannelAdmin() { return (Status >= RuleI(Channels, RequiredStatusAdmin)); } inline bool CanListAllChannels() { return (Status >= RuleI(Channels, RequiredStatusListAll)); } void SendHelp(); inline bool GetForceDisconnect() { return ForceDisconnect; } std::string MailBoxName(); int GetMailBoxNumber() { return CurrentMailBox; } int GetMailBoxNumber(const std::string& CharacterName); void SetConnectionType(char c); ConnectionType GetConnectionType() { return TypeOfConnection; } EQ::versions::ClientVersion GetClientVersion() { return ClientVersion_; } inline bool IsMailConnection() { return (TypeOfConnection == ConnectionTypeMail) || (TypeOfConnection == ConnectionTypeCombined); } void SendNotification(int MailBoxNumber, const std::string& Subject, const std::string& From, int MessageID); void ChangeMailBox(int NewMailBox); inline void SetMailBox(int NewMailBox) { CurrentMailBox = NewMailBox; } void SendFriends(); int GetCharID(); void SendUptime(); void SendKeepAlive(); private: unsigned int CurrentMailBox; std::vector Characters; ChatChannel *JoinedChannels[MAX_JOINED_CHANNELS]; bool Announce; int AccountID; int Status; bool HideMe; bool AllowInvites; bool Revoked; //Anti Spam Stuff Timer *AccountGrabUpdateTimer; uint32 TotalKarma; Timer *GlobalChatLimiterTimer; //60 seconds int AttemptedMessages; bool ForceDisconnect; ConnectionType TypeOfConnection; EQ::versions::ClientVersion ClientVersion_; bool UnderfootOrLater; }; class Clientlist { public: Clientlist(int MailPort); void Process(); void CloseAllConnections(); Client *FindCharacter(const std::string& CharacterName); void CheckForStaleConnectionsAll(); void CheckForStaleConnections(Client *c); Client *IsCharacterOnline(const std::string& CharacterName); void ProcessOPMailCommand(Client* c, std::string command_string, bool command_directed = false); private: EQ::Net::EQStreamManager *chatsf; std::list ClientChatConnections; OpcodeManager *ChatOpMgr; };