typedef nspace::hash_map<std::string, TreeServer*, nspace::hash<string>, irc::StrHashComp> server_hash;
server_hash serverlist;
+typedef nspace::hash_map<std::string, userrec*> uid_hash;
+typedef nspace::hash_map<std::string, char*> sid_hash;
+
/* More forward declarations */
bool DoOneToOne(std::string prefix, std::string command, std::deque<std::string> ¶ms, std::string target);
bool DoOneToAllButSender(std::string prefix, std::string command, std::deque<std::string> ¶ms, std::string omit);
extern std::vector<QLine> pqlines;
extern std::vector<ELine> pelines;
+class UserManager : public classbase
+{
+ uid_hash uids;
+ sid_hash sids;
+ public:
+ UserManager()
+ {
+ uids.clear();
+ sids.clear();
+ }
+
+ std::string UserToUID(userrec* user)
+ {
+ return "";
+ }
+
+ std::string UIDToUser(const std::string &UID)
+ {
+ return "";
+ }
+
+ std::string CreateAndAdd(userrec* user)
+ {
+ return "";
+ }
+
+ std::string CreateAndAdd(const std::string &servername)
+ {
+ return "";
+ }
+
+ std::string ServerToSID(const std::string &servername)
+ {
+ return "";
+ }
+
+ std::string SIDToServer(const std::string &SID)
+ {
+ return "";
+ }
+
+ userrec* FindByID(const std::string &UID)
+ {
+ return NULL;
+ }
+};
+
/* Each server in the tree is represented by one class of
* type TreeServer. A locally connected TreeServer can
* have a class of type TreeSocket associated with it, for
clientlist[tempnick]->server = FindServerNamePtr(source.c_str());
strlcpy(clientlist[tempnick]->ident, params[4].c_str(),IDENTMAX);
strlcpy(clientlist[tempnick]->fullname, params[7].c_str(),MAXGECOS);
- clientlist[tempnick]->registered = 7;
+ clientlist[tempnick]->registered = REG_ALL;
clientlist[tempnick]->signon = age;
for (std::string::iterator v = params[5].begin(); v != params[5].end(); v++)
int iterations = 0;
for (user_hash::iterator u = clientlist.begin(); u != clientlist.end(); u++, iterations++)
{
- if (u->second->registered == 7)
+ if (u->second->registered == REG_ALL)
{
snprintf(data,MAXBUF,":%s NICK %lu %s %s %s %s +%s %s :%s",u->second->server,(unsigned long)u->second->age,u->second->nick,u->second->host,u->second->dhost,u->second->ident,u->second->FormatModes(),inet_ntoa(u->second->ip4),u->second->fullname);
this->WriteLine(data);
if (params.size() == 1)
{
userrec* x = Srv->FindNick(params[0]);
- if ((x) && (x->fd > -1))
+ if ((x) && (IS_LOCAL(x)))
{
userrec* x = Srv->FindNick(params[0]);
log(DEBUG,"Got IDLE");
{
std::string who_did_the_whois = params[0];
userrec* who_to_send_to = Srv->FindNick(who_did_the_whois);
- if ((who_to_send_to) && (who_to_send_to->fd > -1))
+ if ((who_to_send_to) && (IS_LOCAL(who_to_send_to)))
{
log(DEBUG,"Got final IDLE");
// an incoming reply to a whois we sent out
std::string nick_whoised = prefix;
unsigned long signon = atoi(params[1].c_str());
unsigned long idle = atoi(params[2].c_str());
- if ((who_to_send_to) && (who_to_send_to->fd > -1))
+ if ((who_to_send_to) && (IS_LOCAL(who_to_send_to)))
do_whois(who_to_send_to,u,signon,idle,nick_whoised.c_str());
}
else
/* XXX: Fixme: blocks for a very short amount of time,
* we should cache these on rehash/startup
*/
- if (CleanAndResolve(resolved_host,i->IPAddr.c_str(),true))
+ if (CleanAndResolve(resolved_host,i->IPAddr.c_str(),true,1))
{
if (std::string(resolved_host) == ip)
{
int HandleTime(const char** parameters, int pcnt, userrec* user)
{
- if ((user->fd > -1) && (pcnt))
+ if ((IS_LOCAL(user)) && (pcnt))
{
TreeServer* found = FindServerMask(parameters[0]);
if (found)
int HandleRemoteWhois(const char** parameters, int pcnt, userrec* user)
{
- if ((user->fd > -1) && (pcnt > 1))
+ if ((IS_LOCAL(user)) && (pcnt > 1))
{
userrec* remote = Srv->FindNick(parameters[1]);
if ((remote) && (remote->fd < 0))
virtual void OnUserInvite(userrec* source,userrec* dest,chanrec* channel)
{
- if (source->fd > -1)
+ if (IS_LOCAL(source))
{
std::deque<std::string> params;
params.push_back(dest->nick);
virtual void OnWallops(userrec* user, const std::string &text)
{
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
std::deque<std::string> params;
params.push_back(":"+text);
if (target_type == TYPE_USER)
{
userrec* d = (userrec*)dest;
- if ((d->fd < 0) && (user->fd > -1))
+ if ((d->fd < 0) && (IS_LOCAL(user)))
{
std::deque<std::string> params;
params.clear();
}
else if (target_type == TYPE_CHANNEL)
{
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
chanrec *c = (chanrec*)dest;
std::string cname = c->name;
}
else if (target_type == TYPE_SERVER)
{
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
char* target = (char*)dest;
std::deque<std::string> par;
// route private messages which are targetted at clients only to the server
// which needs to receive them
userrec* d = (userrec*)dest;
- if ((d->fd < 0) && (user->fd > -1))
+ if ((d->fd < 0) && (IS_LOCAL(user)))
{
std::deque<std::string> params;
params.clear();
}
else if (target_type == TYPE_CHANNEL)
{
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
chanrec *c = (chanrec*)dest;
std::string cname = c->name;
}
else if (target_type == TYPE_SERVER)
{
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
char* target = (char*)dest;
std::deque<std::string> par;
virtual void OnUserJoin(userrec* user, chanrec* channel)
{
// Only do this for local users
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
std::deque<std::string> params;
params.clear();
virtual void OnChangeHost(userrec* user, const std::string &newhost)
{
// only occurs for local clients
- if (user->registered != 7)
+ if (user->registered != REG_ALL)
return;
std::deque<std::string> params;
params.push_back(newhost);
virtual void OnChangeName(userrec* user, const std::string &gecos)
{
// only occurs for local clients
- if (user->registered != 7)
+ if (user->registered != REG_ALL)
return;
std::deque<std::string> params;
params.push_back(gecos);
virtual void OnUserPart(userrec* user, chanrec* channel, const std::string &partmessage)
{
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
std::deque<std::string> params;
params.push_back(channel->name);
virtual void OnUserConnect(userrec* user)
{
char agestr[MAXBUF];
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
std::deque<std::string> params;
snprintf(agestr,MAXBUF,"%lu",(unsigned long)user->age);
virtual void OnUserQuit(userrec* user, const std::string &reason)
{
- if ((user->fd > -1) && (user->registered == 7))
+ if ((IS_LOCAL(user)) && (user->registered == REG_ALL))
{
std::deque<std::string> params;
params.push_back(":"+reason);
virtual void OnUserPostNick(userrec* user, const std::string &oldnick)
{
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
std::deque<std::string> params;
params.push_back(user->nick);
virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason)
{
- if ((source) && (source->fd > -1))
+ if ((source) && (IS_LOCAL(source)))
{
std::deque<std::string> params;
params.push_back(chan->name);
// locally.
virtual void OnOper(userrec* user, const std::string &opertype)
{
- if (user->fd > -1)
+ if (IS_LOCAL(user))
{
std::deque<std::string> params;
params.push_back(opertype);
void OnLine(userrec* source, const std::string &host, bool adding, char linetype, long duration, const std::string &reason)
{
- if (source->fd > -1)
+ if (IS_LOCAL(source))
{
char type[8];
snprintf(type,8,"%cLINE",linetype);
virtual void OnMode(userrec* user, void* dest, int target_type, const std::string &text)
{
- if ((user->fd > -1) && (user->registered == 7))
+ if ((IS_LOCAL(user)) && (user->registered == REG_ALL))
{
if (target_type == TYPE_USER)
{