* 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*, Membership*> MemberMap;
+ typedef std::map<User*, insp::aligned_storage<Membership> > MemberMap;
private:
/** Set default modes for the channel on creation
* 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
/** 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
* @param victimiter Iterator to the user being kicked, must be valid
* @param reason The reason for the kick
*/
- void KickUser(User* src, const UserMembIter& victimiter, const std::string& reason);
+ 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
*/
void KickUser(User* src, User* user, const std::string& reason)
{
- UserMembIter it = userlist.find(user);
+ MemberMap::iterator it = userlist.find(user);
if (it != userlist.end())
KickUser(src, it, 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.
*/
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)