From 76c9595f249b4b807a44f359924fefc5a8ce9cb2 Mon Sep 17 00:00:00 2001 From: Daniel Schmitz Date: Mon, 21 Jun 2021 18:46:01 +0800 Subject: [PATCH] wip --- .gitignore | 1 + idlerpg.cpp | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 .gitignore create mode 100644 idlerpg.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1887cbf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +idlerpg.so diff --git a/idlerpg.cpp b/idlerpg.cpp new file mode 100644 index 0000000..7e0f133 --- /dev/null +++ b/idlerpg.cpp @@ -0,0 +1,184 @@ +#include +#include + +using std::map; +using std::set; +using std::vector; + +#define IDLERPG_JOIN_LOGIN_WAIT_TIME 10 + +class CIdleRPGMod; + +class CIdleRPGModTimer : public CTimer { + public: + CIdleRPGModTimer(CModule* pModule, unsigned int uInterval, + unsigned int uCycles, const CString& sLabel, + const CString& sDescription) + : CTimer(pModule, uInterval, uCycles, sLabel, sDescription) {} + + ~CIdleRPGModTimer() override {} + + protected: + void RunJob() override; +}; + +class CIdleRPGMod : public CModule { + void Set (const CString& sCommand) { + if (sCommand.Token(1).empty()) { + PutModule(t_s("Usage: <#channel> ")); + return; + } + + CString sChannel = sCommand.Token(1); + CString sBotnick = sCommand.Token(2); + CString sUsername = sCommand.Token(3); + CString sPassword = sCommand.Token(4); + + if (sChannel.empty()) { + PutModule("Channel not supplied"); + return; + } + if (sBotnick.empty()) { + PutModule("Botnick not supplied"); + return; + } + if (sUsername.empty()) { + PutModule("Username not supplied"); + return; + } + if (sPassword.empty()) { + PutModule("Password not supplied"); + return; + } + + m_channel = sChannel; + m_botnick = sBotnick; + m_username = sUsername; + m_password = sPassword; + Save(); + + PutModule(t_s("Settings saved!")); + } + + void Get (const CString& sCommand) { + if (m_channel.empty()) { + PutModule(t_s("No settings found.")); + return; + } + + PutModule(t_s("Current settings are as following:")); + PutModule(t_f("Channel: {1} - Botnick: {2} - Username: {3} - Password: {4}")(m_channel, m_botnick, m_username, m_password)); + } + + void Clear (const CString& sCommand) { + m_channel = ""; + m_botnick = ""; + m_username = ""; + m_password = ""; + Save(); + + PutModule(t_s("All settings cleared.")); + } + + void LoginCommand (const CString& sCommand) { + if (m_channel.empty()) { + PutModule(t_s("You need to configure this module first. Try: help set")); + return; + } + + QueueLogin(0); + } + + + public: + MODCONSTRUCTOR(CIdleRPGMod) { + AddHelpCommand(); + + AddCommand("Set", t_d("<#channel> "), t_d("Sets all the required information to function."), [=](const CString& sLine) { Set(sLine); }); + AddCommand("Get", "", t_d("Displays current saved settings"), [=](const CString& sLine) { Get(sLine); }); + AddCommand("Clear", "", t_d("Resets all settings"), [=](const CString& sLine) { Clear(sLine); }); + AddCommand("Login", "", t_d("Manually triggers login now"), [=](const CString& sLine) { LoginCommand(sLine); }); + } + + ~CIdleRPGMod() override {} + + bool OnLoad(const CString& sArgs, CString& sMessage) override { + m_channel = GetNV("channel"); + m_botnick = GetNV("botnick"); + m_username = GetNV("username"); + m_password = GetNV("password"); + + return true; + } + + void OnJoin(const CNick& Nick, CChan& Channel) override { + if (m_channel.empty()) { + return; + } + + if (Nick.GetNick() != m_botnick && !GetNetwork()->GetCurNick().Equals(Nick.GetNick())) { + return; + } + + QueueLogin(IDLERPG_JOIN_LOGIN_WAIT_TIME); + } + + void Login () { + // Valid channel? + CChan* pChan = this->GetNetwork()->FindChan(m_channel); + if (!pChan) { + PutModule(t_f("Error logging in: Invalid channel [{1}]")(m_channel)); + return; + } + + // Botnick on channel? + CNick* pBot = pChan->FindNick(m_botnick); + if (!pBot) { + PutModule(t_f("Error logging in: Bot [{1}] not found in channel [{2}]")(m_botnick, m_channel)); + return; + } + + // Bot has op? + if (!pBot->HasPerm(CChan::Op)) { + PutModule(t_f("Error logging in: Bot [{1}] not operator in in channel [{2}]")(m_botnick, m_channel)); + return; + } + + PutIRC("PRIVMSG " + m_botnick + " :login " + m_username + " " + m_password); + PutModule(t_s("Logging you in...")); + } + + private: + CString m_channel; + CString m_botnick; + CString m_username; + CString m_password; + + void QueueLogin(int seconds) { + if (m_channel.empty()) { + return; + } + + RemTimer("idlerpg_login_timer"); + AddTimer(new CIdleRPGModTimer(this, seconds, 1, "idlerpg_login_timer", "Tries login to IdleRPG bot")); + } + void Save() { + SetNV("channel", m_channel); + SetNV("botnick", m_botnick); + SetNV("username", m_username); + SetNV("password", m_password); + } +}; + +void CIdleRPGModTimer::RunJob() { ((CIdleRPGMod*)GetModule())->Login(); } + +template <> +void TModInfo(CModInfo& Info) { + Info.AddType(CModInfo::NetworkModule); + // Info.SetWikiPage("perform"); +} + +NETWORKMODULEDEFS( + CIdleRPGMod, + t_s("Automatically handles your login to IdleRPG games/channels.") +) \ No newline at end of file