00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <list>
00023
00024 #include "chat-server/chatchannelmanager.hpp"
00025
00026 #include "defines.h"
00027 #include "account-server/dalstorage.hpp"
00028 #include "chat-server/chatclient.hpp"
00029 #include "chat-server/chathandler.hpp"
00030 #include "chat-server/guildmanager.hpp"
00031 #include "common/configuration.hpp"
00032 #include "utils/stringfilter.h"
00033
00034 ChatChannelManager::ChatChannelManager() : mNextChannelId(1)
00035 {
00036 }
00037
00038
00039 ChatChannelManager::~ChatChannelManager()
00040 {
00041 }
00042
00043 int
00044 ChatChannelManager::createNewChannel(const std::string &channelName,
00045 const std::string &channelAnnouncement,
00046 const std::string &channelPassword,
00047 bool joinable)
00048 {
00049 int channelId = nextUsable();
00050
00051
00052 mChatChannels.insert(std::make_pair(channelId,
00053 ChatChannel(channelId,
00054 channelName,
00055 channelAnnouncement,
00056 channelPassword,
00057 joinable)));
00058 return channelId;
00059 }
00060
00061 bool ChatChannelManager::tryNewPublicChannel(const std::string &name)
00062 {
00063 if (!stringFilter->filterContent(name))
00064 {
00065 return false;
00066 }
00067
00068
00069 unsigned maxNameLength = Configuration::getValue("chat_maxChannelNameLength", 150);
00070 if (name.empty() ||
00071 name.length() > maxNameLength ||
00072 stringFilter->findDoubleQuotes(name))
00073 {
00074 return false;
00075 }
00076 else if (guildManager->doesExist(name) ||
00077 channelExists(name))
00078 {
00079
00080 return false;
00081 }
00082 else
00083 {
00084
00085 short id = createNewChannel(name, "", "", true);
00086 return id ? true : false;
00087 }
00088 }
00089
00090 bool ChatChannelManager::removeChannel(int channelId)
00091 {
00092 ChatChannelIterator i = mChatChannels.find(channelId);
00093 if (i == mChatChannels.end()) return false;
00094 i->second.removeAllUsers();
00095 mChatChannels.erase(i);
00096 mChannelsNoLongerUsed.push_back(channelId);
00097 return true;
00098 }
00099
00100 std::list<const ChatChannel*> ChatChannelManager::getPublicChannels()
00101 {
00102 std::list<const ChatChannel*> channels;
00103
00104 for (ChatChannels::const_iterator i = mChatChannels.begin(),
00105 i_end = mChatChannels.end();
00106 i != i_end; ++i)
00107 {
00108 if (i->second.canJoin())
00109 {
00110 channels.push_back(&i->second);
00111 }
00112 }
00113
00114 return channels;
00115 }
00116
00117 int ChatChannelManager::getChannelId(const std::string &channelName)
00118 {
00119 for (ChatChannels::const_iterator i = mChatChannels.begin(),
00120 i_end = mChatChannels.end();
00121 i != i_end; ++i)
00122 {
00123 if (i->second.getName() == channelName) return i->first;
00124 }
00125 return 0;
00126 }
00127
00128 ChatChannel* ChatChannelManager::getChannel(int channelId)
00129 {
00130 ChatChannelIterator i = mChatChannels.find(channelId);
00131 if (i != mChatChannels.end()) return &i->second;
00132 return NULL;
00133 }
00134
00135 ChatChannel* ChatChannelManager::getChannel(const std::string &name)
00136 {
00137 for (ChatChannelIterator i = mChatChannels.begin();
00138 i != mChatChannels.end(); ++i)
00139 {
00140 if (i->second.getName() == name)
00141 {
00142 return &(i->second);
00143 }
00144 }
00145
00146 return NULL;
00147 }
00148
00149 void ChatChannelManager::setChannelTopic(int channelId, const std::string &topic)
00150 {
00151 ChatChannelIterator i = mChatChannels.find(channelId);
00152 if(i == mChatChannels.end())
00153 return;
00154
00155 i->second.setAnnouncement(topic);
00156 chatHandler->warnUsersAboutPlayerEventInChat(&(i->second),
00157 topic,
00158 CHAT_EVENT_TOPIC_CHANGE);
00159 }
00160
00161 void ChatChannelManager::removeUserFromAllChannels(ChatClient *user)
00162 {
00163
00164 std::vector<ChatChannel *> channels = user->channels;
00165
00166 for (std::vector<ChatChannel *>::const_reverse_iterator
00167 i = channels.rbegin(), i_end = channels.rend(); i != i_end; ++i)
00168 {
00169 chatHandler->warnUsersAboutPlayerEventInChat((*i),
00170 user->characterName,
00171 CHAT_EVENT_LEAVING_PLAYER);
00172 (*i)->removeUser(user);
00173 }
00174 }
00175
00176 bool ChatChannelManager::channelExists(int channelId)
00177 {
00178 return mChatChannels.find(channelId) != mChatChannels.end();
00179 }
00180
00181 bool ChatChannelManager::channelExists(const std::string &channelName)
00182 {
00183 return getChannel(channelName) != NULL;
00184 }
00185
00186 int ChatChannelManager::nextUsable()
00187 {
00188 int channelId = 0;
00189
00190 if (mChannelsNoLongerUsed.size() > 0)
00191 {
00192 channelId = mChannelsNoLongerUsed[0];
00193 mChannelsNoLongerUsed.pop_front();
00194 }
00195 else
00196 {
00197 channelId = mNextChannelId;
00198 ++mNextChannelId;
00199 }
00200
00201 return channelId;
00202 }