]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/rpcconfig/messages_methods.cpp
Merge branch 'master' into full-month-stats
[stg.git] / projects / stargazer / plugins / configuration / rpcconfig / messages_methods.cpp
1 #include <ostream> // xmlrpc-c devs have missed something :)
2
3 #include "stg/message.h"
4 #include "stg/common.h"
5 #include "utils.h"
6 #include "messages_methods.h"
7 #include "rpcconfig.h"
8
9 extern const volatile time_t stgTime;
10
11 //------------------------------------------------------------------------------
12
13 void METHOD_MESSAGE_SEND::execute(xmlrpc_c::paramList const & paramList,
14                                   xmlrpc_c::value *   const   retvalPtr)
15 {
16 std::string cookie = paramList.getString(0);
17 std::vector<xmlrpc_c::value> logins(paramList.getArray(1));
18 std::map<std::string, xmlrpc_c::value> msgInfo(paramList.getStruct(2));
19 paramList.verifyEnd(3);
20
21 ADMIN_INFO adminInfo;
22
23 if (config->GetAdminInfo(cookie, &adminInfo))
24     {
25     *retvalPtr = xmlrpc_c::value_boolean(false);
26     return;
27     }
28
29 STG_MSG message;
30
31 std::map<std::string, xmlrpc_c::value>::iterator it;
32
33 if ((it = msgInfo.find("version")) == msgInfo.end())
34     {
35     message.header.ver = 1; // Default value
36     }
37 else
38     {
39     message.header.ver = xmlrpc_c::value_int(it->second);
40     }
41
42 if ((it = msgInfo.find("type")) == msgInfo.end())
43     {
44     message.header.type = 1; // default value
45     }
46 else
47     {
48     message.header.type = xmlrpc_c::value_int(it->second);
49     }
50
51 if ((it = msgInfo.find("repeat")) == msgInfo.end())
52     {
53     *retvalPtr = xmlrpc_c::value_boolean(false);
54     return;
55     }
56 message.header.repeat = xmlrpc_c::value_int(it->second);
57
58 if ((it = msgInfo.find("repeat_period")) == msgInfo.end())
59     {
60     *retvalPtr = xmlrpc_c::value_boolean(false);
61     return;
62     }
63 message.header.repeatPeriod = xmlrpc_c::value_int(it->second);
64
65 if ((it = msgInfo.find("show_time")) == msgInfo.end())
66     {
67     *retvalPtr = xmlrpc_c::value_boolean(false);
68     return;
69     }
70 message.header.showTime = xmlrpc_c::value_int(it->second);
71
72 if ((it = msgInfo.find("text")) == msgInfo.end())
73     {
74     *retvalPtr = xmlrpc_c::value_boolean(false);
75     return;
76     }
77 message.text = IconvString(xmlrpc_c::value_string(it->second), "UTF-8", "CP1251");
78
79 message.header.creationTime = stgTime;
80 message.header.lastSendTime = 0;
81
82 std::vector<xmlrpc_c::value>::iterator lit;
83 for (lit = logins.begin(); lit != logins.end(); ++lit)
84     {
85     USER_PTR ui;
86     if (users->FindByName(xmlrpc_c::value_string(*lit), &ui))
87         {
88         printfd(__FILE__, "METHOD_MESSAGE_SEND::execute(): 'User '%s' not found'\n", std::string(xmlrpc_c::value_string(*lit)).c_str());
89         }
90     else
91         {
92         ui->AddMessage(&message);
93         }
94     }
95
96 *retvalPtr = xmlrpc_c::value_boolean(true);
97 }