X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fusers.h;h=03540018b85d7816266ef304441427a34e7e2400;hb=30fc51c6ddca487a1b89da9ab0ab59da003aee36;hp=db2d538785c9378a6367642f5adf22a680ea5c27;hpb=f1f8173bb5ca5f5ce01ad92d0ccd309f232fc138;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/users.h b/include/users.h index db2d53878..03540018b 100644 --- a/include/users.h +++ b/include/users.h @@ -241,13 +241,29 @@ class CoreExport User : public Extensible /** The user's mode list. * Much love to the STL for giving us an easy to use bitset, saving us RAM. - * if (modes[modeletter-65]) is set, then the mode is - * set, for example, to work out if mode +s is set, we check the field - * User::modes['s'-65] != 0. + * if (modes[modeid]) is set, then the mode is set. + * For example, to work out if mode +i is set, we check the field + * User::modes[invisiblemode->modeid] == true. */ - std::bitset<64> modes; + std::bitset modes; public: + /** To execute a function for each local neighbor of a user, inherit from this class and + * pass an instance of it to User::ForEachNeighbor(). + */ + class ForEachNeighborHandler + { + public: + /** Method to execute for each local neighbor of a user. + * Derived classes must implement this. + * @param user Current neighbor + */ + virtual void Execute(LocalUser* user) = 0; + }; + + /** List of Memberships for this user + */ + typedef insp::intrusive_list ChanList; /** Hostname of connection. * This should be valid as per RFC1035. @@ -302,7 +318,7 @@ class CoreExport User : public Extensible /** Channels this user is on */ - UserChanList chans; + ChanList chans; /** The server the user is connected to. */ @@ -462,15 +478,6 @@ class CoreExport User : public Extensible */ void Oper(OperInfo* info); - /** Force a nickname change. - * If the nickname change fails (for example, because the nick in question - * already exists) this function will return false, and you must then either - * output an error message, or quit the user for nickname collision. - * @param newnick The nickname to change to - * @return True if the nickchange was successful. - */ - bool ForceNickChange(const std::string& newnick) { return ChangeNick(newnick, true); } - /** Oper down. * This will clear the +o usermode and unset the user's oper type */ @@ -501,10 +508,16 @@ class CoreExport User : public Extensible */ void WriteServ(const char* text, ...) CUSTOM_PRINTF(2, 3); + /** Sends a command to this user. + * @param command The command to be sent. + * @param text The message to send. + */ + void WriteCommand(const char* command, const std::string& text); + /** Sends a server notice to this user. * @param text The contents of the message to send. */ - void WriteNotice(const std::string& text); + void WriteNotice(const std::string& text) { this->WriteCommand("NOTICE", ":" + text); } void WriteNumeric(unsigned int numeric, const char* text, ...) CUSTOM_PRINTF(3, 4); @@ -523,19 +536,6 @@ class CoreExport User : public Extensible */ void WriteFrom(User *user, const char* text, ...) CUSTOM_PRINTF(3, 4); - /** Write text to the user provided in the first parameter, appending CR/LF, and prepending THIS user's :nick!user\@host. - * @param dest The user to route the message to - * @param data A std::string to send to the user - */ - void WriteTo(User *dest, const std::string &data); - - /** Write text to the user provided in the first parameter, appending CR/LF, and prepending THIS user's :nick!user\@host. - * @param dest The user to route the message to - * @param data The format string for text to send to the user - * @param ... POD-type format arguments - */ - void WriteTo(User *dest, const char *data, ...) CUSTOM_PRINTF(3, 4); - /** Write to all users that can see this user (including this user in the list if include_self is true), appending CR/LF * @param line A std::string to send to the users * @param include_self Should the message be sent back to the author? @@ -548,18 +548,15 @@ class CoreExport User : public Extensible */ void WriteCommon(const char* text, ...) CUSTOM_PRINTF(2, 3); - /** Write to all users that can see this user (not including this user in the list), appending CR/LF - * @param text The format string for text to send to the users - * @param ... POD-type format arguments - */ - void WriteCommonExcept(const char* text, ...) CUSTOM_PRINTF(2, 3); - - /** Write a quit message to all common users, as in User::WriteCommonExcept but with a specific - * quit message for opers only. - * @param normal_text Normal user quit message - * @param oper_text Oper only quit message + /** Execute a function once for each local neighbor of this user. By default, the neighbors of a user are the users + * who have at least one common channel with the user. Modules are allowed to alter the set of neighbors freely. + * This function is used for example to send something conditionally to neighbors, or to send different messages + * to different users depending on their oper status. + * @param handler Function object to call, inherited from ForEachNeighborHandler. + * @param include_self True to include this user in the set of neighbors, false otherwise. + * Modules may override this. Has no effect if this user is not local. */ - void WriteCommonQuit(const std::string &normal_text, const std::string &oper_text); + void ForEachNeighbor(ForEachNeighborHandler& handler, bool include_self = true); /** Dump text to a user target, splitting it appropriately to fit * @param linePrefix text to prefix each complete line with @@ -610,21 +607,10 @@ class CoreExport User : public Extensible bool ChangeName(const std::string& gecos); /** Change a user's nick - * @param newnick The new nick - * @param force True if the change is being forced (should not be blocked by modes like +N) + * @param newnick The new nick. If equal to the users uuid, the nick change always succeeds. * @return True if the change succeeded */ - bool ChangeNick(const std::string& newnick, bool force = false); - - /** Send a command to all local users from this user - * The command given must be able to send text with the - * first parameter as a servermask (e.g. $*), so basically - * you should use PRIVMSG or NOTICE. - * @param command the command to send - * @param text The text format string to send - * @param ... Format arguments - */ - void SendAll(const char* command, const char* text, ...) CUSTOM_PRINTF(3, 4); + bool ChangeNick(const std::string& newnick, time_t newts = 0); /** Remove this user from all channels they are on, and delete any that are now empty. * This is used by QUIT, and will not send part messages! @@ -655,7 +641,7 @@ class CoreExport UserIOHandler : public StreamSocket typedef unsigned int already_sent_t; -class CoreExport LocalUser : public User, public InviteBase, public intrusive_list_node +class CoreExport LocalUser : public User, public insp::intrusive_list_node { public: LocalUser(int fd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server); @@ -762,27 +748,6 @@ class CoreExport LocalUser : public User, public InviteBase, public intrusive_li void Write(const std::string& text); void Write(const char*, ...) CUSTOM_PRINTF(2, 3); - /** Returns the list of channels this user has been invited to but has not yet joined. - * @return A list of channels the user is invited to - */ - InviteList& GetInviteList(); - - /** Returns true if a user is invited to a channel. - * @param chan A channel to look up - * @return True if the user is invited to the given channel - */ - bool IsInvited(Channel* chan) { return (Invitation::Find(chan, this) != NULL); } - - /** Removes a channel from a users invite list. - * This member function is called on successfully joining an invite only channel - * to which the user has previously been invited, to clear the invitation. - * @param chan The channel to remove the invite to - * @return True if the user was invited to the channel and the invite was erased, false if the user wasn't invited - */ - bool RemoveInvite(Channel* chan); - - void RemoveExpiredInvites(); - /** Returns true or false for if a user can execute a privilaged oper command. * This is done by looking up their oper type from User::oper, then referencing * this to their oper classes and checking the commands they can execute. @@ -859,8 +824,7 @@ inline FakeUser* IS_SERVER(User* u) inline bool User::IsModeSet(ModeHandler* mh) { - char m = mh->GetModeChar(); - return (modes[m-65]); + return (modes[mh->GetId()]); } inline bool User::IsModeSet(UserModeReference& moderef) @@ -872,6 +836,5 @@ inline bool User::IsModeSet(UserModeReference& moderef) inline void User::SetMode(ModeHandler* mh, bool value) { - char m = mh->GetModeChar(); - modes[m-65] = value; + modes[mh->GetId()] = value; }