00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "net/tmwserv/guildhandler.h"
00023
00024 #include "net/messagein.h"
00025
00026 #include "net/tmwserv/chatserver/chatserver.h"
00027 #include "net/tmwserv/chatserver/guild.h"
00028 #include "net/tmwserv/protocol.h"
00029
00030 #include "gui/widgets/channeltab.h"
00031 #include "gui/chat.h"
00032 #include "gui/guildwindow.h"
00033
00034 #include "guild.h"
00035 #include "log.h"
00036 #include "localplayer.h"
00037 #include "channel.h"
00038 #include "channelmanager.h"
00039
00040 #include <iostream>
00041
00042 namespace TmwServ {
00043
00044 GuildHandler::GuildHandler()
00045 {
00046 static const Uint16 _messages[] = {
00047 CPMSG_GUILD_CREATE_RESPONSE,
00048 CPMSG_GUILD_INVITE_RESPONSE,
00049 CPMSG_GUILD_ACCEPT_RESPONSE,
00050 CPMSG_GUILD_GET_MEMBERS_RESPONSE,
00051 CPMSG_GUILD_UPDATE_LIST,
00052 CPMSG_GUILD_INVITED,
00053 CPMSG_GUILD_REJOIN,
00054 CPMSG_GUILD_QUIT_RESPONSE,
00055 0
00056 };
00057 handledMessages = _messages;
00058
00059 }
00060
00061 void GuildHandler::handleMessage(MessageIn &msg)
00062 {
00063 switch (msg.getId())
00064 {
00065 case CPMSG_GUILD_CREATE_RESPONSE:
00066 {
00067 logger->log("Received CPMSG_GUILD_CREATE_RESPONSE");
00068 if(msg.readInt8() == ERRMSG_OK)
00069 {
00070
00071 localChatTab->chatLog("Guild created.");
00072 joinedGuild(msg);
00073 }
00074 else
00075 {
00076 localChatTab->chatLog("Error creating guild.");
00077 }
00078 } break;
00079
00080 case CPMSG_GUILD_INVITE_RESPONSE:
00081 {
00082 logger->log("Received CPMSG_GUILD_INVITE_RESPONSE");
00083 if(msg.readInt8() == ERRMSG_OK)
00084 {
00085
00086 localChatTab->chatLog("Invite sent.");
00087 }
00088 } break;
00089
00090 case CPMSG_GUILD_ACCEPT_RESPONSE:
00091 {
00092 logger->log("Received CPMSG_GUILD_ACCEPT_RESPONSE");
00093 if(msg.readInt8() == ERRMSG_OK)
00094 {
00095
00096 joinedGuild(msg);
00097 }
00098 } break;
00099
00100 case CPMSG_GUILD_GET_MEMBERS_RESPONSE:
00101 {
00102 logger->log("Received CPMSG_GUILD_GET_MEMBERS_RESPONSE");
00103 if(msg.readInt8() == ERRMSG_OK)
00104 {
00105 std::string guildMember;
00106 bool online;
00107 std::string guildName;
00108 Guild *guild;
00109
00110 short guildId = msg.readInt16();
00111 guild = player_node->getGuild(guildId);
00112
00113 if (!guild)
00114 return;
00115
00116 guildName = guild->getName();
00117
00118 while(msg.getUnreadLength())
00119 {
00120 guildMember = msg.readString();
00121 online = msg.readInt8();
00122 if(guildMember != "")
00123 {
00124 guild->addMember(guildMember);
00125 guildWindow->setOnline(guildName, guildMember, online);
00126 }
00127 }
00128
00129 guildWindow->updateTab();
00130 }
00131 } break;
00132
00133 case CPMSG_GUILD_UPDATE_LIST:
00134 {
00135 logger->log("Received CPMSG_GUILD_UPDATE_LIST");
00136 short guildId = msg.readInt16();
00137 std::string guildMember = msg.readString();
00138 char eventId = msg.readInt8();
00139
00140 Guild *guild = player_node->getGuild(guildId);
00141 if (guild)
00142 {
00143 switch(eventId)
00144 {
00145 case GUILD_EVENT_NEW_PLAYER:
00146 guild->addMember(guildMember);
00147 guildWindow->setOnline(guild->getName(), guildMember, true);
00148 break;
00149
00150 case GUILD_EVENT_LEAVING_PLAYER:
00151 guild->removeMember(guildMember);
00152 break;
00153
00154 case GUILD_EVENT_ONLINE_PLAYER:
00155 guildWindow->setOnline(guild->getName(), guildMember, true);
00156 break;
00157
00158 case GUILD_EVENT_OFFLINE_PLAYER:
00159 guildWindow->setOnline(guild->getName(), guildMember, false);
00160 break;
00161
00162 default:
00163 logger->log("Invalid guild event");
00164 }
00165 }
00166 guildWindow->updateTab();
00167
00168
00169 } break;
00170
00171 case CPMSG_GUILD_INVITED:
00172 {
00173 logger->log("Received CPMSG_GUILD_INVITED");
00174 std::string inviterName = msg.readString();
00175 std::string guildName = msg.readString();
00176
00177
00178 guildWindow->openAcceptDialog(inviterName, guildName);
00179 } break;
00180
00181 case CPMSG_GUILD_PROMOTE_MEMBER_RESPONSE:
00182 {
00183 logger->log("Received CPMSG_GUILD_PROMOTE_MEMBER_RESPONSE");
00184
00185 if (msg.readInt8() == ERRMSG_OK)
00186 {
00187
00188 localChatTab->chatLog("Member was promoted successfully");
00189 }
00190 else
00191 {
00192
00193 localChatTab->chatLog("Failed to promote member");
00194 }
00195 }
00196
00197 case CPMSG_GUILD_REJOIN:
00198 {
00199 logger->log("Received CPMSG_GUILD_REJOIN");
00200
00201 joinedGuild(msg);
00202 } break;
00203
00204 case CPMSG_GUILD_QUIT_RESPONSE:
00205 {
00206 logger->log("Received CPMSG_GUILD_QUIT_RESPONSE");
00207
00208 if (msg.readInt8() == ERRMSG_OK)
00209 {
00210
00211
00212 int guildId = msg.readInt16();
00213 Guild *guild = player_node->getGuild(guildId);
00214 if (guild)
00215 {
00216 Channel *channel = channelManager->findByName(guild->getName());
00217 channelManager->removeChannel(channel);
00218 guildWindow->removeTab(guildId);
00219 player_node->removeGuild(guildId);
00220 }
00221 }
00222 } break;
00223 }
00224 }
00225
00226 void GuildHandler::joinedGuild(MessageIn &msg)
00227 {
00228 std::string guildName = msg.readString();
00229 short guildId = msg.readInt16();
00230 short permissions = msg.readInt16();
00231 short channelId = msg.readInt16();
00232 std::string announcement = msg.readString();
00233
00234
00235 Guild *guild = player_node->addGuild(guildId, permissions);
00236 guild->setName(guildName);
00237 guildWindow->newGuildTab(guildName);
00238 guildWindow->requestMemberList(guildId);
00239
00240
00241
00242 Channel *channel = new Channel(channelId, guildName, announcement);
00243 channelManager->addChannel(channel);
00244 channel->getTab()->chatLog("Topic: " + announcement, BY_CHANNEL);
00245 }
00246
00247 }