]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_randquote.cpp
Annotations
[user/henk/code/inspircd.git] / src / modules / m_randquote.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *     
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 using namespace std;
18
19 #include "users.h"
20 #include "channels.h"
21 #include "modules.h"
22
23 #include "inspircd.h"
24
25
26 static FileReader *quotes = NULL;
27
28 std::string q_file = "";
29 std::string prefix = "";
30 std::string suffix = "";
31
32 /* $ModDesc: Provides random Quotes on Connect. */
33
34 class cmd_randquote : public command_t
35 {
36  public:
37  cmd_randquote (InspIRCd* Instance) : command_t(Instance,"RANDQUOTE", 0, 0)
38         {
39                 this->source = "m_randquote.so";
40         }
41
42         CmdResult Handle (const char** parameters, int pcntl, userrec *user)
43         {
44                 std::string str;
45                 int fsize;
46                 char buf[MAXBUF];
47                 if (q_file == "" || quotes->Exists())
48                 {
49                         fsize = quotes->FileSize();
50                         str = quotes->GetLine(rand() % fsize);
51                         sprintf(buf,"NOTICE %s :%s%s%s",user->nick,prefix.c_str(),str.c_str(),suffix.c_str());
52                         user->WriteServ(std::string(buf));
53                 }
54                 else
55                 {
56                         sprintf(buf, "NOTICE %s :Your administrator specified an invalid quotes file, please bug them about this.", user->nick);
57                         user->WriteServ(std::string(buf));
58                         return CMD_FAILURE;
59                 }
60                 return CMD_SUCCESS;
61         }
62 };
63
64 class RandquoteException : public ModuleException
65 {
66  private:
67         std::string err;
68  public:
69         RandquoteException(std::string message) : err(message) { }
70
71         virtual const char* GetReason()
72         {
73                 return (char*)err.c_str();
74         }
75 };
76
77 class ModuleRandQuote : public Module
78 {
79  private:
80         cmd_randquote* mycommand;
81         ConfigReader *conf;
82  public:
83         ModuleRandQuote(InspIRCd* Me)
84                 : Module::Module(Me)
85         {
86                 
87                 conf = new ConfigReader(ServerInstance);
88                 // Sort the Randomizer thingie..
89                 srand(time(NULL));
90
91                 q_file = conf->ReadValue("randquote","file",0);
92                 prefix = conf->ReadValue("randquote","prefix",0);
93                 suffix = conf->ReadValue("randquote","suffix",0);
94
95                 mycommand = NULL;
96
97                 if (q_file == "")
98                 {
99                         RandquoteException e("m_randquote: Quotefile not specified - Please check your config.");
100                         throw(e);
101                 }
102
103                 quotes = new FileReader(ServerInstance, q_file);
104                 if(!quotes->Exists())
105                 {
106                         RandquoteException e("m_randquote: QuoteFile not Found!! Please check your config - module will not function.");
107                         throw(e);
108                 }
109                 else
110                 {
111                         /* Hidden Command -- Mode clients assume /quote sends raw data to an IRCd >:D */
112                         mycommand = new cmd_randquote(ServerInstance);
113                         ServerInstance->AddCommand(mycommand);
114                 }
115         }
116
117         void Implements(char* List)
118         {
119                 List[I_OnUserConnect] = 1;
120         }
121         
122         virtual ~ModuleRandQuote()
123         {
124                 DELETE(conf);
125                 DELETE(quotes);
126         }
127         
128         virtual Version GetVersion()
129         {
130                 return Version(1,0,0,1,VF_VENDOR);
131         }
132         
133         virtual void OnUserConnect(userrec* user)
134         {
135                 if (mycommand)
136                         mycommand->Handle(NULL, 0, user);
137         }
138 };
139
140
141 class ModuleRandQuoteFactory : public ModuleFactory
142 {
143  public:
144         ModuleRandQuoteFactory()
145         {
146         }
147         
148         ~ModuleRandQuoteFactory()
149         {
150         }
151         
152         virtual Module * CreateModule(InspIRCd* Me)
153         {
154                 return new ModuleRandQuote(Me);
155         }
156         
157 };
158
159
160 extern "C" void * init_module( void )
161 {
162         return new ModuleRandQuoteFactory;
163 }