/** Handle /ISON */ CmdResult CommandIson::Handle (const std::vector<std::string>& parameters, User *user) { std::string reply = "303 " + user->nick + " :"; const std::string::size_type pos = reply.size(); for (std::vector<std::string>::const_iterator i = parameters.begin(); i != parameters.end(); ++i) { const std::string& targetstr = *i; User* const u = ServerInstance->FindNickOnly(targetstr); if (!AddNick(user, u, reply, pos)) { if ((i == parameters.end() - 1) && (targetstr.find(' ') != std::string::npos)) { /* Its a space seperated list of nicks (RFC1459 says to support this) */ irc::spacesepstream list(targetstr); std::string item; while (list.GetToken(item)) AddNick(user, ServerInstance->FindNickOnly(item), reply, pos); } } } user->WriteServ(reply); return CMD_SUCCESS; }
void sSocket::ParseData(int bytes) { Reader.Reset(); while(Reader.GetOffset() < bytes) { int opcode = Reader.ReadWord(); switch(opcode) { case C_MESSAGE: SendToAll(bytes); break; //case C_REQ_NICK_LIST: // Writer.WriteWord(S_SEND_NICK_LIST); // Writer.WriteByte(TotalMembers); //how many members // for(int x = 0; x < 20; x++) // { // if(NickPar[x].nick_size > 0) // { // Writer.WriteByte(NickPar[x].nick_size); //nick size // Writer.WriteString((unsigned char*)NickPar[x].nick, NickPar[x].nick_size); //nick // } // } // Send((char*)Writer.Buffer, Writer.offset); // break; case C_WHO_I_AM: //client told us who he is: unsigned int size = Reader.ReadByte(); //size unsigned char *nick; nick = new unsigned char[size]; Reader.ReadString(nick, size); //get nick //add to the list if(FindNick((char*)nick, size) == -1) //there's no nick AddNick((char*)nick, size); else //send that nick already exists { Writer.WriteWord(S_NICK_EXISTS); Send((char*)Writer.Buffer, Writer.offset); //now client should close the connection... break; } //notice all SendToAllNotice((char*)nick, size, 0); SendNickList(); break; } } }
int CChan::AddNicks(const CString& sNicks) { int iRet = 0; VCString vsNicks; VCString::iterator it; sNicks.Split(" ", vsNicks, false); for (it = vsNicks.begin(); it != vsNicks.end(); ++it) { if (AddNick(*it)) { iRet++; } } return iRet; }
void Socket::ParseData(int bytes) { Reader.Reset(); while(Reader.GetOffset() < bytes) { unsigned short opcode = Reader.ReadWord(); switch(opcode) { case C_MESSAGE: //text message { unsigned char *msg; unsigned char *nick; unsigned short size_nick = Reader.ReadByte(); //read nick nick = new unsigned char[size_nick]; Reader.ReadString(nick, size_nick); //read nick string unsigned short size_text = Reader.ReadByte(); //read text size msg = new unsigned char[size_text]; Reader.ReadString(msg, size_text); //read text ShowMessage((char*)msg, size_text, (char*)nick, size_nick); delete [] nick; delete [] msg; break; } case C_CONNECT: //connected { unsigned char *nick; unsigned short size = Reader.ReadByte(); nick = new unsigned char[size]; Reader.ReadString(nick, size); MemberNotice((char*)nick, size, 0); //notice everyone //AddNick((char*)nick, size); delete [] nick; break; } case C_DISCONNECT: //disconnected { unsigned char *nick; unsigned short size = Reader.ReadByte(); nick = new unsigned char[size]; Reader.ReadString(nick, size); MemberNotice((char*)nick, size, 1); delete [] nick; break; } case S_SEND_NICK_LIST: //got from server { for(int x = 0; x < 20; x++) //delete old list ZeroMemory(&NickPar[x], sizeof(Nick)); for(int x = 0; x < 20; x++) //delete nick list SendMessage(NickList, LB_DELETESTRING, 0, 0); int TotalMembers = Reader.ReadByte(); //get total members cur_chatters = TotalMembers; //used for deleting list for(int x = 0; x < TotalMembers; x++) { unsigned int size = Reader.ReadByte(); //get size unsigned char *nick; nick = new unsigned char[size]; Reader.ReadString(nick, size); //get nick if(FindNick((char*)nick, size) > -1) { //nick found do nothing... } else { AddNick((char*)nick, size); UpdateWindow(NickList); } } break; } case S_WHO_ARE_YOU: { Writer.WriteWord(C_WHO_I_AM); // Writer.WriteByte(MyNick.nick_size); //size Writer.WriteString((unsigned char*)MyNick.nick, MyNick.nick_size); //nick Send((char*)Writer.Buffer, Writer.offset); break; } default: { SetText("Unknown opcode"); Reader.SetOffset(1000); break; } } } }