コード例 #1
0
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;
}
コード例 #2
0
ファイル: User.cpp プロジェクト: BackupTheBerlios/fuldc-svn
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"));
			}
		}
	}
}
コード例 #3
0
ファイル: User.cpp プロジェクト: Caraul/airgit
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"));
			}
		}
	}
}
コード例 #4
0
ファイル: commands.cpp プロジェクト: supermukmin/ManaPlus
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()));
}
コード例 #5
0
ファイル: MessageManager.cpp プロジェクト: shas19/airdcnano
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);
}
コード例 #6
0
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())  + "|");
	}
}
コード例 #7
0
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;
}
コード例 #8
0
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;
	}
}
コード例 #9
0
ファイル: AdcHub.cpp プロジェクト: BackupTheBerlios/linuxdcpp
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);
	}
}
コード例 #10
0
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;
}
コード例 #11
0
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()) + "|");
}
コード例 #12
0
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);
}
コード例 #13
0
ファイル: chatServer.c プロジェクト: EngSis2015/irc-seletivo
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;
}
コード例 #14
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());
	} 
}
コード例 #15
0
QString JabberContact::name() const
{
    return getNick();
}
コード例 #16
0
ファイル: whispertab.cpp プロジェクト: Evonline/ManaPlus
void WhisperTab::saveToLogFile(std::string &msg)
{
    if (chatLogger)
        chatLogger->log(getNick(), msg);
}
コード例 #17
0
ファイル: lab6server.c プロジェクト: pawelrosada/SO2
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;
    
}