void SetDefaultModes();
/** Modes for the channel.
- * This is not a null terminated string! It is a bitset where
- * each item in it represents if a mode is set. For example
- * for mode +A, index 0. Use modechar-65 to calculate which
- * field to check.
+ * It is a bitset where each item in it represents if a mode is set.
+ * To see if a mode is set, inspect modes[mh->modeid]
*/
- std::bitset<64> modes;
+ std::bitset<ModeParser::MODEID_MAX> modes;
/** Remove the given membership from the channel's internal map of
* memberships and destroy the Membership object.
* @param mode The mode character you wish to query
* @return True if the custom mode is set, false if otherwise
*/
- inline bool IsModeSet(ModeHandler* mode) { return modes[mode->GetModeChar()-'A']; }
+ bool IsModeSet(ModeHandler* mode) { return ((mode->GetId() != ModeParser::MODEID_MAX) && (modes[mode->GetId()])); }
bool IsModeSet(ModeHandler& mode) { return IsModeSet(&mode); }
bool IsModeSet(ChanModeReference& mode);
/** Make src kick user from this channel with the given reason.
* @param src The source of the kick
- * @param user The user being kicked (must be on this channel)
+ * @param victimiter Iterator to the user being kicked, must be valid
* @param reason The reason for the kick
- * @param srcmemb The membership of the user who does the kick, can be NULL
*/
- void KickUser(User* src, User* user, const std::string& reason, Membership* srcmemb = NULL);
+ void KickUser(User* src, const UserMembIter& victimiter, const std::string& reason);
+
+ /** Make src kick user from this channel with the given reason.
+ * @param src The source of the kick
+ * @param user The user being kicked
+ * @param reason The reason for the kick
+ */
+ void KickUser(User* src, User* user, const std::string& reason)
+ {
+ UserMembIter it = userlist.find(user);
+ if (it != userlist.end())
+ KickUser(src, it, reason);
+ }
/** Part a user from this channel with the given reason.
* If the reason field is NULL, no reason will be sent.
* @param privs Priviliges (prefix mode letters) to give to this user, may be NULL
* @param bursting True if this join is the result of a netburst (passed to modules in the OnUserJoin hook)
* @param created_by_local True if this channel was just created by a local user (passed to modules in the OnUserJoin hook)
+ * @return A newly created Membership object, or NULL if the user was already inside the channel or if the user is a server user
*/
- void ForceJoin(User* user, const std::string* privs = NULL, bool bursting = false, bool created_by_local = false);
+ Membership* ForceJoin(User* user, const std::string* privs = NULL, bool bursting = false, bool created_by_local = false);
/** Write to a channel, from a user, using va_args for text
* @param user User whos details to prefix the line with
/** Spool the NAMES list for this channel to the given user
* @param user The user to spool the NAMES list to
+ * @param isinside If true, the user is inside the channel, if not then false
*/
- void UserList(User *user);
+ void UserList(User* user, bool isinside = true);
/** Get the value of a users prefix on this channel.
* @param user The user to look up