1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
#include "main.h"
#include "User.h"
#include "Nick.h"
#include "Modules.h"
#include "Chan.h"
class CChanAttach : public CModule {
public:
MODCONSTRUCTOR(CChanAttach) {}
virtual ~CChanAttach() {
}
virtual bool OnLoad(const CString& sArgs) {
unsigned int a = 0;
CString sChan = sArgs.Token(a++);
while (!sChan.empty()) {
if (!Add(sChan)) {
PutModule("Unable to add [" + sChan + "]");
}
sChan = sArgs.Token(a++);
}
return true;
}
void TryAttach(CChan& Channel) {
const CString& sChan = Channel.GetName();
if (Channel.IsDetached() && IsAutoAttach(sChan)) {
Channel.JoinUser();
}
}
virtual EModRet OnChanNotice(CNick& Nick, CChan& Channel, CString& sMessage) {
TryAttach(Channel);
return CONTINUE;
}
virtual EModRet OnChanMsg(CNick& Nick, CChan& Channel, CString& sMessage) {
TryAttach(Channel);
return CONTINUE;
}
virtual void OnModCommand(const CString& sLine) {
CString sCommand = sLine.Token(0);
if (sCommand.CaseCmp("ADD") == 0) {
CString sChan = sLine.Token(1);
if (Add(sChan)) {
PutModule("Added " + sChan + " to list");
} else {
PutModule("Usage: Add [!]<#chan>");
}
} else if (sCommand.CaseCmp("LIST") == 0) {
CTable Table;
Table.AddColumn("Chan");
for (unsigned int a = 0; a < m_vsChans.size(); a++) {
Table.AddRow();
Table.SetCell("Chan", m_vsChans[a]);
}
for (unsigned int b = 0; b < m_vsNegChans.size(); b++) {
Table.AddRow();
Table.SetCell("Chan", "!" + m_vsNegChans[b]);
}
if (Table.size()) {
unsigned int uTableIdx = 0;
CString sLine;
while (Table.GetLine(uTableIdx++, sLine)) {
PutModule(sLine);
}
} else {
PutModule("You have no entries.");
}
} else if (sCommand.CaseCmp("HELP") == 0) {
CTable Table;
Table.AddColumn("Command");
Table.AddColumn("Description");
Table.AddRow();
Table.SetCell("Command", "Add");
Table.SetCell("Description", "Add an entry, use !#chan to negate and * for wildcards");
Table.AddRow();
Table.SetCell("Command", "List");
Table.SetCell("Description", "List all entries");
if (Table.size()) {
unsigned int uTableIdx = 0;
CString sLine;
while (Table.GetLine(uTableIdx++, sLine)) {
PutModule(sLine);
}
} else {
PutModule("You have no entries.");
}
}
}
bool Add(const CString& sChan) {
if (sChan.empty() || sChan == "!") {
return false;
}
if (sChan.Left(1) == "!") {
m_vsNegChans.push_back(sChan.substr(1));
} else {
m_vsChans.push_back(sChan);
}
return true;
}
bool IsAutoAttach(const CString& sChan) {
for (unsigned int a = 0; a < m_vsNegChans.size(); a++) {
if (sChan.WildCmp(m_vsNegChans[a])) {
return false;
}
}
for (unsigned int b = 0; b < m_vsChans.size(); b++) {
if (sChan.WildCmp(m_vsChans[b])) {
return true;
}
}
return false;
}
private:
vector<CString> m_vsChans;
vector<CString> m_vsNegChans;
};
MODULEDEFS(CChanAttach, "Reattaches you to channels on activity.")
|