bool IRCClient::part ( std::string channel, std::string reason ) { // we need to have at LEAST sent the username and stuff if (getConnectionState() < eSentNickAndUSer) return false; IRCCommandInfo info; info.target = channel; if ( reason.size()) info.params.push_back(reason); if (!sendIRCCommand(eCMD_PART,info)) { log("part Failed: PART command not sent",0); return false; } // notify that we parted the channel std::string nick = getNick(); userManager.userPartChannel(nick, channel); trClientPartEventInfo eventInfo; eventInfo.eventType = eIRCChannelPartEvent; eventInfo.reason = reason; eventInfo.user = getNick(); callEventHandler(eventInfo.eventType,eventInfo); // todo, we really should go and remove the channel from our listing and kill any dead users return true; }
void Identity::getParams(StringMap& sm, const string& prefix, bool compatibility) const { { Lock l(cs); for(InfMap::const_iterator i = info.begin(); i != info.end(); ++i) { sm[prefix + string((char*)(&i->first), 2)] = i->second; } } if(user) { sm[prefix + "SID"] = getSIDString(); sm[prefix + "CID"] = user->getCID().toBase32(); sm[prefix + "TAG"] = getTag(); sm[prefix + "SSshort"] = Util::formatBytes(get("SS")); if(compatibility) { if(prefix == "my") { sm["mynick"] = getNick(); sm["mycid"] = user->getCID().toBase32(); } else { sm["nick"] = getNick(); sm["cid"] = user->getCID().toBase32(); sm["ip"] = get("I4"); sm["tag"] = getTag(); sm["description"] = get("DE"); sm["email"] = get("EM"); sm["share"] = get("SS"); sm["shareshort"] = Util::formatBytes(get("SS")); } } } }
void Identity::getParams(ParamMap& sm, const string& prefix, bool compatibility) const noexcept { { RLock l(cs); for(auto& i: info) { sm[prefix + string((char*)(&i.first), 2)] = i.second; } } if(user) { sm[prefix + "NI"] = getNick(); sm[prefix + "SID"] = getSIDString(); sm[prefix + "CID"] = user->getCID().toBase32(); sm[prefix + "TAG"] = getTag(); sm[prefix + "CO"] = getNmdcConnection(); sm[prefix + "DS"] = getDownloadSpeed(); sm[prefix + "SSshort"] = Util::formatBytes(get("SS")); if(compatibility) { if(prefix == "my") { sm["mynick"] = getNick(); sm["mycid"] = user->getCID().toBase32(); } else { sm["nick"] = getNick(); sm["cid"] = user->getCID().toBase32(); sm["ip"] = get("I4"); sm["tag"] = getTag(); sm["description"] = get("DE"); sm["email"] = get("EM"); sm["share"] = get("SS"); sm["shareshort"] = Util::formatBytes(get("SS")); sm["realshareformat"] = Util::formatBytes(get("RS")); } } } }
static void changeRelation(const InputEvent &event, const RelationT relation, const std::string &relationText) { std::string args = getNick(event); if (args.empty()) return; if (player_relations.getRelation(args) == relation) { if (event.tab) { // TRANSLATORS: change relation event.tab->chatLog(strprintf(_("Player already %s!"), relationText.c_str()), ChatMsgType::BY_SERVER); return; } } else { player_relations.setRelation(args, relation); } reportRelation(event, relation, // TRANSLATORS: change relation strprintf(_("Player successfully %s!"), relationText.c_str()), // TRANSLATORS: change relation strprintf(_("Player could not be %s!"), relationText.c_str())); }
void MessageManager::saveUsers() { SimpleXML xml; xml.addTag("Ignored"); xml.stepIn(); xml.addTag("Users"); xml.stepIn(); //TODO: cache this information? { RLock l(Ignorecs); for (const auto& u : ignoredUsers) { xml.addTag("User"); xml.addChildAttrib("CID", u->getCID().toBase32()); auto ou = ClientManager::getInstance()->findOnlineUser(u->getCID(), ""); if (ou) { xml.addChildAttrib("Nick", ou->getIdentity().getNick()); xml.addChildAttrib("Hub", ou->getHubUrl()); xml.addChildAttrib("LastSeen", GET_TIME()); } else { auto ofu = ClientManager::getInstance()->getOfflineUser(u->getCID()); xml.addChildAttrib("Nick", ofu ? ofu->getNick() : ""); xml.addChildAttrib("Hub", ofu ? ofu->getUrl() : ""); xml.addChildAttrib("LastSeen", ofu ? ofu->getLastSeen() : GET_TIME()); } } } xml.stepOut(); xml.stepOut(); SettingsManager::saveSettingFile(xml, CONFIG_DIR, CONFIG_NAME); }
void NmdcHub::connect(const User* aUser) { checkstate(); dcdebug("NmdcHub::connectToMe %s\n", aUser->getNick().c_str()); if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) { send("$ConnectToMe " + toNmdc(aUser->getNick()) + " " + getLocalIp() + ":" + Util::toString(SETTING(IN_PORT)) + "|"); } else { send("$RevConnectToMe " + toNmdc(getNick()) + " " + toNmdc(aUser->getNick()) + "|"); } }
void NmdcHub::search(int aSizeType, int64_t aSize, int aFileType, const string& aString){ checkstate(); char* buf; char c1 = (aSizeType == SearchManager::SIZE_DONTCARE) ? 'F' : 'T'; char c2 = (aSizeType == SearchManager::SIZE_ATLEAST) ? 'F' : 'T'; string tmp = toNmdc(aString); string::size_type i; while((i = tmp.find(' ')) != string::npos) { tmp[i] = '$'; } int chars = 0; if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) { string x = getLocalIp(); buf = new char[x.length() + aString.length() + 64]; chars = sprintf(buf, "$Search %s:%d %c?%c?%s?%d?%s|", x.c_str(), SETTING(IN_PORT), c1, c2, Util::toString(aSize).c_str(), aFileType+1, tmp.c_str()); } else { buf = new char[getNick().length() + aString.length() + 64]; chars = sprintf(buf, "$Search Hub:%s %c?%c?%s?%d?%s|", getNick().c_str(), c1, c2, Util::toString(aSize).c_str(), aFileType+1, tmp.c_str()); } send(buf, chars); delete[] buf; }
void NmdcHub::myInfo() { checkstate(); dcdebug("MyInfo %s...\n", getNick().c_str()); lastCounts = counts; string tmp1 = ";**\x1fU9"; string tmp2 = "+L9"; string tmp3 = "+G9"; string tmp4 = "+R9"; string tmp5 = "+N9"; string::size_type i; for(i = 0; i < 6; i++) { tmp1[i]++; } for(i = 0; i < 3; i++) { tmp2[i]++; tmp3[i]++; tmp4[i]++; tmp5[i]++; } char modeChar = '?'; if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) modeChar = 'A'; else if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_PASSIVE) modeChar = 'P'; else if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_SOCKS5) modeChar = '5'; string uMin = (SETTING(MIN_UPLOAD_SPEED) == 0) ? Util::emptyString : tmp5 + Util::toString(SETTING(MIN_UPLOAD_SPEED)); string minf = "$MyINFO $ALL " + toNmdc(checkNick(getNick())) + " " + toNmdc(Util::validateMessage(getDescription(), false)) + tmp1 + VERSIONSTRING + tmp2 + modeChar + tmp3 + getCounts() + tmp4 + Util::toString(SETTING(SLOTS)) + uMin + ">$ $" + SETTING(CONNECTION) + "\x01$" + toNmdc(Util::validateMessage(SETTING(EMAIL), false)) + '$' + ShareManager::getInstance()->getShareSizeString() + "$|"; if(minf != lastMyInfo) { send(minf); lastMyInfo = minf; } }
void AdcHub::info() { if(state != STATE_IDENTIFY && state != STATE_NORMAL) return; if(!getMe()) return; string minf = "BINF " + getMe()->getCID().toBase32(); unsigned size = minf.size(); string tmp; StringMapIter i; #define ADDPARAM(var, content) \ tmp = content; \ if((i = lastInfoMap.find(var)) != lastInfoMap.end()) { \ if(i->second != tmp) { \ if(tmp.empty()) \ lastInfoMap.erase(i); \ else \ i->second = tmp; \ minf += var + tmp; \ } \ } else if(!tmp.empty()) { \ minf += var + tmp; \ lastInfoMap[var] = tmp; \ } ADDPARAM(" NI", Command::escape(getNick())); ADDPARAM(" DE", Command::escape(getDescription())); ADDPARAM(" SL", Util::toString(SETTING(SLOTS))); ADDPARAM(" SS", ShareManager::getInstance()->getShareSizeString()); ADDPARAM(" HN", Util::toString((int64_t)counts.normal)); ADDPARAM(" HR", Util::toString((int64_t)counts.registered)); ADDPARAM(" HO", Util::toString((int64_t)counts.op)); ADDPARAM(" VE", "++\\ " VERSIONSTRING); if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) { ADDPARAM(" I4", "0.0.0.0"); ADDPARAM(" U4", Util::toString(SETTING(IN_PORT))); } else { ADDPARAM(" I4", ""); ADDPARAM(" U4", ""); } #undef ADDPARAM if(minf.size() != size) { minf += "\n"; send(minf); } }
string GraphDog::getToken(){ string udid=getUdid(); string auid=getAuID(); string email=getEmail(); string nick=getNick(); string flag=getFlag(); string lang=getLanguage(); string platform=getPlatform(); string cTime=getCTime(); string dInfo=getDeviceInfo(); string token=GraphDogLib::GDCreateToken(auid,udid,flag,lang,nick,email,platform,cTime,sKey,dInfo); // CCLog("%s", token.c_str()); // CCLog("%s", unBase64NextUnDes("GDSK3388", token).c_str()); return token; }
void NmdcHub::kick(const User::Ptr& aUser, const string& aMsg) { checkstate(); dcdebug("NmdcHub::kick\n"); static const char str[] = "$To: %s From: %s $<%s> You are being kicked because: %s|<%s> %s is kicking %s because: %s|"; string msg2 = toNmdc(Util::validateMessage(aMsg, false)); char* tmp = new char[sizeof(str) + 2*aUser->getNick().length() + 2*msg2.length() + 4*getNick().length()]; const char* u = aUser->getNick().c_str(); const char* n = getNick().c_str(); const char* m = msg2.c_str(); sprintf(tmp, str, u, n, n, m, n, n, u, m); send(tmp); delete[] tmp; // Short, short break to allow the message to reach the NmdcHub... Thread::sleep(200); send("$Kick " + toNmdc(aUser->getNick()) + "|"); }
bool IRCSession::initLoginRequest() { std::string nick = getNick(); std::string user = getUser(); if(user.empty()) user = nick; std::string clientName = getClientName(); OS_ASSERT(nick.empty() == false); OS_ASSERT(user.empty() == false); OS_ASSERT(clientName.empty() == false); std::string command; command.append("PASS NOPASS"); command.append(OS_IRC_COMMANDS_TERMINATOR); command.append("NICK " + nick); command.append(OS_IRC_COMMANDS_TERMINATOR); command.append("USER " + user + " USING " + clientName + " :" + nick); command.append(OS_IRC_COMMANDS_TERMINATOR); return addRequest(shared_ptr<IIRCCommand>(OS_NEW IRCCommandRaw(get_this_ptr(), command)), false); }
int runChatServer(chatServer* server) { fd_set read_fds; char remoteIP[INET6_ADDRSTRLEN]; int i; read_fds = server->master; if (select(server->fdmax+1, &read_fds, NULL, NULL, NULL) == -1) { perror("select"); return 4; } /* Verifica por novos dados nos sockets existentes */ for (i = 0; i <= server->fdmax; ++i) { /* Checa se conexão não tem novos dados */ if (!FD_ISSET(i, &read_fds)) { continue; } /* Checa se é uma nova conexão do listenner */ if (i == server->listener) { struct sockaddr_storage remoteaddr; socklen_t addrlen; int newfd; addrlen = sizeof remoteaddr; newfd = accept(server->listener, (struct sockaddr*)&remoteaddr, &addrlen); if (newfd == -1) { perror("accept"); } else { /* Adiciona conexão ao master set */ FD_SET(newfd, &(server->master)); if (newfd > server->fdmax) { server->fdmax = newfd; } printf("Nova conexao de %s na socket %d\n", inet_ntop(remoteaddr.ss_family, get_in_addr((struct sockaddr*)&remoteaddr), remoteIP, INET6_ADDRSTRLEN), newfd); } } /* Recebe dados dos clientes */ else { int nbytes; nbytes = recvall(i, server->buf, SIZE_BUF); if(nbytes <= 0) { if (nbytes == 0) { /* conexão fechada */ printf("Socket %d desligou-se\n", i); } else { perror("recv"); } closeClient(server, i); } else { /* Recebeu dados do cliente, agora interpreta comando */ const cmdIRC2 *cmd; char nick[MAX_USR+1]; int j; cmd = readCmdIRC2(server->buf); if (cmd == NULL) { fprintf(stderr, "Comando invalido recebido\n"); } else switch(cmd->code) { case 1: /* NICK */ sscanf(server->buf, "%*s %s", nick); pushClient(server, i, nick); break; case 2: { /* POST */ char msg[MAX_MSG+1]; char* usr; int newlen; int msglen; int n; /* Copia mensagem do buffer */ n = POST.strlen + 1; if (nbytes <= n) { fprintf(stderr, "POST: mensagem vazia\n"); break; } msglen = nbytes - n - 1; /* -1 para retirar '\n' */ if (msglen <= 0) { fprintf(stderr, "POST: mensagem indefinida"); break; } memcpy(msg, (server->buf)+n, msglen); msg[msglen] = '\0'; /* Cria comando NEW no buffer */ usr = getNick(&(server->clients), i); if (usr == NULL) { fprintf(stderr, "POST: cliente sem nick"); break; } newlen = cmdNEW(server->buf, usr, msg); /* Envia para todos os clientes que devem receber */ for(j = 0; j <= server->fdmax; ++j) { int len = newlen; if (!FD_ISSET(j, &(server->master)) || j == server->listener || j == i || isMuted(&(server->clients), j, i)) { continue; } if (sendall(j, server->buf, &len) == -1) { perror("sendall"); fprintf(stderr, "Envio faltando %d bytes\n", newlen-len); } } break; } case 4: /* MUTE */ sscanf(server->buf, "%*s %s", nick); j = getSocket(&(server->clients), nick); if (j == -1) { fprintf(stderr, "nick inexistente\n"); } else { muteClient(&(server->clients), i, j); } break; case 5: /* UNMUTE */ sscanf(server->buf, "%*s %s", nick); j = getSocket(&(server->clients), nick); if (j == -1) { fprintf(stderr, "nick inexistente\n"); } else { unmuteClient(&(server->clients), i, j); } break; case 6: /* CLOSE */ closeClient(server, i); break; default: return 5; } } } } return 0; }
void NmdcHub::onLine(const string& aLine) throw() { lastActivity = GET_TICK(); if(aLine.length() == 0) return; if(aLine[0] != '$') { // Check if we're being banned... if(state != STATE_CONNECTED) { if(Util::findSubString(aLine, "banned") != string::npos) { reconnect = false; } } Speaker<NmdcHubListener>::fire(NmdcHubListener::Message(), this, Util::validateMessage(fromNmdc(aLine), true)); return; } string cmd; string param; string::size_type x; if( (x = aLine.find(' ')) == string::npos) { cmd = aLine; } else { cmd = aLine.substr(0, x); param = aLine.substr(x+1); } if(cmd == "$Search") { if(state != STATE_CONNECTED) { return; } string::size_type i = 0; string::size_type j = param.find(' ', i); if(j == string::npos || i == j) return; string seeker = fromNmdc(param.substr(i, j-i)); // Filter own searches if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) { if(seeker == (getLocalIp() + ":" + Util::toString(SETTING(IN_PORT)))) { return; } } else { // Hub:seeker if(Util::stricmp(seeker.c_str() + 4, getNick().c_str()) == 0) { return; } } i = j + 1; { Lock l(cs); u_int32_t tick = GET_TICK(); seekers.push_back(make_pair(seeker, tick)); // First, check if it's a flooder FloodIter fi; for(fi = flooders.begin(); fi != flooders.end(); ++fi) { if(fi->first == seeker) { return; } } int count = 0; for(fi = seekers.begin(); fi != seekers.end(); ++fi) { if(fi->first == seeker) count++; if(count > 7) { if(seeker.compare(0, 4, "Hub:") == 0) Speaker<NmdcHubListener>::fire(NmdcHubListener::SearchFlood(), this, seeker.substr(4)); else Speaker<NmdcHubListener>::fire(NmdcHubListener::SearchFlood(), this, seeker + STRING(NICK_UNKNOWN)); flooders.push_back(make_pair(seeker, tick)); return; } } } int a; if(param[i] == 'F') { a = SearchManager::SIZE_DONTCARE; } else if(param[i+2] == 'F') { a = SearchManager::SIZE_ATLEAST; } else { a = SearchManager::SIZE_ATMOST; } i += 4; j = param.find('?', i); if(j == string::npos || i == j) return; string size = param.substr(i, j-i); i = j + 1; j = param.find('?', i); if(j == string::npos || i == j) return; int type = Util::toInt(param.substr(i, j-i)) - 1; i = j + 1; param = param.substr(i); if(param.size() > 0) { Speaker<NmdcHubListener>::fire(NmdcHubListener::Search(), this, seeker, a, Util::toInt64(size), type, fromNmdc(param)); if(seeker.compare(0, 4, "Hub:") == 0) { User::Ptr u; { Lock l(cs); User::NickIter ni = users.find(seeker.substr(4)); if(ni != users.end() && !ni->second->isSet(User::PASSIVE)) { u = ni->second; u->setFlag(User::PASSIVE); } } if(u) { updated(u); } } } } else if(cmd == "$MyINFO") { string::size_type i, j; i = 5; j = param.find(' ', i); if( (j == string::npos) || (j == i) ) return; string nick = fromNmdc(param.substr(i, j-i)); i = j + 1; User::Ptr u; dcassert(nick.size() > 0); { Lock l(cs); User::NickIter ni = users.find(nick); if(ni == users.end()) { u = users[nick] = ClientManager::getInstance()->getUser(nick, this); } else { u = ni->second; } } j = param.find('$', i); if(j == string::npos) return; string tmpDesc = Util::validateMessage(fromNmdc(param.substr(i, j-i)), true); // Look for a tag... if(tmpDesc.size() > 0 && tmpDesc[tmpDesc.size()-1] == '>') { x = tmpDesc.rfind('<'); if(x != string::npos) { // Hm, we have something... u->setTag(tmpDesc.substr(x)); tmpDesc.erase(x); } else { u->setTag(Util::emptyString); } } else { u->setTag(Util::emptyString); } u->setDescription(tmpDesc); i = j + 3; j = param.find('$', i); if(j == string::npos) return; u->setConnection(fromNmdc(param.substr(i, j-i-1))); i = j + 1; j = param.find('$', i); if(j == string::npos) return; u->setEmail(Util::validateMessage(fromNmdc(param.substr(i, j-i)), true)); i = j + 1; j = param.find('$', i); if(j == string::npos) return; u->setBytesShared(param.substr(i, j-i)); Speaker<NmdcHubListener>::fire(NmdcHubListener::MyInfo(), this, u); } else if(cmd == "$Quit") { if(!param.empty()) { User::Ptr u; { Lock l(cs); User::NickIter i = users.find(fromNmdc(param)); if(i == users.end()) { dcdebug("C::onLine Quitting user %s not found\n", param.c_str()); return; } u = i->second; users.erase(i); } Speaker<NmdcHubListener>::fire(NmdcHubListener::Quit(), this, u); ClientManager::getInstance()->putUserOffline(u, true); } } else if(cmd == "$ConnectToMe") { if(state != STATE_CONNECTED) { return; } string::size_type i = param.find(' '); string::size_type j; if( (i == string::npos) || ((i + 1) >= param.size()) ) { return; } i++; j = param.find(':', i); if(j == string::npos) { return; } string server = fromNmdc(param.substr(i, j-i)); if(j+1 >= param.size()) { return; } string port = param.substr(j+1); ConnectionManager::getInstance()->connect(server, (short)Util::toInt(port), getNick()); Speaker<NmdcHubListener>::fire(NmdcHubListener::ConnectToMe(), this, server, (short)Util::toInt(port)); } else if(cmd == "$RevConnectToMe") { if(state != STATE_CONNECTED) { return; } User::Ptr u; bool up = false; { Lock l(cs); string::size_type j = param.find(' '); if(j == string::npos) { return; } User::NickIter i = users.find(fromNmdc(param.substr(0, j))); if(i == users.end()) { return; } u = i->second; if(!u->isSet(User::PASSIVE)) { u->setFlag(User::PASSIVE); up = true; } } if(u) { if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) { connectToMe(u); Speaker<NmdcHubListener>::fire(NmdcHubListener::RevConnectToMe(), this, u); } else { // Notify the user that we're passive too... if(up) revConnectToMe(u); } if(up) updated(u); } } else if(cmd == "$SR") { SearchManager::getInstance()->onSearchResult(aLine); } else if(cmd == "$HubName") { name = fromNmdc(param); Speaker<NmdcHubListener>::fire(NmdcHubListener::HubName(), this); } else if(cmd == "$Supports") { StringTokenizer<string> st(param, ' '); StringList& sl = st.getTokens(); for(StringIter i = sl.begin(); i != sl.end(); ++i) { if(*i == "UserCommand") { supportFlags |= SUPPORTS_USERCOMMAND; } else if(*i == "NoGetINFO") { supportFlags |= SUPPORTS_NOGETINFO; } else if(*i == "UserIP2") { supportFlags |= SUPPORTS_USERIP2; } } Speaker<NmdcHubListener>::fire(NmdcHubListener::Supports(), this, sl); } else if(cmd == "$UserCommand") { string::size_type i = 0; string::size_type j = param.find(' '); if(j == string::npos) return; int type = Util::toInt(param.substr(0, j)); i = j+1; if(type == UserCommand::TYPE_SEPARATOR || type == UserCommand::TYPE_CLEAR) { int ctx = Util::toInt(param.substr(i)); Speaker<NmdcHubListener>::fire(NmdcHubListener::UserCommand(), this, type, ctx, Util::emptyString, Util::emptyString); } else if(type == UserCommand::TYPE_RAW || type == UserCommand::TYPE_RAW_ONCE) { j = param.find(' ', i); if(j == string::npos) return; int ctx = Util::toInt(param.substr(i)); i = j+1; j = param.find('$'); if(j == string::npos) return; string name = fromNmdc(param.substr(i, j-i)); i = j+1; string command = fromNmdc(param.substr(i, param.length() - i)); Speaker<NmdcHubListener>::fire(NmdcHubListener::UserCommand(), this, type, ctx, Util::validateMessage(name, true, false), Util::validateMessage(command, true, false)); } } else if(cmd == "$Lock") { if(state != STATE_LOCK) { return; } state = STATE_HELLO; if(!param.empty()) { string::size_type j = param.find(" Pk="); string lock, pk; if( j != string::npos ) { lock = param.substr(0, j); pk = param.substr(j + 4); } else { // Workaround for faulty linux hubs... j = param.find(" "); if(j != string::npos) lock = param.substr(0, j); else lock = param; } if(CryptoManager::getInstance()->isExtended(lock)) { StringList feat; feat.push_back("UserCommand"); feat.push_back("NoGetINFO"); feat.push_back("NoHello"); feat.push_back("UserIP2"); feat.push_back("TTHSearch"); if(BOOLSETTING(COMPRESS_TRANSFERS)) feat.push_back("GetZBlock"); supports(feat); } key(CryptoManager::getInstance()->makeKey(lock)); validateNick(getNick()); Speaker<NmdcHubListener>::fire(NmdcHubListener::CLock(), this, lock, pk); } } else if(cmd == "$Hello") { if(!param.empty()) { string nick = fromNmdc(param); User::Ptr u = ClientManager::getInstance()->getUser(nick, this); { Lock l(cs); users[nick] = u; } if(getNick() == nick) { setMe(u); u->setFlag(User::DCPLUSPLUS); if(SETTING(CONNECTION_TYPE) != SettingsManager::CONNECTION_ACTIVE) u->setFlag(User::PASSIVE); else u->unsetFlag(User::PASSIVE); } if(state == STATE_HELLO) { state = STATE_CONNECTED; updateCounts(false); version(); getNickList(); myInfo(); } Speaker<NmdcHubListener>::fire(NmdcHubListener::Hello(), this, u); } } else if(cmd == "$ForceMove") { disconnect(); Speaker<NmdcHubListener>::fire(NmdcHubListener::Redirect(), this, param); } else if(cmd == "$HubIsFull") { Speaker<NmdcHubListener>::fire(NmdcHubListener::HubFull(), this); } else if(cmd == "$ValidateDenide") { // Mind the spelling... disconnect(); Speaker<NmdcHubListener>::fire(NmdcHubListener::ValidateDenied(), this); } else if(cmd == "$UserIP") { if(!param.empty()) { User::List v; StringTokenizer<string> t(fromNmdc(param), "$$"); StringList& l = t.getTokens(); for(StringIter it = l.begin(); it != l.end(); ++it) { string::size_type j = 0; if((j = it->find(' ')) == string::npos) continue; if((j+1) == it->length()) continue; v.push_back(ClientManager::getInstance()->getUser(it->substr(0, j), this)); v.back()->setIp(it->substr(j+1)); } Speaker<NmdcHubListener>::fire(NmdcHubListener::UserIp(), this, v); } } else if(cmd == "$NickList") { if(!param.empty()) { User::List v; StringTokenizer<string> t(fromNmdc(param), "$$"); StringList& sl = t.getTokens(); for(StringIter it = sl.begin(); it != sl.end(); ++it) { v.push_back(ClientManager::getInstance()->getUser(*it, this)); } { Lock l(cs); for(User::Iter it2 = v.begin(); it2 != v.end(); ++it2) { users[(*it2)->getNick()] = *it2; } } if(!(getSupportFlags() & SUPPORTS_NOGETINFO)) { string tmp; // Let's assume 10 characters per nick... tmp.reserve(v.size() * (11 + 10 + getNick().length())); for(User::List::const_iterator i = v.begin(); i != v.end(); ++i) { tmp += "$GetINFO "; tmp += (*i)->getNick(); tmp += ' '; tmp += getNick(); tmp += '|'; } if(!tmp.empty()) { send(tmp); } } Speaker<NmdcHubListener>::fire(NmdcHubListener::NickList(), this, v); } } else if(cmd == "$OpList") { if(!param.empty()) { User::List v; StringTokenizer<string> t(fromNmdc(param), "$$"); StringList& sl = t.getTokens(); for(StringIter it = sl.begin(); it != sl.end(); ++it) { v.push_back(ClientManager::getInstance()->getUser(*it, this)); v.back()->setFlag(User::OP); } { Lock l(cs); for(User::Iter it2 = v.begin(); it2 != v.end(); ++it2) { users[(*it2)->getNick()] = *it2; } } Speaker<NmdcHubListener>::fire(NmdcHubListener::OpList(), this, v); updateCounts(false); // Special...to avoid op's complaining that their count is not correctly // updated when they log in (they'll be counted as registered first...) myInfo(); } } else if(cmd == "$To:") { string::size_type i = param.find("From:"); if(i != string::npos) { i+=6; string::size_type j = param.find("$"); if(j != string::npos) { string from = fromNmdc(param.substr(i, j - 1 - i)); if(from.size() > 0 && param.size() > (j + 1)) { Speaker<NmdcHubListener>::fire(NmdcHubListener::PrivateMessage(), this, ClientManager::getInstance()->getUser(from, this, false), Util::validateMessage(fromNmdc(param.substr(j + 1)), true)); } } } } else if(cmd == "$GetPass") { setRegistered(true); Speaker<NmdcHubListener>::fire(NmdcHubListener::GetPassword(), this); } else if(cmd == "$BadPass") { Speaker<NmdcHubListener>::fire(NmdcHubListener::BadPassword(), this); } else if(cmd == "$LogedIn") { Speaker<NmdcHubListener>::fire(NmdcHubListener::LoggedIn(), this); } else { dcassert(cmd[0] == '$'); dcdebug("NmdcHub::onLine Unknown command %s\n", aLine.c_str()); } }
QString JabberContact::name() const { return getNick(); }
void WhisperTab::saveToLogFile(std::string &msg) { if (chatLogger) chatLogger->log(getNick(), msg); }
int main(int argc, char **argv) { daemon(0,0); struct client clients[10]; int numberClients = 0, serverSocket, clientSocket, ret, socketNumber, readSize, maxSocketNumber, i, activity; struct sockaddr_in server; char messageFromClient[2048], messageToClient[2048]; fd_set socketList; serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) fprintf(stderr,"Error to create socket"); server.sin_family = AF_INET; inet_aton("127.0.0.1", &server.sin_addr.s_addr); opterr = 0; //no default "invalid option" info while ((ret = getopt (argc, argv, "p:q")) != -1) switch (ret) { case 'p': socketNumber = atoi(optarg); server.sin_port = htons(socketNumber); break; case 'q': system("`killall lab6server`"); exit(0); break; case '?': if (optopt == 'p') fprintf (stderr, "Option -%c requires an argument.\n", optopt); else fprintf (stderr, "Unknown option `-%c'.\n", optopt); return 1; default: abort (); } if(bind(serverSocket, (struct sockaddr *)&server, sizeof(server)) < 0) { fprintf(stderr, "Error to bind"); return 1; } listen(serverSocket, 2); char c = sizeof(struct sockaddr_in); printf("Wait for connection\n"); while(1) { FD_ZERO(&socketList); FD_SET(serverSocket, &socketList); maxSocketNumber = serverSocket; for ( i = 0 ; i < numberClients; i++) { if(clients[i].clientSocket > 0) FD_SET( clients[i].clientSocket , &socketList); if(clients[i].clientSocket > maxSocketNumber) maxSocketNumber = clients[i].clientSocket; } activity = select( maxSocketNumber + 1 , &socketList , NULL , NULL , NULL); if (activity < 0) fprintf(stderr, "Select error"); if (FD_ISSET(serverSocket, &socketList)) { strcpy(messageFromClient,""); if (numberClients < 10) { printf("\nNew connection\n"); clientSocket = accept(serverSocket, (struct sockaddr *)&clients[numberClients].clientSock, (socklen_t*)&c); if (clientSocket < 0) { fprintf(stderr,"Error to accept"); continue; } clients[numberClients].clientSocket = clientSocket; if (readSize = recv(clients[numberClients].clientSocket, messageFromClient , 2048, 0) <= 0) { fprintf(stderr, "Error to read client name\n"); continue; } else messageFromClient[strlen(messageFromClient)] = '\0'; if (strcmp(getOrder(messageFromClient), "/nick") == 0) clients[numberClients].name = getNick(messageFromClient); printf("Client name %s connected \n", clients[numberClients].name); numberClients++; memset(messageFromClient, '\0', 2048); } } for (i = 0; i < numberClients; i++) { if (FD_ISSET( clients[i].clientSocket, &socketList)) { if ((readSize = recv( clients[i].clientSocket, messageFromClient, 2048, 0)) == 0) { printf("Delete\n"); int counter=0,j; struct client tmp[10]; for (j = 0; j < numberClients; j++) { if(clients[i].clientSocket == clients[j].clientSocket) close(clients[j].clientSocket); else { tmp[counter] = clients[j]; counter++; } } numberClients = counter; for (j = 0; j < numberClients; j++) clients[j] = tmp[j]; } else { strcpy(clients[i].lastMessage, messageFromClient); clients[i].lastMessage[strlen(clients[i].lastMessage)] = '\0'; memset(messageFromClient, '\0', 2048); } } } for(i = 0; i < numberClients; i++) { if(strlen(clients[i].lastMessage) != 0) { printf("Is message: %s\n", clients[i].lastMessage); if ((strcmp(getOrder(clients[i].lastMessage), "/msg") == 0)) { printf("Msg\n"); char *nick = malloc(sizeof(char)); nick = getNick(clients[i].lastMessage); if (nick == NULL) { strcpy(messageToClient, "Nick needed"); if (send(clients[i].clientSocket, messageToClient, strlen(messageToClient), 0) < 0) fprintf(stderr, "Error to send message"); memset(clients[i].lastMessage, '\0', 2048); continue; } struct client *tmp = getClientStruct(nick, clients, numberClients); if (tmp == NULL) { strcpy(messageToClient, "Client "); strcat(messageToClient, nick); strcat(messageToClient, " disconnected"); if (send(clients[i].clientSocket, messageToClient, strlen(messageToClient), 0) < 0) fprintf(stderr, "Error to send message"); memset(clients[i].lastMessage, '\0', 2048); continue; } strcpy(messageToClient, nick); strcat(messageToClient, ": "); strcat(messageToClient, getMessage(clients[i].lastMessage)); if (strlen(messageToClient) == 0) { strcpy(messageToClient, "Message needed"); if (send(clients[i].clientSocket, messageToClient, strlen(messageToClient), 0) < 0) fprintf(stderr, "Error to send message"); memset(clients[i].lastMessage, '\0', 2048); continue; } if(send(tmp->clientSocket, messageToClient, strlen(messageToClient), 0) < 0) { strcpy(messageToClient, "Error to send message"); if (send(clients[i].clientSocket, messageToClient, strlen(messageToClient), 0) < 0) fprintf(stderr, "Error to send message\n"); } memset(clients[i].lastMessage, '\0', 2048); } else if(strcmp(getOrder(clients[i].lastMessage), "/list") == 0) { printf("List\n"); strcpy(messageToClient, getClientsList(clients, numberClients)); printf("%s\n", messageToClient); if (send(clients[i].clientSocket, messageToClient, strlen(messageToClient), 0) < 0) fprintf(stderr, "Error to send message\n"); memset(clients[i].lastMessage, '\0', 2048); } else if(strcmp(getOrder(clients[i].lastMessage), "/quit") == 0) { printf("Quit\n"); memset(clients[i].lastMessage, '\0', 2048); int counter=0,j; struct client tmp[10]; for (j = 0; j < numberClients; j++) { if(clients[i].clientSocket == clients[j].clientSocket) close(clients[j].clientSocket); else { tmp[counter] = clients[j]; counter++; } } numberClients = counter; for (j = 0; j < numberClients; j++) clients[j]= tmp[j]; } else { strcpy(messageToClient, "Wrong Order"); if (send(clients[i].clientSocket, messageToClient, strlen(messageToClient), 0) < 0) fprintf(stderr, "Error to send message\n"); memset(clients[i].lastMessage, '\0', 2048); } } } } return 0; }