summaryrefslogtreecommitdiff
path: root/protocols/MinecraftDynmap/src/proto.h
blob: 852edaef74f2d068ed3135d167a8b6fbdd5a7940 (plain)
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-23 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;
};