]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/membership.h
ProtocolInterface::SendEncapsulatedData() changes
[user/henk/code/inspircd.git] / include / membership.h
index 281d04f70ba1818366416b77d2aee32ad1e99d3d..d98b54731884cd31d12f641e9ddd42c6a6be0a5f 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2012-2014 Attila Molnar <attilamolnar@hush.com>
  *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  */
 
 
-#ifndef MEMBERSHIP_H
-#define MEMBERSHIP_H
+#pragma once
 
-class CoreExport Membership : public Extensible
+class CoreExport Membership : public Extensible, public intrusive_list_node<Membership>
 {
  public:
        User* const user;
@@ -33,6 +33,53 @@ class CoreExport Membership : public Extensible
                return modes.find(m) != std::string::npos;
        }
        unsigned int getRank();
+
+       /** Add a prefix character to a user.
+        * Only the core should call this method, usually from
+        * within the mode parser or when the first user joins
+        * the channel (to grant the default privs to them)
+        * @param mh The mode handler of the prefix mode to associate
+        * @param adding True if adding the prefix, false when removing
+        * @return True if a change was made
+        */
+       bool SetPrefix(PrefixMode* mh, bool adding);
+};
+
+template <typename T>
+class InviteBase
+{
+ protected:
+       intrusive_list<Invitation, T> invites;
+
+ public:
+       void ClearInvites();
+
+       friend class Invitation;
+};
+
+class CoreExport Invitation : public intrusive_list_node<Invitation, Channel>, public intrusive_list_node<Invitation, LocalUser>
+{
+       Invitation(Channel* c, LocalUser* u, time_t timeout) : user(u), chan(c), expiry(timeout) {}
+
+ public:
+       LocalUser* const user;
+       Channel* const chan;
+       time_t expiry;
+
+       ~Invitation();
+       static void Create(Channel* c, LocalUser* u, time_t timeout);
+       static Invitation* Find(Channel* c, LocalUser* u, bool check_expired = true);
 };
 
-#endif
+typedef intrusive_list<Invitation, LocalUser> InviteList;
+
+template<typename T>
+inline void InviteBase<T>::ClearInvites()
+{
+       for (typename intrusive_list<Invitation, T>::iterator i = invites.begin(); i != invites.end(); )
+       {
+               Invitation* inv = *i;
+               ++i;
+               delete inv;
+       }
+}