summaryrefslogtreecommitdiff
path: root/include/protocol.h
blob: 4afb0bf59165cb86890330bdaa1edf62db543c8c (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
 * InspIRCd -- Internet Relay Chat Daemon
 *
 *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
 *   Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
 *
 * This file is part of InspIRCd.  InspIRCd 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, version 2.
 *
 * 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

#include "hashcomp.h"

class User;

typedef std::vector<std::string> parameterlist;

class ProtocolServer
{
 public:
	/** Send metadata related to this server to the target server
	 * @param key The 'key' of the data
	 * @param data The string representation of the data
	 */
	virtual void SendMetaData(const std::string& key, const std::string& data) = 0;
};

class CoreExport ProtocolInterface
{
 public:
	typedef ProtocolServer Server;

	class ServerInfo
	{
	 public:
		std::string servername;
		std::string parentname;
		std::string gecos;
		unsigned int usercount;
		unsigned int opercount;
		unsigned int latencyms;
	};

	typedef std::vector<ServerInfo> ServerList;

	virtual ~ProtocolInterface() { }

	/** Send an ENCAP message to one or more linked servers.
	 * See the protocol documentation for the purpose of ENCAP.
	 * @param encap This is a list of string parameters, the first of which must be a server ID or glob matching servernames.
	 * The second must be a subcommand. All subsequent parameters are dependant on the subcommand.
	 * ENCAP (should) be used instead of creating new protocol messages for easier third party application support.
	 * @return True if the message was sent out (target exists)
	 */
	virtual bool SendEncapsulatedData(const parameterlist &encap) { return false; }

	/** Send metadata for a channel to other linked servers.
	 * @param chan The channel to send metadata for
	 * @param key The 'key' of the data, e.g. "swhois" for swhois desc on a user
	 * @param data The string representation of the data
	 */
	virtual void SendMetaData(Channel* chan, const std::string& key, const std::string& data) { }

	/** Send metadata for a user to other linked servers.
	 * @param user The user to send metadata for
	 * @param key The 'key' of the data, e.g. "swhois" for swhois desc on a user
	 * @param data The string representation of the data
	 */
	virtual void SendMetaData(User* user, const std::string& key, const std::string& data) { }

	/** Send metadata related to the server to other linked servers.
	 * @param key The 'key' of the data
	 * @param data The string representation of the data
	 */
	virtual void SendMetaData(const std::string& key, const std::string& data) { }

	/** Send a topic change for a channel
	 * @param channel The channel to change the topic for.
	 * @param topic The new topic to use for the channel.
	 */
	virtual void SendTopic(Channel* channel, std::string &topic) { }

	/** Send mode changes for an object.
	 * @param source The source of the mode change
	 * @param usertarget The target user, NULL if the target is a channel
	 * @param chantarget The target channel, NULL if the target is a user
	 * @param modedata The mode changes to send.
	 * @param translate A list of translation types
	 */
	virtual void SendMode(User* source, User* usertarget, Channel* chantarget, const parameterlist& modedata, const std::vector<TranslateType>& translate) { }

	/** Send a notice to users with a given snomask.
	 * @param snomask The snomask required for the message to be sent.
	 * @param text The message to send.
	 */
	virtual void SendSNONotice(char snomask, const std::string& text) { }

	/** Send raw data to a remote client.
	 * @param target The user to push data to.
	 * @param rawline The raw IRC protocol line to deliver (":me NOTICE you :foo", whatever).
	 */
	virtual void PushToClient(User* target, const std::string &rawline) { }

	/** Send a message to a channel.
	 * @param target The channel to message.
	 * @param status The status character (e.g. %) required to recieve.
	 * @param text The message to send.
	 * @param type The message type (MSG_PRIVMSG or MSG_NOTICE)
	 */
	virtual void SendMessage(Channel* target, char status, const std::string& text, MessageType type = MSG_PRIVMSG) { }

	/** Send a message to a user.
	 * @param target The user to message.
	 * @param text The message to send.
	 * @param type The message type (MSG_PRIVMSG or MSG_NOTICE)
	 */
	virtual void SendMessage(User* target, const std::string& text, MessageType type = MSG_PRIVMSG) { }

	/** Send a notice to a channel.
	 * @param target The channel to message.
	 * @param status The status character (e.g. %) required to recieve.
	 * @param text The message to send.
	 */
	void SendChannelNotice(Channel* target, char status, const std::string &text)
	{
		SendMessage(target, status, text, MSG_NOTICE);
	}

	/** Send a notice to a user.
	 * @param target The user to message.
	 * @param text The message to send.
	 */
	void SendUserNotice(User* target, const std::string &text)
	{
		SendMessage(target, text, MSG_NOTICE);
	}

	/** Fill a list of servers and information about them.
	 * @param sl The list of servers to fill.
	 * XXX: document me properly, this is shit.
	 */
	virtual void GetServerList(ServerList& sl) { }
};