]> git.stg.codes - stg.git/blobdiff - include/stg/user.h
Complete replacement notifiers with subscriptions.
[stg.git] / include / stg / user.h
index b08f3cd0629603dab00900fb22a3e3aa584f5b65..78b602ba25a679050a4978e78714be2a379380c3 100644 (file)
@@ -20,8 +20,8 @@
 
 #pragma once
 
-#include "notifer.h"
 #include "message.h"
+#include "user_property.h"
 
 #include <vector>
 #include <string>
@@ -37,77 +37,91 @@ class UserProperties;
 class DirTraff;
 struct Auth;
 
-using CURR_IP_NOTIFIER = PropertyNotifierBase<uint32_t>;
-using CONNECTED_NOTIFIER = PropertyNotifierBase<bool>;
+class User
+{
+    public:
+        User() noexcept
+            : m_connectedBase(false),
+              m_currIPBase(0),
+              m_connected(m_connectedBase),
+              m_currIP(m_currIPBase)
+        {
+        }
+
+        virtual ~User() = default;
 
-struct User {
-    virtual ~User() = default;
+        virtual int                 WriteConf() = 0;
+        virtual int                 WriteStat() = 0;
 
-    virtual int                 WriteConf() = 0;
-    virtual int                 WriteStat() = 0;
+        virtual const std::string&  GetLogin() const = 0;
 
-    virtual const std::string&  GetLogin() const = 0;
+        uint32_t                    GetCurrIP() const { return m_currIP; }
+        time_t                      GetCurrIPModificationTime() const { return m_currIP.ModificationTime(); }
 
-    virtual uint32_t            GetCurrIP() const = 0;
-    virtual time_t              GetCurrIPModificationTime() const = 0;
+        template <typename F>
+        auto                        beforeCurrIPChange(F&& f) { return m_currIP.beforeChange(std::forward<F>(f)); }
+        template <typename F>
+        auto                        afterCurrIPChange(F&& f) { return m_currIP.afterChange(std::forward<F>(f)); }
 
-    virtual void                AddCurrIPBeforeNotifier(CURR_IP_NOTIFIER* notifier) = 0;
-    virtual void                DelCurrIPBeforeNotifier(const CURR_IP_NOTIFIER* notifier) = 0;
+        template <typename F>
+        auto                        beforeConnectedChange(F&& f) { return m_connected.beforeChange(std::forward<F>(f)); }
+        template <typename F>
+        auto                        afterConnectedChange(F&& f) { return m_connected.afterChange(std::forward<F>(f)); }
 
-    virtual void                AddCurrIPAfterNotifier(CURR_IP_NOTIFIER* notifier) = 0;
-    virtual void                DelCurrIPAfterNotifier(const CURR_IP_NOTIFIER* notifier) = 0;
+        virtual int                 GetID() const = 0;
 
-    virtual void                AddConnectedBeforeNotifier(CONNECTED_NOTIFIER* notifier) = 0;
-    virtual void                DelConnectedBeforeNotifier(const CONNECTED_NOTIFIER* notifier) = 0;
+        virtual double              GetPassiveTimePart() const = 0;
 
-    virtual void                AddConnectedAfterNotifier(CONNECTED_NOTIFIER* notifier) = 0;
-    virtual void                DelConnectedAfterNotifier(const CONNECTED_NOTIFIER* notifier) = 0;
+        virtual const Tariff*       GetTariff() const = 0;
+        virtual void                ResetNextTariff() = 0;
 
-    virtual int                 GetID() const = 0;
+        virtual const DirTraff&     GetSessionUpload() const = 0;
+        virtual const DirTraff&     GetSessionDownload() const = 0;
+        virtual time_t              GetSessionUploadModificationTime() const = 0;
+        virtual time_t              GetSessionDownloadModificationTime() const = 0;
 
-    virtual double              GetPassiveTimePart() const = 0;
+        bool                        GetConnected() const { return m_connected; }
+        time_t                      GetConnectedModificationTime() const { return m_connected.ModificationTime(); }
 
-    virtual const Tariff*       GetTariff() const = 0;
-    virtual void                ResetNextTariff() = 0;
+        virtual const std::string&  GetLastDisconnectReason() const = 0;
+        virtual int                 GetAuthorized() const = 0;
+        virtual time_t              GetAuthorizedModificationTime() const = 0;
 
-    virtual const DirTraff&     GetSessionUpload() const = 0;
-    virtual const DirTraff&     GetSessionDownload() const = 0;
-    virtual time_t              GetSessionUploadModificationTime() const = 0;
-    virtual time_t              GetSessionDownloadModificationTime() const = 0;
+        virtual bool                IsAuthorizedBy(const Auth * auth) const = 0;
+        virtual std::vector<std::string> GetAuthorizers() const = 0;
 
-    virtual bool                GetConnected() const = 0;
-    virtual time_t              GetConnectedModificationTime() const = 0;
-    virtual const std::string&  GetLastDisconnectReason() const = 0;
-    virtual int                 GetAuthorized() const = 0;
-    virtual time_t              GetAuthorizedModificationTime() const = 0;
+        virtual int                 AddMessage(Message* msg) = 0;
 
-    virtual bool                IsAuthorizedBy(const Auth * auth) const = 0;
-    virtual std::vector<std::string> GetAuthorizers() const = 0;
+        virtual void                UpdatePingTime(time_t t = 0) = 0;
+        virtual time_t              GetPingTime() const = 0;
 
-    virtual int                 AddMessage(Message* msg) = 0;
+        virtual void                Run() = 0;
 
-    virtual void                UpdatePingTime(time_t t = 0) = 0;
-    virtual time_t              GetPingTime() const = 0;
+        virtual const std::string&  GetStrError() const = 0;
 
-    virtual void                Run() = 0;
+        virtual UserProperties&     GetProperties() = 0;
+        virtual const UserProperties& GetProperties() const = 0;
 
-    virtual const std::string&  GetStrError() const = 0;
+        virtual bool                GetDeleted() const = 0;
+        virtual void                SetDeleted() = 0;
 
-    virtual UserProperties&     GetProperties() = 0;
-    virtual const UserProperties& GetProperties() const = 0;
+        virtual time_t              GetLastWriteStatTime() const = 0;
 
-    virtual bool                GetDeleted() const = 0;
-    virtual void                SetDeleted() = 0;
+        virtual bool                IsInetable() = 0;
+        virtual std::string         GetEnabledDirs() const = 0;
 
-    virtual time_t              GetLastWriteStatTime() const = 0;
+        virtual void                OnAdd() = 0;
+        virtual void                OnDelete() = 0;
 
-    virtual bool                IsInetable() = 0;
-    virtual std::string         GetEnabledDirs() const = 0;
+        virtual std::string GetParamValue(const std::string& name) const = 0;
 
-    virtual void                OnAdd() = 0;
-    virtual void                OnDelete() = 0;
+    private:
+        bool m_connectedBase;
+        uint32_t m_currIPBase;
 
-    virtual std::string GetParamValue(const std::string& name) const = 0;
+    protected:
+        UserProperty<bool> m_connected;
+        UserProperty<uint32_t> m_currIP;
 };
 
 }