]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/other/ping/ping.h
Update README.
[stg.git] / projects / stargazer / plugins / other / ping / ping.h
index 9986be39ff75f493a70d166c3639ce9986c93af0..b52a5e1cd180825e655ad0b3c1e08e1ad0d10247 100644 (file)
 
 #include "stg/plugin.h"
 #include "stg/module_settings.h"
-#include "stg/notifer.h"
+#include "stg/subscriptions.h"
 #include "stg/user_ips.h"
 #include "stg/pinger.h"
 #include "stg/users.h"
 #include "stg/logger.h"
 
 #include <string>
+#include <vector>
+#include <tuple>
 #include <list>
+#include <mutex>
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshadow"
+#include <jthread.hpp>
+#pragma GCC diagnostic pop
 #include <cstdint>
 
-#include <pthread.h>
-
-class PING;
-
 namespace STG
 {
 struct USER;
 struct SETTINGS;
-}
 
-using UserPtr = STG::User*;
-//-----------------------------------------------------------------------------*/
-class CHG_CURRIP_NOTIFIER_PING: public STG::PropertyNotifierBase<uint32_t> {
-public:
-    CHG_CURRIP_NOTIFIER_PING(const PING & p, UserPtr u)
-        : user(u), ping(p) {}
-    void Notify(const uint32_t & oldIP, const uint32_t & newIP);
-    UserPtr GetUser() const { return user; }
-
-private:
-    CHG_CURRIP_NOTIFIER_PING & operator=(const CHG_CURRIP_NOTIFIER_PING &);
-
-    UserPtr user;
-    const PING & ping;
-};
+using UserPtr = User*;
 //-----------------------------------------------------------------------------
