* This class represents a channel, and contains its name, modes, topic, topic set time,
* etc, and an instance of the BanList type.
*/
-class CoreExport Channel : public Extensible, public InviteBase<Channel>
+class CoreExport Channel : public Extensible
{
+ public:
+ /** A map of Memberships on a channel keyed by User pointers
+ */
+ typedef std::map<User*, insp::aligned_storage<Membership> > MemberMap;
+
+ private:
/** Set default modes for the channel on creation
*/
void SetDefaultModes();
* This function does not remove the channel from User::chanlist.
* Since the parameter is an iterator to the target, the complexity
* of this function is constant.
- * @param membiter The UserMembIter to remove, must be valid
+ * @param membiter The MemberMap iterator to remove, must be valid
*/
- void DelUser(const UserMembIter& membiter);
+ void DelUser(const MemberMap::iterator& membiter);
public:
/** Creates a channel record and initialises it with default values
/** User list.
*/
- UserMembList userlist;
+ MemberMap userlist;
/** Channel topic.
* If this is an empty string, no channel topic is set.
/** Sets the channel topic.
* @param user The user setting the topic.
* @param topic The topic to set it to.
+ * @param topicts Timestamp of the new topic.
+ * @param setter Setter string, may be used when the original setter is no longer online.
+ * If omitted or NULL, the setter string is obtained from the user.
*/
- void SetTopic(User* user, const std::string& topic);
+ void SetTopic(User* user, const std::string& topic, time_t topicts, const std::string* setter = NULL);
/** Obtain the channel "user counter"
* This returns the number of users on this channel
*
* @return This function returns pointer to a map of User pointers (CUList*).
*/
- const UserMembList* GetUsers() const { return &userlist; }
+ const MemberMap& GetUsers() const { return userlist; }
/** Returns true if the user given is on the given channel.
* @param user The user to look for
/** 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
+ */
+ void KickUser(User* src, const MemberMap::iterator& 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
- * @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, User* user, const std::string& reason)
+ {
+ MemberMap::iterator 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 user The user who is parting (must be on this channel)
* @param reason The part reason
+ * @return True if the user was on the channel and left, false if they weren't and nothing happened
*/
- void PartUser(User *user, std::string &reason);
+ bool PartUser(User* user, std::string& reason);
/** Join a local user to a channel, with or without permission checks. May be a channel that doesn't exist yet.
* @param user The user to join to the channel.
* @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
*/
const char* ChanModes(bool showkey);
- /** 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, bool isinside = true);
-
/** Get the value of a users prefix on this channel.
* @param user The user to look up
* @return The module or core-defined value of the users prefix.
/** Get the status of an "action" type extban
*/
ModResult GetExtBanStatus(User *u, char type);
+
+ /** Write a NOTICE to all local users on the channel
+ * @param text Text to send
+ */
+ void WriteNotice(const std::string& text);
};
inline bool Channel::HasUser(User* user)