* ---------------------------------------------------
*/
-#include "inspircd_config.h"
-#include "channels.h"
-#include "inspstring.h"
-#include "connection.h"
+#ifndef __USERS_H__
+#define __USERS_H__
+
#include <string>
+
#ifdef THREADED_DNS
#include <pthread.h>
#endif
-
-#ifndef __USERS_H__
-#define __USERS_H__
+#include "inspircd_config.h"
+#include "socket.h"
+#include "channels.h"
+#include "inspstring.h"
+#include "connection.h"
#include "hashcomp.h"
#include "cull_list.h"
-
-#define STATUS_OP 4
-#define STATUS_HOP 2
-#define STATUS_VOICE 1
-#define STATUS_NORMAL 0
-#define CC_ALLOW 0
-#define CC_DENY 1
+enum ChanStatus {
+ STATUS_OP = 4,
+ STATUS_HOP = 2,
+ STATUS_VOICE = 1,
+ STATUS_NORMAL = 0
+};
+
+enum ClassTypes {
+ CC_ALLOW = 0,
+ CC_DENY = 1
+};
-template<typename T> inline string ConvToStr(const T &in);
+/** RFC1459 channel modes
+ * */
+enum UserModes {
+ UM_SERVERNOTICE = 's'-65,
+ UM_WALLOPS = 'w'-65,
+ UM_INVISIBLE = 'i'-65,
+ UM_OPERATOR = 'o'-65,
+};
/** Holds a channel name to which a user has been invited.
*/
*/
typedef std::vector<ConnectClass> ClassVector;
+/** Typedef for the list of user-channel records for a user
+ */
+typedef std::vector<ucrec*> UserChanList;
+
/** Holds all information about a user
* This class stores all information about a user connected to the irc server. Everything about a
* connection is stored here primarily, from the user's socket ID (file descriptor) through to the
/** The host displayed to non-opers (used for cloaking etc).
* This usually matches the value of userrec::host.
*/
- char dhost[64];
+ char dhost[65];
/** The users full name.
*/
char fullname[MAXGECOS+1];
- /** The user's mode string.
- * This may contain any of the following RFC characters: o, w, s, i
- * Your module may define other mode characters as it sees fit.
- * it is limited to length 54, as there can only be a maximum of 52
- * user modes (26 upper, 26 lower case) a null terminating char, and
- * an optional + character.
- */
- char modes[54];
-
- std::vector<ucrec> chans;
+ /** The user's mode list.
+ * This is NOT a null terminated string! In the 1.1 version of InspIRCd
+ * this is an array of values in a similar way to channel modes.
+ * A value of 1 in field (modeletter-65) indicates that the mode is
+ * set, for example, to work out if mode +s is set, we check the field
+ * userrec::modes['s'-65] != 0.
+ * The following RFC characters o, w, s, i have constants defined via an
+ * enum, such as UM_SERVERNOTICE and UM_OPETATOR.
+ */
+ char modes[64];
+
+ /** What snomasks are set on this user.
+ * This functions the same as the above modes.
+ */
+ char snomasks[64];
+
+ UserChanList chans;
/** The server the user is connected to.
*/
- char* server;
+ const char* server;
/** The user's away message.
* If this string is empty, the user is not marked as away.
*/
long recvqmax;
+ /** Default constructor
+ */
userrec();
/** Returns the full displayed host of the user
* e.g. through a module, then this method will ignore it and return the true hostname.
*/
virtual char* GetFullRealHost();
+
+ /*
+ * Create a displayable mode string for this users umodes
+ */
+ const char* FormatNoticeMasks();
+
+ bool userrec::ProcessNoticeMasks(const char *sm);
+
+ bool IsNoticeMaskSet(unsigned char sm);
+
+ void SetNoticeMask(unsigned char sm, bool value);
+
+ /*
+ * Create a displayable mode string for this users umodes
+ */
+ const char* FormatModes();
+
+ bool IsModeSet(unsigned char m);
+
+ void SetMode(unsigned char m, bool value);
/** Returns true if a user is invited to a channel.
*/
* This is done by looking up their oper type from userrec::oper, then referencing
* this to their oper classes and checking the commands they can execute.
*/
- bool HasPermission(std::string &command);
+ bool HasPermission(const std::string &command);
/** Calls read() to read some data for this user using their fd.
*/
* RFC-specified limit per line) then the method will return false and the
* text will not be inserted.
*/
- bool AddBuffer(std::string a);
+ bool AddBuffer(const std::string &a);
/** This method returns true if the buffer contains at least one carriage return
* character (e.g. one complete line may be read)
* The WriteErrors of clients are checked at a more ideal time (in the mainloop) and
* errored clients purged.
*/
- void SetWriteError(std::string error);
+ void SetWriteError(const std::string &error);
/** Returns the write error which last occured on this connection or an empty string
* if none occured.
*/
- std::string GetWriteError();
+ const char* GetWriteError();
/** Adds to the user's write buffer.
* You may add any amount of text up to this users sendq value, if you exceed the
* sendq value, SetWriteError() will be called to set the users error string to
* "SendQ exceeded", and further buffer adds will be dropped.
*/
- void AddWriteBuf(std::string data);
+ void AddWriteBuf(const std::string &data);
/** Flushes as much of the user's buffer to the file descriptor as possible.
* This function may not always flush the entire buffer, rather instead as much of it
*/
InvitedList* GetInviteList();
- void MakeHost(char* nhost);
-
+ /** Creates a wildcard host.
+ * Takes a buffer to use and fills the given buffer with the host in the format *!*@hostname
+ */
char* MakeWildHost();
+ /** Creates a host.
+ * Takes a buffer to use and fills the given buffer with the host in the format nick!user@host
+ */
+ void MakeHost(char* nhost);
+
/** Shuts down and closes the user's socket
*/
void CloseSocket();
+ /** Default destructor
+ */
virtual ~userrec();
#ifdef THREADED_DNS
+ /** Thread used for threaded lookups
+ */
pthread_t dnsthread;
#endif
};
-/** A lightweight userrec used by WHOWAS
+/** Used to hold WHOWAS information
*/
-class WhoWasUser
+class WhoWasGroup : public classbase
{
public:
- char nick[NICKMAX];
- char ident[IDENTMAX+1];
- char dhost[64];
- char host[64];
- char fullname[MAXGECOS+1];
- char server[256];
+ char* host;
+ char* dhost;
+ char* ident;
+ const char* server;
+ char* gecos;
time_t signon;
+
+ WhoWasGroup(userrec* user);
+ ~WhoWasGroup();
};
+typedef std::deque<WhoWasGroup*> whowas_set;
+typedef std::map<irc::string,whowas_set*> whowas_users;
+
void AddOper(userrec* user);
void DeleteOper(userrec* user);
void kill_link(userrec *user,const char* r);
void kill_link_silent(userrec *user,const char* r);
void AddWhoWas(userrec* u);
+void MaintainWhoWas(time_t TIME);
void AddClient(int socket, int port, bool iscached, in_addr ip4);
void FullConnectUser(userrec* user, CullList* Goners);
userrec* ReHashNick(char* Old, char* New);
void force_nickchange(userrec* user,const char* newnick);
+/* Configuration callbacks */
+bool InitTypes(const char* tag);
+bool InitClasses(const char* tag);
+bool DoType(const char* tag, char** entries, void** values, int* types);
+bool DoClass(const char* tag, char** entries, void** values, int* types);
+bool DoneClassesAndTypes(const char* tag);
+
+long FindMatchingGlobal(userrec* user);
+long FindMatchingLocal(userrec* user);
+
#endif