Secrets
07-29-2009, 10:24 PM
Index: chatchannel.cpp
================================================== =================
--- chatchannel.cpp (revision 846)
+++ chatchannel.cpp (working copy)
@@ -1,699 +1,725 @@
-/*
- EQEMu: Everquest Server Emulator
-
- Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net)
-
- 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; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY except by those people which sell it, which
- are required to give you total support for your newly bought product;
- 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, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-*/
-
-#include "chatchannel.h"
-#include "clientlist.h"
-#include "database.h"
-#include "../common/MiscFunctions.h"
-#include <cstdlib>
-
-extern Database database;
-
-ChatChannel::ChatChannel(string inName, string inOwner, string inPassword, bool inPermanent, int inMinimumStatus) :
- DeleteTimer(0) {
-
- Name = inName;
-
- Owner = inOwner;
-
- Password = inPassword;
-
- Permanent = inPermanent;
-
- MinimumStatus = inMinimumStatus;
-
- Moderated = false;
-
- _log(CHANNELS__TRACE, "New ChatChannel created: Name: [%s], Owner: [%s], Password: [%s], MinStatus: %i",
- Name.c_str(), Owner.c_str(), Password.c_str(), MinimumStatus);
-
-}
-
-ChatChannel::~ChatChannel() {
-
- LinkedListIterator<Client*> iterator(ClientsInChannel);
-
- iterator.Reset();
-
- while(iterator.MoreElements())
- iterator.RemoveCurrent(false);
-}
-
-ChatChannel* ChatChannelList::CreateChannel(string Name, string Owner, string Password, bool Permanent, int MinimumStatus) {
-
- ChatChannel *NewChannel = new ChatChannel(CapitaliseName(Name), Owner, Password, Permanent, MinimumStatus);
-
- ChatChannels.Insert(NewChannel);
-
- return NewChannel;
-}
-
-ChatChannel* ChatChannelList::FindChannel(string Name) {
-
- string NormalisedName = CapitaliseName(Name);
-
- LinkedListIterator<ChatChannel*> iterator(ChatChannels);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- ChatChannel *CurrentChannel = iterator.GetData();
-
- if(CurrentChannel && (CurrentChannel->Name == NormalisedName))
- return iterator.GetData();
-
- iterator.Advance();
- }
-
- return NULL;
-}
-
-void ChatChannelList::SendAllChannels(Client *c) {
-
- if(!c) return;
-
- if(!c->CanListAllChannels()) {
- c->GeneralChannelMessage("You do not have permission to list all the channels.");
- return;
- }
-
- c->GeneralChannelMessage("All current channels:");
-
- int ChannelsInLine = 0;
-
- LinkedListIterator<ChatChannel*> iterator(ChatChannels);
-
- iterator.Reset();
-
- string Message;
-
- char CountString[10];
-
- while(iterator.MoreElements()) {
-
- ChatChannel *CurrentChannel = iterator.GetData();
-
- if(!CurrentChannel || (CurrentChannel->GetMinStatus() > c->GetAccountStatus())) {
-
- iterator.Advance();
-
- continue;
- }
-
- if(ChannelsInLine > 0)
- Message += ", ";
-
- sprintf(CountString, "(%i)", CurrentChannel->MemberCount(c->GetAccountStatus()));
-
- Message += CurrentChannel->GetName();
-
- Message += CountString;
-
- ChannelsInLine++;
-
- if(ChannelsInLine == 6) {
-
- c->GeneralChannelMessage(Message);
-
- ChannelsInLine = 0;
-
- Message.clear();
- }
-
- iterator.Advance();
- }
-
- if(ChannelsInLine > 0)
- c->GeneralChannelMessage(Message);
-
-}
-
-void ChatChannelList::RemoveChannel(ChatChannel *Channel) {
-
- _log(CHANNELS__TRACE, "RemoveChannel(%s)", Channel->GetName().c_str());
-
- LinkedListIterator<ChatChannel*> iterator(ChatChannels);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- if(iterator.GetData() == Channel) {
-
- iterator.RemoveCurrent();
-
- return;
- }
-
- iterator.Advance();
- }
-}
-
-void ChatChannelList::RemoveAllChannels() {
-
- _log(CHANNELS__TRACE, "RemoveAllChannels");
-
- LinkedListIterator<ChatChannel*> iterator(ChatChannels);
-
- iterator.Reset();
-
- while(iterator.MoreElements())
- iterator.RemoveCurrent();
-}
-
-int ChatChannel::MemberCount(int Status) {
-
- int Count = 0;
-
- LinkedListIterator<Client*> iterator(ClientsInChannel);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- Client *ChannelClient = iterator.GetData();
-
- if(ChannelClient && (!ChannelClient->GetHideMe() || (ChannelClient->GetAccountStatus() < Status)))
- Count++;
-
- iterator.Advance();
- }
-
- return Count;
-}
-
-void ChatChannel::SetPassword(string inPassword) {
-
- Password = inPassword;
-
- if(Permanent)
- {
- RemoveApostrophes(Password);
- database.SetChannelPassword(Name, Password);
- }
-}
-
-void ChatChannel::SetOwner(string inOwner) {
-
- Owner = inOwner;
-
- if(Permanent)
- database.SetChannelOwner(Name, Owner);
-}
-
-void ChatChannel::AddClient(Client *c) {
-
- if(!c) return;
-
- DeleteTimer.Disable();
-
- if(IsClientInChannel(c)) {
-
- _log(CHANNELS__ERROR, "Client %s already in channel %s", c->GetName().c_str(), GetName().c_str());
-
- return;
- }
-
- bool HideMe = c->GetHideMe();
-
- int AccountStatus = c->GetAccountStatus();
-
- _log(CHANNELS__TRACE, "Adding %s to channel %s", c->GetName().c_str(), Name.c_str());
-
- LinkedListIterator<Client*> iterator(ClientsInChannel);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- Client *CurrentClient = iterator.GetData();
-
- if(CurrentClient && CurrentClient->IsAnnounceOn())
- if(!HideMe || (CurrentClient->GetAccountStatus() > AccountStatus))
- CurrentClient->AnnounceJoin(this, c);
-
- iterator.Advance();
- }
-
- ClientsInChannel.Insert(c);
-
-}
-
-bool ChatChannel::RemoveClient(Client *c) {
-
- if(!c) return false;
-
- _log(CHANNELS__TRACE, "RemoveClient %s from channel %s", c->GetName().c_str(), GetName().c_str());
-
- bool HideMe = c->GetHideMe();
-
- int AccountStatus = c->GetAccountStatus();
-
- int PlayersInChannel = 0;
-
- LinkedListIterator<Client*> iterator(ClientsInChannel);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- Client *CurrentClient = iterator.GetData();
-
- if(CurrentClient == c) {
- iterator.RemoveCurrent(false);
- }
- else if(CurrentClient) {
-
- PlayersInChannel++;
-
- if(CurrentClient->IsAnnounceOn())
- if(!HideMe || (CurrentClient->GetAccountStatus() > AccountStatus))
- CurrentClient->AnnounceLeave(this, c);
-
- iterator.Advance();
- }
-
- }
-
- if((PlayersInChannel == 0) && !Permanent) {
-
- if((Password.length() == 0) || (RuleI(Channels, DeleteTimer) == 0))
- return false;
-
- _log(CHANNELS__TRACE, "Starting delete timer for empty password protected channel %s", Name.c_str());
-
- DeleteTimer.Start(RuleI(Channels, DeleteTimer) * 60000);
- }
-
- return true;
-}
-
-void ChatChannel::SendOPList(Client *c) {
-
- if(!c) return;
-
- c->GeneralChannelMessage("Channel " + Name + " op-list: (Owner=" + Owner + ")");
-
- list<string>::iterator Iterator;
-
- for(Iterator = Moderators.begin(); Iterator != Moderators.end(); Iterator++)
- c->GeneralChannelMessage((*Iterator));
-
-}
-
-void ChatChannel::SendChannelMembers(Client *c) {
-
- if(!c) return;
-
- char CountString[10];
-
- sprintf(CountString, "(%i)", MemberCount(c->GetAccountStatus()));
-
- string Message = "Channel " + GetName();
-
- Message += CountString;
-
- Message += " members:";
-
- c->GeneralChannelMessage(Message);
-
- int AccountStatus = c->GetAccountStatus();
-
- Message.clear();
-
- int MembersInLine = 0;
-
- LinkedListIterator<Client*> iterator(ClientsInChannel);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- Client *ChannelClient = iterator.GetData();
-
- // Don't list hidden characters with status higher or equal than the character requesting the list.
- //
- if(!ChannelClient || (ChannelClient->GetHideMe() && (ChannelClient->GetAccountStatus() >= AccountStatus))) {
- iterator.Advance();
- continue;
- }
-
- if(MembersInLine > 0)
- Message += ", ";
-
- Message += ChannelClient->GetName();
-
- MembersInLine++;
-
- if(MembersInLine == 6) {
-
- c->GeneralChannelMessage(Message);
-
- MembersInLine = 0;
-
- Message.clear();
- }
-
- iterator.Advance();
- }
-
- if(MembersInLine > 0)
- c->GeneralChannelMessage(Message);
-
-}
-
-void ChatChannel::SendMessageToChannel(string Message, Client* Sender) {
-
- if(!Sender) return;
-
- LinkedListIterator<Client*> iterator(ClientsInChannel);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- Client *ChannelClient = iterator.GetData();
-
- if(ChannelClient)
- ChannelClient->SendChannelMessage(Name, Message, Sender);
-
- iterator.Advance();
- }
-}
-
-void ChatChannel::SetModerated(bool inModerated) {
-
- Moderated = inModerated;
-
- LinkedListIterator<Client*> iterator(ClientsInChannel);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- Client *ChannelClient = iterator.GetData();
-
- if(ChannelClient) {
-
- if(Moderated)
- ChannelClient->GeneralChannelMessage("Channel " + Name + " is now moderated.");
- else
- ChannelClient->GeneralChannelMessage("Channel " + Name + " is no longer moderated.");
- }
-
- iterator.Advance();
- }
-
-}
-bool ChatChannel::IsClientInChannel(Client *c) {
-
- if(!c) return false;
-
- LinkedListIterator<Client*> iterator(ClientsInChannel);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- if(iterator.GetData() == c)
- return true;
-
- iterator.Advance();
- }
-
- return false;
-}
-
-ChatChannel *ChatChannelList::AddClientToChannel(string ChannelName, Client *c) {
-
- if(!c) return NULL;
-
- if((ChannelName.length() > 0) && (isdigit(ChannelName[0]))) {
-
- c->GeneralChannelMessage("The channel name can not begin with a number.");
-
- return NULL;
- }
-
- string NormalisedName, Password;
-
- string::size_type Colon = ChannelName.find_first_of(":");
-
- if(Colon == string::npos)
- NormalisedName = CapitaliseName(ChannelName);
- else {
- NormalisedName = CapitaliseName(ChannelName.substr(0, Colon));
-
- Password = ChannelName.substr(Colon + 1);
- }
-
- if((NormalisedName.length() > 64) || (Password.length() > 64)) {
-
- c->GeneralChannelMessage("The channel name or password cannot exceed 64 characters.");
-
- return NULL;
- }
-
- _log(CHANNELS__TRACE, "AddClient to channel [%s] with password [%s]", NormalisedName.c_str(), Password.c_str());
-
- ChatChannel *RequiredChannel = FindChannel(NormalisedName);
-
- if(!RequiredChannel)
- RequiredChannel = CreateChannel(NormalisedName, c->GetName(), Password, false, 0);
-
- if(RequiredChannel->GetMinStatus() > c->GetAccountStatus()) {
-
- string Message = "You do not have the required account status to join channel " + NormalisedName;
-
- c->GeneralChannelMessage(Message);
-
- return NULL;
- }
-
- if(RequiredChannel->IsClientInChannel(c))
- return NULL;
-
- if(RequiredChannel->IsInvitee(c->GetName())) {
-
- RequiredChannel->AddClient(c);
-
- RequiredChannel->RemoveInvitee(c->GetName());
-
- return RequiredChannel;
- }
-
- if(RequiredChannel->CheckPassword(Password) || RequiredChannel->IsOwner(c->GetName()) || RequiredChannel->IsModerator(c->GetName()) ||
- c->IsChannelAdmin()) {
-
- RequiredChannel->AddClient(c);
-
- return RequiredChannel;
- }
-
- c->GeneralChannelMessage("Incorrect password for channel " + (NormalisedName));
-
- return NULL;
-}
-
-ChatChannel *ChatChannelList::RemoveClientFromChannel(string inChannelName, Client *c) {
-
- if(!c) return NULL;
-
- string ChannelName = inChannelName;
-
- if((inChannelName.length() > 0) && isdigit(ChannelName[0]))
- ChannelName = c->ChannelSlotName(atoi(inChannelName.c_str()));
-
- ChatChannel *RequiredChannel = FindChannel(ChannelName);
-
- if(!RequiredChannel)
- return NULL;
-
- // RemoveClient will return false if there is no-one left in the channel, and the channel is not permanent and has
- // no password.
- //
- if(!RequiredChannel->RemoveClient(c))
- RemoveChannel(RequiredChannel);
-
- return RequiredChannel;
-}
-
-void ChatChannelList::Process() {
-
- LinkedListIterator<ChatChannel*> iterator(ChatChannels);
-
- iterator.Reset();
-
- while(iterator.MoreElements()) {
-
- ChatChannel *CurrentChannel = iterator.GetData();
-
- if(CurrentChannel && CurrentChannel->ReadyToDelete()) {
-
- _log(CHANNELS__TRACE, "Empty temporary password protected channel %s being destroyed.",
- CurrentChannel->GetName().c_str());
-
- RemoveChannel(CurrentChannel);
- }
-
- iterator.Advance();
-
- }
-}
-
-void ChatChannel::AddInvitee(string Invitee) {
-
- if(!IsInvitee(Invitee)) {
-
- Invitees.push_back(Invitee);
-
- _log(CHANNELS__TRACE, "Added %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
- }
-
-}
-
-void ChatChannel::RemoveInvitee(string Invitee) {
-
- list<string>::iterator Iterator;
-
- for(Iterator = Invitees.begin(); Iterator != Invitees.end(); Iterator++) {
-
- if((*Iterator) == Invitee) {
-
- Invitees.erase(Iterator);
-
- _log(CHANNELS__TRACE, "Removed %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
-
- return;
- }
- }
-}
-
-bool ChatChannel::IsInvitee(string Invitee) {
-
- list<string>::iterator Iterator;
-
- for(Iterator = Invitees.begin(); Iterator != Invitees.end(); Iterator++) {
-
- if((*Iterator) == Invitee)
- return true;
- }
-
- return false;
-}
-
-void ChatChannel::AddModerator(string Moderator) {
-
- if(!IsModerator(Moderator)) {
-
- Moderators.push_back(Moderator);
-
- _log(CHANNELS__TRACE, "Added %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
- }
-
-}
-
-void ChatChannel::RemoveModerator(string Moderator) {
-
- list<string>::iterator Iterator;
-
- for(Iterator = Moderators.begin(); Iterator != Moderators.end(); Iterator++) {
-
- if((*Iterator) == Moderator) {
-
- Moderators.erase(Iterator);
-
- _log(CHANNELS__TRACE, "Removed %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
-
- return;
- }
- }
-}
-
-bool ChatChannel::IsModerator(string Moderator) {
-
- list<string>::iterator Iterator;
-
- for(Iterator = Moderators.begin(); Iterator != Moderators.end(); Iterator++) {
-
- if((*Iterator) == Moderator)
- return true;
- }
-
- return false;
-}
-
-void ChatChannel::AddVoice(string inVoiced) {
-
- if(!HasVoice(inVoiced)) {
-
- Voiced.push_back(inVoiced);
-
- _log(CHANNELS__TRACE, "Added %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
- }
-
-}
-
-void ChatChannel::RemoveVoice(string inVoiced) {
-
- list<string>::iterator Iterator;
-
- for(Iterator = Voiced.begin(); Iterator != Voiced.end(); Iterator++) {
-
- if((*Iterator) == inVoiced) {
-
- Voiced.erase(Iterator);
-
- _log(CHANNELS__TRACE, "Removed %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
-
- return;
- }
- }
-}
-
-bool ChatChannel::HasVoice(string inVoiced) {
-
- list<string>::iterator Iterator;
-
- for(Iterator = Voiced.begin(); Iterator != Voiced.end(); Iterator++) {
-
- if((*Iterator) == inVoiced)
- return true;
- }
-
- return false;
-}
-
-string CapitaliseName(string inString) {
-
- string NormalisedName = inString;
-
- for(unsigned int i = 0; i < NormalisedName.length(); i++) {
-
- if(i == 0)
- NormalisedName[i] = toupper(NormalisedName[i]);
- else
- NormalisedName[i] = tolower(NormalisedName[i]);
- }
-
- return NormalisedName;
-}
+/*
+ EQEMu: Everquest Server Emulator
+
+ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net)
+
+ 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; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY except by those people which sell it, which
+ are required to give you total support for your newly bought product;
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+
+#include "chatchannel.h"
+#include "ChatConfig.h"
+#include "clientlist.h"
+#include "database.h"
+#include "../common/MiscFunctions.h"
+#include <cstdlib>
+#include "IRC.h"
+
+extern Database database;
+
+extern IRC conn;
+
+ChatChannel::ChatChannel(string inName, string inOwner, string inPassword, bool inPermanent, int inMinimumStatus) :
+ DeleteTimer(0) {
+
+ Name = inName;
+
+ Owner = inOwner;
+
+ Password = inPassword;
+
+ Permanent = inPermanent;
+
+ MinimumStatus = inMinimumStatus;
+
+ Moderated = false;
+
+ _log(CHANNELS__TRACE, "New ChatChannel created: Name: [%s], Owner: [%s], Password: [%s], MinStatus: %i",
+ Name.c_str(), Owner.c_str(), Password.c_str(), MinimumStatus);
+
+}
+
+ChatChannel::~ChatChannel() {
+
+ LinkedListIterator<Client*> iterator(ClientsInChannel);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements())
+ iterator.RemoveCurrent(false);
+}
+
+ChatChannel* ChatChannelList::CreateChannel(string Name, string Owner, string Password, bool Permanent, int MinimumStatus) {
+
+ ChatChannel *NewChannel = new ChatChannel(CapitaliseName(Name), Owner, Password, Permanent, MinimumStatus);
+
+ ChatChannels.Insert(NewChannel);
+
+ return NewChannel;
+}
+
+ChatChannel* ChatChannelList::FindChannel(string Name) {
+
+ string NormalisedName = CapitaliseName(Name);
+
+ LinkedListIterator<ChatChannel*> iterator(ChatChannels);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ ChatChannel *CurrentChannel = iterator.GetData();
+
+ if(CurrentChannel && (CurrentChannel->Name == NormalisedName))
+ return iterator.GetData();
+
+ iterator.Advance();
+ }
+
+ return NULL;
+}
+
+void ChatChannelList::SendAllChannels(Client *c) {
+
+ if(!c) return;
+
+ if(!c->CanListAllChannels()) {
+ c->GeneralChannelMessage("You do not have permission to list all the channels.");
+ return;
+ }
+
+ c->GeneralChannelMessage("All current channels:");
+
+ int ChannelsInLine = 0;
+
+ LinkedListIterator<ChatChannel*> iterator(ChatChannels);
+
+ iterator.Reset();
+
+ string Message;
+
+ char CountString[10];
+
+ while(iterator.MoreElements()) {
+
+ ChatChannel *CurrentChannel = iterator.GetData();
+
+ if(!CurrentChannel || (CurrentChannel->GetMinStatus() > c->GetAccountStatus())) {
+
+ iterator.Advance();
+
+ continue;
+ }
+
+ if(ChannelsInLine > 0)
+ Message += ", ";
+
+ sprintf(CountString, "(%i)", CurrentChannel->MemberCount(c->GetAccountStatus()));
+
+ Message += CurrentChannel->GetName();
+
+ Message += CountString;
+
+ ChannelsInLine++;
+
+ if(ChannelsInLine == 6) {
+
+ c->GeneralChannelMessage(Message);
+
+ ChannelsInLine = 0;
+
+ Message.clear();
+ }
+
+ iterator.Advance();
+ }
+
+ if(ChannelsInLine > 0)
+ c->GeneralChannelMessage(Message);
+
+}
+
+void ChatChannelList::RemoveChannel(ChatChannel *Channel) {
+
+ _log(CHANNELS__TRACE, "RemoveChannel(%s)", Channel->GetName().c_str());
+
+ LinkedListIterator<ChatChannel*> iterator(ChatChannels);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ if(iterator.GetData() == Channel) {
+
+ iterator.RemoveCurrent();
+
+ return;
+ }
+
+ iterator.Advance();
+ }
+}
+
+void ChatChannelList::RemoveAllChannels() {
+
+ _log(CHANNELS__TRACE, "RemoveAllChannels");
+
+ LinkedListIterator<ChatChannel*> iterator(ChatChannels);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements())
+ iterator.RemoveCurrent();
+}
+
+int ChatChannel::MemberCount(int Status) {
+
+ int Count = 0;
+
+ LinkedListIterator<Client*> iterator(ClientsInChannel);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ Client *ChannelClient = iterator.GetData();
+
+ if(ChannelClient && (!ChannelClient->GetHideMe() || (ChannelClient->GetAccountStatus() < Status)))
+ Count++;
+
+ iterator.Advance();
+ }
+
+ return Count;
+}
+
+void ChatChannel::SetPassword(string inPassword) {
+
+ Password = inPassword;
+
+ if(Permanent)
+ {
+ RemoveApostrophes(Password);
+ database.SetChannelPassword(Name, Password);
+ }
+}
+
+void ChatChannel::SetOwner(string inOwner) {
+
+ Owner = inOwner;
+
+ if(Permanent)
+ database.SetChannelOwner(Name, Owner);
+}
+
+void ChatChannel::AddClient(Client *c) {
+
+ if(!c) return;
+
+ DeleteTimer.Disable();
+
+ if(IsClientInChannel(c)) {
+
+ _log(CHANNELS__ERROR, "Client %s already in channel %s", c->GetName().c_str(), GetName().c_str());
+
+ return;
+ }
+
+ bool HideMe = c->GetHideMe();
+
+ int AccountStatus = c->GetAccountStatus();
+
+ _log(CHANNELS__TRACE, "Adding %s to channel %s", c->GetName().c_str(), Name.c_str());
+
+ LinkedListIterator<Client*> iterator(ClientsInChannel);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ Client *CurrentClient = iterator.GetData();
+
+ if(CurrentClient && CurrentClient->IsAnnounceOn())
+ if(!HideMe || (CurrentClient->GetAccountStatus() > AccountStatus))
+ CurrentClient->AnnounceJoin(this, c);
+
+ iterator.Advance();
+ }
+
+ ClientsInChannel.Insert(c);
+
+}
+
+bool ChatChannel::RemoveClient(Client *c) {
+
+ if(!c) return false;
+
+ _log(CHANNELS__TRACE, "RemoveClient %s from channel %s", c->GetName().c_str(), GetName().c_str());
+
+ bool HideMe = c->GetHideMe();
+
+ int AccountStatus = c->GetAccountStatus();
+
+ int PlayersInChannel = 0;
+
+ LinkedListIterator<Client*> iterator(ClientsInChannel);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ Client *CurrentClient = iterator.GetData();
+
+ if(CurrentClient == c) {
+ iterator.RemoveCurrent(false);
+ }
+ else if(CurrentClient) {
+
+ PlayersInChannel++;
+
+ if(CurrentClient->IsAnnounceOn())
+ if(!HideMe || (CurrentClient->GetAccountStatus() > AccountStatus))
+ CurrentClient->AnnounceLeave(this, c);
+
+ iterator.Advance();
+ }
+
+ }
+
+ if((PlayersInChannel == 0) && !Permanent) {
+
+ if((Password.length() == 0) || (RuleI(Channels, DeleteTimer) == 0))
+ return false;
+
+ _log(CHANNELS__TRACE, "Starting delete timer for empty password protected channel %s", Name.c_str());
+
+ DeleteTimer.Start(RuleI(Channels, DeleteTimer) * 60000);
+ }
+
+ return true;
+}
+
+void ChatChannel::SendOPList(Client *c) {
+
+ if(!c) return;
+
+ c->GeneralChannelMessage("Channel " + Name + " op-list: (Owner=" + Owner + ")");
+
+ list<string>::iterator Iterator;
+
+ for(Iterator = Moderators.begin(); Iterator != Moderators.end(); Iterator++)
+ c->GeneralChannelMessage((*Iterator));
+
+}
+
+void ChatChannel::SendChannelMembers(Client *c) {
+
+ if(!c) return;
+
+ char CountString[10];
+
+ sprintf(CountString, "(%i)", MemberCount(c->GetAccountStatus()));
+
+ string Message = "Channel " + GetName();
+
+ Message += CountString;
+
+ Message += " members:";
+
+ c->GeneralChannelMessage(Message);
+
+ int AccountStatus = c->GetAccountStatus();
+
+ Message.clear();
+
+ int MembersInLine = 0;
+
+ LinkedListIterator<Client*> iterator(ClientsInChannel);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ Client *ChannelClient = iterator.GetData();
+
+ // Don't list hidden characters with status higher or equal than the character requesting the list.
+ //
+ if(!ChannelClient || (ChannelClient->GetHideMe() && (ChannelClient->GetAccountStatus() >= AccountStatus))) {
+ iterator.Advance();
+ continue;
+ }
+
+ if(MembersInLine > 0)
+ Message += ", ";
+
+ Message += ChannelClient->GetName();
+
+ MembersInLine++;
+
+ if(MembersInLine == 6) {
+
+ c->GeneralChannelMessage(Message);
+
+ MembersInLine = 0;
+
+ Message.clear();
+ }
+
+ iterator.Advance();
+ }
+
+ if(MembersInLine > 0)
+ c->GeneralChannelMessage(Message);
+
+}
+
+void ChatChannel::SendMessageToChannel(string Message, Client* Sender) { /* edited for IRC -- Secrets*/
+
+ if(!Sender) return;
+
+ const ChatConfig *Config=ChatConfig::get();
+
+ LinkedListIterator<Client*> iterator(ClientsInChannel);
+
+ string ChannelToOutput = Config->ChannelToOutput.c_str();
+
+ char target[64];
+ strcpy(target,Config->ChannelToOutput.c_str());
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ Client *ChannelClient = iterator.GetData();
+
+ if(ChannelClient)
+ ChannelClient->SendChannelMessage(Name, Message, Sender);
+ conn.privmsg(target,"%s tells channel '%s', '%s'", Sender->GetName().c_str(), Name.c_str() , Message.c_str()); // Secrets -- IRC : Send message to IRC also
+ iterator.Advance();
+ }
+}
+
+void ChatChannel::SendMessageToChannelFromIRC(string Message, string IRCName) { /* Sends IRC Messages to Game */
+
+ LinkedListIterator<Client*> iterator(ClientsInChannel);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ Client *ChannelClient = iterator.GetData();
+
+ if(ChannelClient)
+ ChannelClient->SendChannelMessageFromIRC(Message, IRCName);
+ iterator.Advance();
+ }
+}
+
+void ChatChannel::SetModerated(bool inModerated) {
+
+ Moderated = inModerated;
+
+ LinkedListIterator<Client*> iterator(ClientsInChannel);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ Client *ChannelClient = iterator.GetData();
+
+ if(ChannelClient) {
+
+ if(Moderated)
+ ChannelClient->GeneralChannelMessage("Channel " + Name + " is now moderated.");
+ else
+ ChannelClient->GeneralChannelMessage("Channel " + Name + " is no longer moderated.");
+ }
+
+ iterator.Advance();
+ }
+
+}
+bool ChatChannel::IsClientInChannel(Client *c) {
+
+ if(!c) return false;
+
+ LinkedListIterator<Client*> iterator(ClientsInChannel);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ if(iterator.GetData() == c)
+ return true;
+
+ iterator.Advance();
+ }
+
+ return false;
+}
+
+ChatChannel *ChatChannelList::AddClientToChannel(string ChannelName, Client *c) {
+
+ if(!c) return NULL;
+
+ if((ChannelName.length() > 0) && (isdigit(ChannelName[0]))) {
+
+ c->GeneralChannelMessage("The channel name can not begin with a number.");
+
+ return NULL;
+ }
+
+ string NormalisedName, Password;
+
+ string::size_type Colon = ChannelName.find_first_of(":");
+
+ if(Colon == string::npos)
+ NormalisedName = CapitaliseName(ChannelName);
+ else {
+ NormalisedName = CapitaliseName(ChannelName.substr(0, Colon));
+
+ Password = ChannelName.substr(Colon + 1);
+ }
+
+ if((NormalisedName.length() > 64) || (Password.length() > 64)) {
+
+ c->GeneralChannelMessage("The channel name or password cannot exceed 64 characters.");
+
+ return NULL;
+ }
+
+ _log(CHANNELS__TRACE, "AddClient to channel [%s] with password [%s]", NormalisedName.c_str(), Password.c_str());
+
+ ChatChannel *RequiredChannel = FindChannel(NormalisedName);
+
+ if(!RequiredChannel)
+ RequiredChannel = CreateChannel(NormalisedName, c->GetName(), Password, false, 0);
+
+ if(RequiredChannel->GetMinStatus() > c->GetAccountStatus()) {
+
+ string Message = "You do not have the required account status to join channel " + NormalisedName;
+
+ c->GeneralChannelMessage(Message);
+
+ return NULL;
+ }
+
+ if(RequiredChannel->IsClientInChannel(c))
+ return NULL;
+
+ if(RequiredChannel->IsInvitee(c->GetName())) {
+
+ RequiredChannel->AddClient(c);
+
+ RequiredChannel->RemoveInvitee(c->GetName());
+
+ return RequiredChannel;
+ }
+
+ if(RequiredChannel->CheckPassword(Password) || RequiredChannel->IsOwner(c->GetName()) || RequiredChannel->IsModerator(c->GetName()) ||
+ c->IsChannelAdmin()) {
+
+ RequiredChannel->AddClient(c);
+
+ return RequiredChannel;
+ }
+
+ c->GeneralChannelMessage("Incorrect password for channel " + (NormalisedName));
+
+ return NULL;
+}
+
+ChatChannel *ChatChannelList::RemoveClientFromChannel(string inChannelName, Client *c) {
+
+ if(!c) return NULL;
+
+ string ChannelName = inChannelName;
+
+ if((inChannelName.length() > 0) && isdigit(ChannelName[0]))
+ ChannelName = c->ChannelSlotName(atoi(inChannelName.c_str()));
+
+ ChatChannel *RequiredChannel = FindChannel(ChannelName);
+
+ if(!RequiredChannel)
+ return NULL;
+
+ // RemoveClient will return false if there is no-one left in the channel, and the channel is not permanent and has
+ // no password.
+ //
+ if(!RequiredChannel->RemoveClient(c))
+ RemoveChannel(RequiredChannel);
+
+ return RequiredChannel;
+}
+
+void ChatChannelList::Process() {
+
+ LinkedListIterator<ChatChannel*> iterator(ChatChannels);
+
+ iterator.Reset();
+
+ while(iterator.MoreElements()) {
+
+ ChatChannel *CurrentChannel = iterator.GetData();
+
+ if(CurrentChannel && CurrentChannel->ReadyToDelete()) {
+
+ _log(CHANNELS__TRACE, "Empty temporary password protected channel %s being destroyed.",
+ CurrentChannel->GetName().c_str());
+
+ RemoveChannel(CurrentChannel);
+ }
+
+ iterator.Advance();
+
+ }
+}
+
+void ChatChannel::AddInvitee(string Invitee) {
+
+ if(!IsInvitee(Invitee)) {
+
+ Invitees.push_back(Invitee);
+
+ _log(CHANNELS__TRACE, "Added %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
+ }
+
+}
+
+void ChatChannel::RemoveInvitee(string Invitee) {
+
+ list<string>::iterator Iterator;
+
+ for(Iterator = Invitees.begin(); Iterator != Invitees.end(); Iterator++) {
+
+ if((*Iterator) == Invitee) {
+
+ Invitees.erase(Iterator);
+
+ _log(CHANNELS__TRACE, "Removed %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
+
+ return;
+ }
+ }
+}
+
+bool ChatChannel::IsInvitee(string Invitee) {
+
+ list<string>::iterator Iterator;
+
+ for(Iterator = Invitees.begin(); Iterator != Invitees.end(); Iterator++) {
+
+ if((*Iterator) == Invitee)
+ return true;
+ }
+
+ return false;
+}
+
+void ChatChannel::AddModerator(string Moderator) {
+
+ if(!IsModerator(Moderator)) {
+
+ Moderators.push_back(Moderator);
+
+ _log(CHANNELS__TRACE, "Added %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
+ }
+
+}
+
+void ChatChannel::RemoveModerator(string Moderator) {
+
+ list<string>::iterator Iterator;
+
+ for(Iterator = Moderators.begin(); Iterator != Moderators.end(); Iterator++) {
+
+ if((*Iterator) == Moderator) {
+
+ Moderators.erase(Iterator);
+
+ _log(CHANNELS__TRACE, "Removed %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
+
+ return;
+ }
+ }
+}
+
+bool ChatChannel::IsModerator(string Moderator) {
+
+ list<string>::iterator Iterator;
+
+ for(Iterator = Moderators.begin(); Iterator != Moderators.end(); Iterator++) {
+
+ if((*Iterator) == Moderator)
+ return true;
+ }
+
+ return false;
+}
+
+void ChatChannel::AddVoice(string inVoiced) {
+
+ if(!HasVoice(inVoiced)) {
+
+ Voiced.push_back(inVoiced);
+
+ _log(CHANNELS__TRACE, "Added %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
+ }
+
+}
+
+void ChatChannel::RemoveVoice(string inVoiced) {
+
+ list<string>::iterator Iterator;
+
+ for(Iterator = Voiced.begin(); Iterator != Voiced.end(); Iterator++) {
+
+ if((*Iterator) == inVoiced) {
+
+ Voiced.erase(Iterator);
+
+ _log(CHANNELS__TRACE, "Removed %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
+
+ return;
+ }
+ }
+}
+
+bool ChatChannel::HasVoice(string inVoiced) {
+
+ list<string>::iterator Iterator;
+
+ for(Iterator = Voiced.begin(); Iterator != Voiced.end(); Iterator++) {
+
+ if((*Iterator) == inVoiced)
+ return true;
+ }
+
+ return false;
+}
+
+string CapitaliseName(string inString) {
+
+ string NormalisedName = inString;
+
+ for(unsigned int i = 0; i < NormalisedName.length(); i++) {
+
+ if(i == 0)
+ NormalisedName[i] = toupper(NormalisedName[i]);
+ else
+ NormalisedName[i] = tolower(NormalisedName[i]);
+ }
+
+ return NormalisedName;
+}
Index: chatchannel.h
================================================== =================
--- chatchannel.h (revision 846)
+++ chatchannel.h (working copy)
@@ -25,6 +25,7 @@
int MemberCount(int Status);
string GetName() { return Name; }
void SendMessageToChannel(string Message, Client* Sender);
+ void SendMessageToChannelFromIRC(string Message, string IRCName);
bool CheckPassword(string inPassword) { return ((Password.length() == 0) || (Password == inPassword)); }
void SetPassword(string inPassword);
bool IsOwner(string Name) { return (Owner == Name); }
@@ -44,7 +45,6 @@
bool HasVoice(string Voiced);
inline bool IsModerated() { return Moderated; }
void SetModerated(bool inModerated);
-
friend class ChatChannelList;
private:
Index: chatserver.cpp
================================================== =================
--- chatserver.cpp (revision 846)
+++ chatserver.cpp (working copy)
@@ -1,155 +1,237 @@
-/*
- EQEMu: Everquest Server Emulator
-
- Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net)
-
- 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; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY except by those people which sell it, which
- are required to give you total support for your newly bought product;
- 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, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-*/
-
-#include "../common/debug.h"
-#include "clientlist.h"
-#include "../common/opcodemgr.h"
-#include "../common/EQStreamFactory.h"
-#include "../common/rulesys.h"
-#include "database.h"
-#include "ChatConfig.h"
-#include "chatchannel.h"
-#include <list>
-#include <signal.h>
-
-volatile bool RunLoops = true;
-
-TimeoutManager timeout_manager;
-
-Clientlist *CL;
-
-ChatChannelList *ChannelList;
-
-Database database;
-
-string WorldShortName;
-
-RuleManager *rules = new RuleManager();
-
-void CatchSignal(int sig_num) {
-
- RunLoops = false;
-}
-
-string GetMailPrefix() {
-
- return "SOE.EQ." + WorldShortName + ".";
-
-}
-
-int main() {
-
- // Check every minute for unused channels we can delete
- //
- Timer ChannelListProcessTimer(60000);
-
- _log(CHANNELS__INIT, "Starting EQEmu Chat Channel Server");
-
- if (!ChatConfig::LoadConfig()) {
-
- _log(CHANNELS__INIT, "Loading server configuration failed.");
-
- return(1);
- }
-
- const ChatConfig *Config=ChatConfig::get();
-
- if(!load_log_settings(Config->LogSettingsFile.c_str()))
- _log(CHANNELS__INIT, "Warning: Unable to read %s", Config->LogSettingsFile.c_str());
- else
- _log(CHANNELS__INIT, "Log settings loaded from %s", Config->LogSettingsFile.c_str());
-
- WorldShortName = Config->ShortName;
-
- _log(CHANNELS__INIT, "Connecting to MySQL...");
-
- if (!database.Connect(
- Config->DatabaseHost.c_str(),
- Config->DatabaseUsername.c_str(),
- Config->DatabasePassword.c_str(),
- Config->DatabaseDB.c_str(),
- Config->DatabasePort)) {
- _log(WORLD__INIT_ERR, "Cannot continue without a database connection.");
- return(1);
- }
-
- char tmp[64];
-
- if (database.GetVariable("RuleSet", tmp, sizeof(tmp)-1)) {
- _log(WORLD__INIT, "Loading rule set '%s'", tmp);
- if(!rules->LoadRules(&database, tmp)) {
- _log(CHANNELS__ERROR, "Failed to load ruleset '%s', falling back to defaults.", tmp);
- }
- } else {
- if(!rules->LoadRules(&database, "default")) {
- _log(CHANNELS__INIT, "No rule set configured, using default rules");
- } else {
- _log(CHANNELS__INIT, "Loaded default rule set 'default'", tmp);
- }
- }
-
- CL = new Clientlist(Config->ChatPort);
-
- ChannelList = new ChatChannelList();
-
- database.LoadChatChannels();
-
- if (signal(SIGINT, CatchSignal) == SIG_ERR) {
- _log(CHANNELS__ERROR, "Could not set signal handler");
- return 0;
- }
- if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
- _log(CHANNELS__ERROR, "Could not set signal handler");
- return 0;
- }
-
- while(RunLoops) {
-
- Timer::SetCurrentTime();
-
- CL->Process();
-
- if(ChannelListProcessTimer.Check())
- ChannelList->Process();
-
- timeout_manager.CheckTimeouts();
-
- Sleep(100);
- }
-
- ChannelList->RemoveAllChannels();
-
- CL->CloseAllConnections();
-
-}
-
-void UpdateWindowTitle(char* iNewTitle) {
-#ifdef WIN32
- char tmp[500];
- if (iNewTitle) {
- snprintf(tmp, sizeof(tmp), "World: %s", iNewTitle);
- }
- else {
- snprintf(tmp, sizeof(tmp), "World");
- }
- SetConsoleTitle(tmp);
-#endif
-}
+/*
+ EQEMu: Everquest Server Emulator
+
+ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net)
+
+ 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; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY except by those people which sell it, which
+ are required to give you total support for your newly bought product;
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+
+
+#include "../common/debug.h"
+#include "clientlist.h"
+#include "../common/opcodemgr.h"
+#include "../common/EQStreamFactory.h"
+#include "../common/rulesys.h"
+#include "database.h"
+#include "ChatConfig.h"
+#include "chatchannel.h"
+#include "IRC.h"
+#include <list>
+#include <signal.h>
+#ifdef WIN32
+#include <process.h>
+#else
+#include <pthread.h>
+#endif
+
+volatile bool RunLoops = true;
+
+TimeoutManager timeout_manager;
+
+Clientlist *CL;
+
+ChatChannelList *ChannelList;
+
+Database database;
+
+string WorldShortName;
+
+RuleManager *rules = new RuleManager();
+
+IRC conn; // Secrets edit
+
+
+void CatchSignal(int sig_num) {
+
+ RunLoops = false;
+}
+
+string GetMailPrefix() {
+
+ return "SOE.EQ." + WorldShortName + ".";
+}
+
+void IRCConnect(void* irc_conn) { /* maintains the loop for processing the other two IRC commands */
+ conn.message_loop();
+}
+
+
+int end_of_motd(char* params, irc_reply_data* hostd, void* conn) /* hooks END OF MOTD message from IRC */
+ {
+ IRC* irc_conn=(IRC*)conn;
+
+ const ChatConfig *Config=ChatConfig::get();
+
+ char name[128];
+
+ strcpy(name,Config->ChatIRCHost.c_str());
+
+
+ irc_conn->join(name);
+
+ return 0;
+ }
+
+int triggers(char*params,irc_reply_data*hostd,void*con n) /* hooks privmsg to your specified channel */
+{
+
+ IRC* irc_conn=(IRC*)conn;
+
+
+ const ChatConfig *Config=ChatConfig::get();
+
+ string ChannelName = Config->EQChannelToOutput;
+
+ ChatChannel *RequiredChannel = ChannelList->FindChannel(ChannelName);
+
+ char name[128];
+ strcpy(name,Config->ChannelToOutput.c_str());
+
+ if(!strcmp(params,":!rejoin"))
+ {
+ irc_conn->join(name);
+ }
+
+ string parame = params;
+ string IRCName = hostd->nick;
+
+ if(!strcmp(hostd->target,name))
+
+ {
+ RequiredChannel->SendMessageToChannelFromIRC(parame, IRCName); // I got an IRC command, now let's send it
+ }
+ return 0;
+
+}
+
+int main() {
+
+ // Check every minute for unused channels we can delete
+ //
+ Timer ChannelListProcessTimer(60000);
+
+ _log(CHANNELS__INIT, "Starting EQEmu Chat Channel Server");
+
+
+ if (!ChatConfig::LoadConfig()) {
+
+ _log(CHANNELS__INIT, "Loading server configuration failed.");
+
+ return(1);
+ }
+
+ const ChatConfig *Config=ChatConfig::get();
+
+ /* begin IRC crap */
+
+
+
+ #ifndef WIN32
+ pthread_t th1;
+ #endif
+
+ char array1[64];
+ char array2[64];
+ strcpy(array1, Config->ChatIRCHost.c_str());
+ strcpy(array2, Config->ChatIRCNick.c_str());
+ conn.hook_irc_command("PRIVMSG",&triggers);
+ conn.hook_irc_command("376", &end_of_motd); /* hook the end of MOTD message */
+ conn.start(array1,Config->ChatIRCPort,array2,"EQEMu IRC Bot","EQEMu IRC Bot",0);
+
+ #ifdef WIN32
+ _beginthread(IRCConnect,0,(void*)&conn);
+ #else
+ pthread_create(&th1,NULL,IRCConnect,(void*)&conn);
+ #endif
+
+ /* end irc crap */
+
+ if(!load_log_settings(Config->LogSettingsFile.c_str()))
+ _log(CHANNELS__INIT, "Warning: Unable to read %s", Config->LogSettingsFile.c_str());
+ else
+ _log(CHANNELS__INIT, "Log settings loaded from %s", Config->LogSettingsFile.c_str());
+
+ WorldShortName = Config->ShortName;
+
+ _log(CHANNELS__INIT, "Connecting to MySQL...");
+
+ if (!database.Connect(
+ Config->DatabaseHost.c_str(),
+ Config->DatabaseUsername.c_str(),
+ Config->DatabasePassword.c_str(),
+ Config->DatabaseDB.c_str(),
+ Config->DatabasePort)) {
+ _log(WORLD__INIT_ERR, "Cannot continue without a database connection.");
+ return(1);
+ }
+
+ char tmp[64];
+
+ if (database.GetVariable("RuleSet", tmp, sizeof(tmp)-1)) {
+ _log(WORLD__INIT, "Loading rule set '%s'", tmp);
+ if(!rules->LoadRules(&database, tmp)) {
+ _log(CHANNELS__ERROR, "Failed to load ruleset '%s', falling back to defaults.", tmp);
+ }
+ } else {
+ if(!rules->LoadRules(&database, "default")) {
+ _log(CHANNELS__INIT, "No rule set configured, using default rules");
+ } else {
+ _log(CHANNELS__INIT, "Loaded default rule set 'default'", tmp);
+ }
+ }
+
+ CL = new Clientlist(Config->ChatPort);
+
+ ChannelList = new ChatChannelList();
+
+ database.LoadChatChannels();
+
+ if (signal(SIGINT, CatchSignal) == SIG_ERR) {
+ _log(CHANNELS__ERROR, "Could not set signal handler");
+ return 0;
+ }
+ if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
+ _log(CHANNELS__ERROR, "Could not set signal handler");
+ return 0;
+ }
+
+ while(RunLoops) {
+ Timer::SetCurrentTime();
+ CL->Process();
+ if(ChannelListProcessTimer.Check())
+ ChannelList->Process();
+ timeout_manager.CheckTimeouts();
+ Sleep(100);
+ }
+
+ ChannelList->RemoveAllChannels();
+
+ CL->CloseAllConnections();
+
+}
+
+void UpdateWindowTitle(char* iNewTitle) {
+#ifdef WIN32
+ char tmp[500];
+ if (iNewTitle) {
+ snprintf(tmp, sizeof(tmp), "World: %s", iNewTitle);
+ }
+ else {
+ snprintf(tmp, sizeof(tmp), "World");
+ }
+ SetConsoleTitle(tmp);
+#endif
+}
\ No newline at end of file
Index: chatserver.vcproj
================================================== =================
--- chatserver.vcproj (revision 846)
+++ chatserver.vcproj (working copy)
@@ -193,6 +193,10 @@
RelativePath=".\database.cpp"
>
</File>
+ <File
+ RelativePath=".\IRC.cpp"
+ >
+ </File>
</Filter>
<Filter
Name="Header Files"
@@ -215,6 +219,10 @@
RelativePath=".\database.h"
>
</File>
+ <File
+ RelativePath=".\IRC.h"
+ >
+ </File>
</Filter>
<Filter
Name="Common Header Files"
Index: clientlist.cpp
================================================== =================
--- clientlist.cpp (revision 846)
+++ clientlist.cpp (working copy)
@@ -25,6 +25,7 @@
#include "clientlist.h"
#include "database.h"
#include "chatchannel.h"
+#include "ChatConfig.h" // Secrets -- IRC
#include "../common/EQStreamFactory.h"
#include "../common/EmuTCPConnection.h"
@@ -436,6 +437,7 @@
}
+
void Clientlist::CloseAllConnections() {
@@ -1003,6 +1005,31 @@
safe_delete(outapp);
}
+void Client::SendChannelMessageFromIRC(string Message, string IRCName) { /* Packet handler for IRC Messages */
+
+ const ChatConfig *Config=ChatConfig::get();
+
+ string FQSenderName = "IRC." + IRCName;
+
+ string ChannelName = Config->EQChannelToOutput.c_str();
+
+ int PacketLength = ChannelName.length() + Message.length() + FQSenderName.length() + 3;
+
+ EQApplicationPacket *outapp = new EQApplicationPacket(OP_ChannelMessage, PacketLength);
+
+ char *PacketBuffer = (char *)outapp->pBuffer;
+
+ VARSTRUCT_ENCODE_STRING(PacketBuffer, ChannelName.c_str());
+ VARSTRUCT_ENCODE_STRING(PacketBuffer, FQSenderName.c_str());
+ VARSTRUCT_ENCODE_STRING(PacketBuffer, Message.c_str());
+
+ _pkt(CHANNELS__PACKETS, outapp);
+ QueuePacket(outapp);
+
+ safe_delete(outapp);
+}
+
+
void Client::ToggleAnnounce() {
string Message = "Announcing now ";
Index: clientlist.h
================================================== =================
--- clientlist.h (revision 846)
+++ clientlist.h (working copy)
@@ -1,156 +1,157 @@
-/*
- EQEMu: Everquest Server Emulator
-
- Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net)
-
- 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; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY except by those people which sell it, which
- are required to give you total support for your newly bought product;
- 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, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-*/
-
-#ifndef CHATSERVER_CLIENTLIST_H
-#define CHATSERVER_CLIENTLIST_H
-
-#include "../common/opcodemgr.h"
-#include "../common/EQStreamType.h"
-#include "../common/EQStreamFactory.h"
-#include "../common/rulesys.h"
-#include "chatchannel.h"
-#include <list>
-#include <vector>
-
-#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, CommandEndOfList };
-
-struct CommandEntry {
- const char *CommandString;
- int CommandCode;
-};
-
-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 },
- { "", CommandEndOfList } };
-
-class Client {
-
-public:
- Client(EQStream* eqs);
- ~Client();
-
- EQStream *ClientStream;
- void AddCharacter(const char *CharacterName);
- void ClearCharacters() { Characters.clear(); }
- void SendMailBoxes();
- inline void QueuePacket(const EQApplicationPacket *p, bool ack_req=true) { ClientStream->QueuePacket(p, ack_req); }
- string GetName() { if(Characters.size()) return Characters[0]; else return ""; }
- void JoinChannels(string ChannelList);
- void LeaveChannels(string ChannelList);
- void LeaveAllChannels(bool SendUpdatedChannelList = true);
- void AddToChannelList(ChatChannel *JoinedChannel);
- void RemoveFromChannelList(ChatChannel *JoinedChannel);
- void SendChannelMessage(string Message);
- void SendChannelMessage(string ChannelName, string Message, Client *Sender);
- void SendChannelMessageByNumber(string Message);
- void SendChannelList();
- void CloseConnection();
- void ToggleAnnounce();
- bool IsAnnounceOn() { return (Announce == true); }
- void AnnounceJoin(ChatChannel *Channel, Client *c);
- void AnnounceLeave(ChatChannel *Channel, Client *c);
- void GeneralChannelMessage(string Message);
- void GeneralChannelMessage(const char *Characters);
- void SetChannelPassword(string ChannelPassword);
- void ProcessChannelList(string CommandString);
- void ProcessKarma();
- int ChannelCount();
- 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(string CommandString);
- void OPList(string CommandString);
- void ChannelInvite(string CommandString);
- void ChannelGrantModerator(string CommandString);
- void ChannelGrantVoice(string CommandString);
- void ChannelKick(string CommandString);
- void ChannelModerate(string CommandString);
- string ChannelSlotName(int ChannelNumber);
- void ToggleInvites();
- bool InvitesAllowed() { return AllowInvites; }
- inline bool IsChannelAdmin() { return (Status >= RuleI(Channels, RequiredStatusAdmin)); }
- inline bool CanListAllChannels() { return (Status >= RuleI(Channels, RequiredStatusListAll)); }
- void SendHelp();
- inline bool GetForceDisconnect() { return ForceDisconnect; }
-
-private:
- int CurrentMailBox;
- vector<string> Characters;
- ChatChannel *JoinedChannels[MAX_JOINED_CHANNELS];
- bool Announce;
- int AccountID;
- int Status;
- bool HideMe;
- bool AllowInvites;
-
+/*
+ EQEMu: Everquest Server Emulator
+
+ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net)
+
+ 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; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY except by those people which sell it, which
+ are required to give you total support for your newly bought product;
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+
+#ifndef CHATSERVER_CLIENTLIST_H
+#define CHATSERVER_CLIENTLIST_H
+
+#include "../common/opcodemgr.h"
+#include "../common/EQStreamType.h"
+#include "../common/EQStreamFactory.h"
+#include "../common/rulesys.h"
+#include "chatchannel.h"
+#include <list>
+#include <vector>
+
+#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, CommandEndOfList };
+
+struct CommandEntry {
+ const char *CommandString;
+ int CommandCode;
+};
+
+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 },
+ { "", CommandEndOfList } };
+
+class Client {
+
+public:
+ Client(EQStream* eqs);
+ ~Client();
+
+ EQStream *ClientStream;
+ void AddCharacter(const char *CharacterName);
+ void ClearCharacters() { Characters.clear(); }
+ void SendMailBoxes();
+ inline void QueuePacket(const EQApplicationPacket *p, bool ack_req=true) { ClientStream->QueuePacket(p, ack_req); }
+ string GetName() { if(Characters.size()) return Characters[0]; else return ""; }
+ void JoinChannels(string ChannelList);
+ void LeaveChannels(string ChannelList);
+ void LeaveAllChannels(bool SendUpdatedChannelList = true);
+ void AddToChannelList(ChatChannel *JoinedChannel);
+ void RemoveFromChannelList(ChatChannel *JoinedChannel);
+ void SendChannelMessage(string Message);
+ void SendChannelMessage(string ChannelName, string Message, Client *Sender);
+ void SendChannelMessageFromIRC(string Message, string IRCName);
+ void SendChannelMessageByNumber(string Message);
+ void SendChannelList();
+ void CloseConnection();
+ void ToggleAnnounce();
+ bool IsAnnounceOn() { return (Announce == true); }
+ void AnnounceJoin(ChatChannel *Channel, Client *c);
+ void AnnounceLeave(ChatChannel *Channel, Client *c);
+ void GeneralChannelMessage(string Message);
+ void GeneralChannelMessage(const char *Characters);
+ void SetChannelPassword(string ChannelPassword);
+ void ProcessChannelList(string CommandString);
+ void ProcessKarma();
+ int ChannelCount();
+ 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(string CommandString);
+ void OPList(string CommandString);
+ void ChannelInvite(string CommandString);
+ void ChannelGrantModerator(string CommandString);
+ void ChannelGrantVoice(string CommandString);
+ void ChannelKick(string CommandString);
+ void ChannelModerate(string CommandString);
+ string ChannelSlotName(int ChannelNumber);
+ void ToggleInvites();
+ bool InvitesAllowed() { return AllowInvites; }
+ inline bool IsChannelAdmin() { return (Status >= RuleI(Channels, RequiredStatusAdmin)); }
+ inline bool CanListAllChannels() { return (Status >= RuleI(Channels, RequiredStatusListAll)); }
+ void SendHelp();
+ inline bool GetForceDisconnect() { return ForceDisconnect; }
+
+private:
+ int CurrentMailBox;
+ vector<string> Characters;
+ ChatChannel *JoinedChannels[MAX_JOINED_CHANNELS];
+ bool Announce;
+ int AccountID;
+ int Status;
+ bool HideMe;
+ bool AllowInvites;
+
//Anti Spam Stuff
Timer *KarmaGrabUpdateTimer;
uint32 TotalKarma;
Timer *GlobalChatLimiterTimer; //60 seconds
- int AttemptedMessages;
- bool ForceDisconnect;
-};
-
-class Clientlist {
-
-public:
- Clientlist(int MailPort);
- void Process();
- void CloseAllConnections();
- Client *FindCharacter(string CharacterName);
- void CheckForStaleConnections(Client *c);
-
-private:
- EQStreamFactory *chatsf;
-
- list<Client*> ClientChatConnections;
-
- OpcodeManager *ChatOpMgr;
-};
-
-#endif
+ int AttemptedMessages;
+ bool ForceDisconnect;
+};
+
+class Clientlist {
+
+public:
+ Clientlist(int MailPort);
+ void Process();
+ void CloseAllConnections();
+ Client *FindCharacter(string CharacterName);
+ void CheckForStaleConnections(Client *c);
+
+private:
+ EQStreamFactory *chatsf;
+
+ list<Client*> ClientChatConnections;
+
+ OpcodeManager *ChatOpMgr;
+};
+
+#endif
Diff for those who are interested
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.