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
|
/*
Minecraft Dynmap plugin for Miranda Instant Messenger
_____________________________________________
Copyright © 2015-17 Robert Pösel, 2017-21 Miranda NG team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
class MinecraftDynmapProto : public PROTO<MinecraftDynmapProto>
{
ptrA szRoomName;
public:
MinecraftDynmapProto(const char *proto_name, const wchar_t *username);
~MinecraftDynmapProto();
inline const char* ModuleName() const {
return m_szModuleName;
}
inline bool isOnline() {
return (m_iStatus != ID_STATUS_OFFLINE && m_iStatus != ID_STATUS_CONNECTING);
}
inline bool isOffline() {
return (m_iStatus == ID_STATUS_OFFLINE);
}
// PROTO_INTERFACE
INT_PTR GetCaps(int type, MCONTACT hContact = NULL) override;
int SetStatus(int iNewStatus) override;
void OnContactDeleted(MCONTACT) override;
void OnShutdown() override;
// Services
INT_PTR __cdecl SvcCreateAccMgrUI(WPARAM, LPARAM);
// Chat handling
int __cdecl OnChatEvent(WPARAM,LPARAM);
INT_PTR __cdecl OnJoinChat(WPARAM,LPARAM);
INT_PTR __cdecl OnLeaveChat(WPARAM,LPARAM);
// Loops
void __cdecl EventsLoop(void*);
// Worker threads
void __cdecl SignOnWorker(void*);
void __cdecl SignOffWorker(void*);
void __cdecl SendMsgWorker(void*);
// Chat handling
void UpdateChat(const char *name, const char *message, const time_t timestamp = time(0), bool addtochat = true);
void AddChatContact(const char *nick);
void DeleteChatContact(const char *name);
void SetChatStatus(int);
void ClearChat();
void SetTopic(const char *topic);
MCONTACT GetChatHandle();
// Locks
HANDLE signon_lock_;
HANDLE connection_lock_;
HANDLE send_message_lock_;
HANDLE events_loop_lock_;
HANDLE events_loop_event_;
// Handles
HNETLIBCONN hConnection;
HNETLIBCONN hEventsConnection;
HANDLE chatHandle_;
// Data storage
void store_headers(http::response *resp, NETLIBHTTPHEADER *headers, int headers_count);
std::string get_server(bool not_last = false);
std::string get_language();
// Connection handling
unsigned int error_count_;
// Helpers
bool handleEntry(const std::string &method);
bool handleSuccess(const std::string &method);
bool handleError(const std::string &method, const std::string &error = "", bool force_disconnect = false);
void __inline increment_error() { error_count_++; }
void __inline decrement_error() { if (error_count_ > 0) error_count_--; }
void __inline reset_error() { error_count_ = 0; }
// HTTP communication
http::response sendRequest(const int request_type, std::string *post_data = nullptr, std::string *get_data = nullptr);
std::string chooseAction(int, std::string *get_data = nullptr);
NETLIBHTTPHEADER *get_request_headers(int request_type, int *headers_count);
// Requests and processing
bool doSignOn();
bool doEvents();
bool doSendMessage(const std::string &message_text);
std::string doGetPage(int);
// Configuration
std::string m_nick;
std::string m_cookie;
std::string m_server;
std::string m_title;
std::string m_timestamp;
int m_interval;
int m_updateRate;
};
struct CMPlugin : public ACCPROTOPLUGIN<MinecraftDynmapProto>
{
CMPlugin();
int Load() override;
int Unload() override;
};
|