-class CHG_IPS_NOTIFIER_PING: public STG::PropertyNotifierBase<STG::UserIPs> {
-public:
-    CHG_IPS_NOTIFIER_PING(const PING & p, UserPtr u)
-        : user(u), ping(p) {}
-    void Notify(const STG::UserIPs & oldIPS, const STG::UserIPs & newIPS);
-    UserPtr GetUser() const { return user; }
-
-private:
-    CHG_IPS_NOTIFIER_PING & operator=(const CHG_IPS_NOTIFIER_PING &);
-
-    UserPtr user;
-    const PING & ping;
+class PING_SETTINGS
+{
+    public:
+        PING_SETTINGS() : pingDelay(0) {}
+        const std::string & GetStrError() const { return errorStr; }
+        int ParseSettings(const ModuleSettings & s);
+        int GetPingDelay() const { return pingDelay; }
+    private:
+        int pingDelay;
+        std::string errorStr;
 };
 //-----------------------------------------------------------------------------
-class ADD_USER_NONIFIER_PING: public STG::NotifierBase<UserPtr> {
-public:
-    explicit ADD_USER_NONIFIER_PING(PING & p) : ping(p) {}
-    void Notify(const UserPtr & user);
+class PING : public Plugin
+{
+    public:
+        PING();
 
-private:
-    ADD_USER_NONIFIER_PING(const ADD_USER_NONIFIER_PING &);
-    ADD_USER_NONIFIER_PING & operator=(const ADD_USER_NONIFIER_PING &);
+        void SetUsers(Users * u) override { users = u; }
+        void SetSettings(const ModuleSettings & s) override { settings = s; }
+        int ParseSettings() override;
 
-    PING & ping;
-};
-//-----------------------------------------------------------------------------
-class DEL_USER_NONIFIER_PING: public STG::NotifierBase<UserPtr> {
-public:
-    explicit DEL_USER_NONIFIER_PING(PING & p) : ping(p) {}
-    void Notify(const UserPtr & user);
+        int Start() override;
+        int Stop() override;
+        int Reload(const ModuleSettings & /*ms*/) override { return 0; }
+        bool IsRunning() override;
 
-private:
-    DEL_USER_NONIFIER_PING(const DEL_USER_NONIFIER_PING &);
-    DEL_USER_NONIFIER_PING & operator=(const DEL_USER_NONIFIER_PING &);
+        const std::string & GetStrError() const override { return errorStr; }
+        std::string GetVersion() const override { return "Pinger v.1.01"; }
+        uint16_t GetStartPosition() const override { return 10; }
+        uint16_t GetStopPosition() const override { return 10; }
 
-    PING & ping;
-};
-//-----------------------------------------------------------------------------
-class PING_SETTINGS {
-public:
-    PING_SETTINGS() : pingDelay(0) {}
-    const std::string & GetStrError() const { return errorStr; }
-    int ParseSettings(const STG::ModuleSettings & s);
-    int GetPingDelay() const { return pingDelay; }
-private:
-    int pingDelay;
-    mutable std::string errorStr;
-};
-//-----------------------------------------------------------------------------
-class PING : public STG::Plugin {
-friend class CHG_CURRIP_NOTIFIER_PING;
-friend class CHG_IPS_NOTIFIER_PING;
-public:
-    PING();
-    ~PING() override;
-
-    void SetUsers(STG::Users * u) override { users = u; }
-    void SetSettings(const STG::ModuleSettings & s) override { settings = s; }
-    int ParseSettings() override;
-
-    int Start() override;
-    int Stop() override;
-    int Reload(const STG::ModuleSettings & /*ms*/) override { return 0; }
-    bool IsRunning() override;
-
-    const std::string & GetStrError() const override { return errorStr; }
-    std::string GetVersion() const override { return "Pinger v.1.01"; }
-    uint16_t GetStartPosition() const override { return 10; }
-    uint16_t GetStopPosition() const override { return 10; }
-
-    void AddUser(UserPtr u);
-    void DelUser(UserPtr u);
-
-private:
-    explicit PING(const PING & rvalue);
-    PING & operator=(const PING & rvalue);
-
-    void GetUsers();
-    void SetUserNotifiers(UserPtr u);
-    void UnSetUserNotifiers(UserPtr u);
-    static void * Run(void * d);
-
-    mutable std::string errorStr;
-    PING_SETTINGS pingSettings;
-    STG::ModuleSettings settings;
-    STG::Users * users;
-    std::list<UserPtr> usersList;
-
-    pthread_t thread;
-    pthread_mutex_t mutex;
-    bool nonstop;
-    bool isRunning;
-    mutable STG_PINGER pinger;
-
-    std::list<CHG_CURRIP_NOTIFIER_PING> ChgCurrIPNotifierList;
-    std::list<CHG_IPS_NOTIFIER_PING> ChgIPNotifierList;
-
-    ADD_USER_NONIFIER_PING onAddUserNotifier;
-    DEL_USER_NONIFIER_PING onDelUserNotifier;
-
-    STG::PluginLogger logger;
+        void AddUser(UserPtr u);
+        void DelUser(UserPtr u);
+
+    private:
+        explicit PING(const PING & rvalue);
+        PING & operator=(const PING & rvalue);
+
+        void GetUsers();
+        void SetUserNotifiers(UserPtr u);
+        void UnSetUserNotifiers(UserPtr u);
+        void Run(std::stop_token token);
+
+        std::string errorStr;
+        PING_SETTINGS pingSettings;
+        ModuleSettings settings;
+        Users * users;
+        std::list<UserPtr> usersList;
+
+        std::jthread m_thread;
+        std::mutex m_mutex;
+        bool isRunning;
+        STG_PINGER m_pinger;
+
+        void updateCurrIP(uint32_t oldVal, uint32_t newVal);
+        void updateIPs(const UserIPs& oldVal, const UserIPs& newVal);
+
+        ScopedConnection m_onAddUserConn;
+        ScopedConnection m_onDelUserConn;
+
+        using ConnHolder = std::tuple<int, ScopedConnection, ScopedConnection>;
+        std::vector<ConnHolder> m_conns;
+
+        PluginLogger logger;
 };
+
+}