summaryrefslogtreecommitdiff
path: root/include/cull_list.h
blob: 8901c5ea4248be3f33bb013f34248e2c924c2bf1 (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
/*       +------------------------------------+
 *       | Inspire Internet Relay Chat Daemon |
 *       +------------------------------------+
 *
 *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
 * See: http://www.inspircd.org/wiki/index.php/Credits
 *
 * This program is free but copyrighted software; see
 *            the file COPYING for details.
 *
 * ---------------------------------------------------
 */

#ifndef __CULLLIST_H__
#define __CULLLIST_H__

// include the common header files

#include <string>
#include <deque>
#include <vector>
#include "users.h"
#include "channels.h"

class InspIRCd;

/** The CullItem class holds a user and their quitmessage,
 * and is used internally by the CullList class to compile
 * a list of users which are to be culled when a long
 * operation (such as a netsplit) has completed.
 */
class CoreExport CullItem : public classbase
{
 private:
	/** Holds a pointer to the user,
	* must be valid and can be a local or remote user.
	*/
	userrec* user;
	/** Holds the quit reason to use for this user.
	*/
	std::string reason;
	/** Holds the quit reason opers see, if different from users
	 */
	std::string oper_reason;
	/** Silent items dont generate an snotice.
	 */
	bool silent;
 public:
	/** Constrcutor.
	* Initializes the CullItem with a user pointer
	* and their quit reason
	* @param u The user to add
	* @param r The quit reason of the added user
	*/
	CullItem(userrec* u, std::string &r, const char* ro = "");
	CullItem(userrec* u, const char* r, const char* ro = "");

	void MakeSilent();
	bool IsSilent();

	~CullItem();

	/** Returns a pointer to the user
	*/
	userrec* GetUser();
	/** Returns the user's quit reason
	*/
	std::string& GetReason();
	/** Returns oper reason
	 */
	std::string& GetOperReason();
};

/** The CullList class can be used by modules, and is used
 * by the core, to compile large lists of users in preperation
 * to quitting them all at once. This is faster than quitting
 * them within the loop, as the loops become tighter with
 * little or no comparisons within them. The CullList class
 * operates by allowing the programmer to push users onto
 * the list, each with a seperate quit reason, and then, once
 * the list is complete, call a method to flush the list,
 * quitting all the users upon it. A CullList may hold local
 * or remote users, but it may only hold each user once. If
 * you attempt to add the same user twice, then the second
 * attempt will be ignored.
 */
class CoreExport CullList : public classbase
{
 private:
	/** Creator of this CullList
	*/
	InspIRCd* ServerInstance;

	/** Holds a list of users already added for quick lookup
	 */
	std::map<userrec*, userrec*> exempt;

	/** Holds a list of users being quit.
	* See the information for CullItem for
	* more information.
	*/
	std::vector<CullItem> list;

 public:
	/** Constructor.
	* Clears the CullList::list and CullList::exempt
	* items.
	* @param Instance Creator of this CullList object
	*/
	CullList(InspIRCd* Instance);

	/** Adds a user to the cull list for later
	* removal via QUIT.
	* @param user The user to add
	* @param reason The quit reason of the user being added
	*/
	void AddItem(userrec* user, std::string &reason, const  char* o_reason = "");
	void AddItem(userrec* user, const char* reason, const char* o_reason = "");

	/* Turn an item into a silent item
	 */
	void MakeSilent(userrec* user);

	/** Applies the cull list, quitting all the users
	* on the list with their quit reasons all at once.
	* This is a very fast operation compared to
	* iterating the user list and comparing each one,
	* especially if there are multiple comparisons
	* to be done, or recursion.
	* @returns The number of users removed from IRC.
	*/
	int Apply();
};

#endif