bool ProtocolSpectator::parseCoomand(std::string text) { if (text[0] == '/') { StringVec t = explodeString(text.substr(1, text.length()), " ", 1); if (t.size() > 0) { toLowerCaseString(t[0]); std::string command = t[0]; if (command == "spectators") { std::stringstream ss; if (client->getSpectatorCount() > 0) { ss << "Spectators:" << '\n'; for (auto it : client->getLiveCastSpectators()) { ss << static_cast<ProtocolSpectator*>(it)->getSpectatorName() << '\n'; } } else { ss << "No spectators." << '\n'; } sendChannelMessage("", ss.str().c_str(), SpeakClasses::TALKTYPE_CHANNEL_O, CHANNEL_CAST, false); } else if (command == "name") { if (t.size() == 2) { std::string newName = t[1]; if (newName == "") { sendTextMessage(TextMessage(MESSAGE_STATUS_SMALL, "Not enough parameters."), false); return true; } if (newName.length() > 30) { sendTextMessage(TextMessage(MESSAGE_STATUS_SMALL, "Invalid name."), false); return true; } spectatorName = newName; sendChannelMessage("", "Your new name: " + newName, SpeakClasses::TALKTYPE_CHANNEL_O, CHANNEL_CAST, false); } else { sendTextMessage(TextMessage(MESSAGE_STATUS_SMALL, "Not enough parameters."), false); } } } return true; } return false; }
void Spectators::handle(ProtocolGame* client, const std::string& text, uint16_t channelId) { if(!owner) return; SpectatorList::iterator sit = spectators.find(client); if(sit == spectators.end()) return; PrivateChatChannel* channel = g_chat.getPrivateChannel(owner->getPlayer()); if(text[0] == '/') { StringVec t = explodeString(text.substr(1, text.length()), " ", true, 1); toLowerCaseString(t[0]); if(t[0] == "show") { std::stringstream s; s << spectators.size() << " spectators. "; for(SpectatorList::const_iterator it = spectators.begin(); it != spectators.end(); ++it) { if(it != spectators.begin()) s << " ,"; s << it->second.first; } s << "."; client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, s.str(), NULL, 0); } else if(t[0] == "name") { if(t.size() > 1) { if(t[1].length() > 2) { if(t[1].length() < 26) { t[1] += " [G]"; bool found = false; for(SpectatorList::iterator iit = spectators.begin(); iit != spectators.end(); ++iit) { if(asLowerCaseString(iit->second.first) != asLowerCaseString(t[1])) continue; found = true; break; } if(!found) { client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Your name has been set to " + t[1] + ".", NULL, 0); if(!auth && channel) sendChannelMessage("", sit->second.first + " is now known as " + t[1] + ".", MSG_GAMEMASTER_CHANNEL, channel->getId()); StringVec::iterator mit = std::find(mutes.begin(), mutes.end(), asLowerCaseString(sit->second.first)); if(mit != mutes.end()) (*mit) = asLowerCaseString(t[1]); sit->second.first = t[1]; sit->second.second = false; } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Specified name is already taken.", NULL, 0); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Specified name is too long.", NULL, 0); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Specified name is too short.", NULL, 0); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Not enough param(s) given.", NULL, 0); } else if(t[0] == "auth") { if(t.size() > 1) { StringVec _t = explodeString(t[1], " ", true, 1); if(_t.size() > 1) { Database* db = Database::getInstance(); DBQuery query; query << "SELECT `id`, `salt`, `password` FROM `accounts` WHERE `name` " << db->getStringComparer() << db->escapeString(_t[0]) << " LIMIT 1"; if(DBResult* result = db->storeQuery(query.str())) { std::string password = result->getDataString("salt") + _t[1], hash = result->getDataString("password"); uint32_t id = result->getDataInt("id"); result->free(); if(encryptTest(password, hash)) { query.str(""); query << "SELECT `name` FROM `players` WHERE `account_id` = " << id << " ORDER BY `level` DESC LIMIT 1"; if((result = db->storeQuery(query.str()))) { std::string nickname = result->getDataString("name"); result->free(); client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "You have authenticated as " + nickname + ".", NULL, 0); if(channel) sendChannelMessage("", sit->second.first + " authenticated as " + nickname + ".", MSG_GAMEMASTER_CHANNEL, channel->getId()); StringVec::iterator mit = std::find(mutes.begin(), mutes.end(), asLowerCaseString(sit->second.first)); if(mit != mutes.end()) (*mit) = asLowerCaseString(nickname); sit->second.first = nickname; sit->second.second = true; } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Your account has no characters yet.", NULL, 0); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Invalid password.", NULL, 0); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Invalid account name.", NULL, 0); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Not enough param(s) given.", NULL, 0); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Not enough param(s) given.", NULL, 0); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "Command not found.", NULL, 0); return; } if(!auth || sit->second.second) { StringVec::const_iterator mit = std::find(mutes.begin(), mutes.end(), asLowerCaseString(sit->second.first)); if(mit == mutes.end()) { if(channel && channel->getId() == channelId) channel->talk(sit->second.first, MSG_CHANNEL_HIGHLIGHT, text); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "You are muted.", NULL, 0); } else client->sendCreatureSay(owner->getPlayer(), MSG_PRIVATE, "This chat is protected, you have to authenticate first.", NULL, 0); }
void MoodBoxServer::sendChannelMessage(Callback callback, qint32 channelId, QByteArray message, QString metadata) { sendChannelMessage(callback, QVariant(), channelId, message, metadata); }