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