about summary refs log tree commit diff
path: root/ircd.h
diff options
context:
space:
mode:
authorNakidai <nakidai@disroot.org>2026-01-06 04:01:24 +0300
committerNakidai <nakidai@disroot.org>2026-01-06 04:01:24 +0300
commit833c53b1ad3338677056445c32c490cac0a08875 (patch)
tree24e60715c46ff89c26c5efc254e036b84aebcb13 /ircd.h
parent78426afe18d9ce730a4d92033ca261f9b2f173a0 (diff)
downloadlibreircd-833c53b1ad3338677056445c32c490cac0a08875.tar.gz
libreircd-833c53b1ad3338677056445c32c490cac0a08875.zip
Add basic channels
Though they don't have modes, and JOIN/PART must be able to parse
comma separated list of channels
Diffstat (limited to 'ircd.h')
-rw-r--r--ircd.h32
1 files changed, 24 insertions, 8 deletions
diff --git a/ircd.h b/ircd.h
index 5e787da..8097c26 100644
--- a/ircd.h
+++ b/ircd.h
@@ -21,11 +21,16 @@
 
 
 #define PARAM_MAX 15
-#define PEERS_MAX 512
+
 #define MESSAGE_MAX 512
+#define PEERS_MAX 512
+#define CHANNELS_MAX 512
+#define USERS_PER_CHANNEL 512
+#define MODES_MAX 512
 
 #define BIT(x) x##_BIT, x = 1 << x##_BIT, x##_BIT_ = x##_BIT
 #define lengthof(X) (sizeof(X) / sizeof(*(X)))
+#define ensure(cond, iffalse, doexit) if (!(cond)) { iffalse; if (doexit >= 0) return doexit; }
 
 struct Message
 {
@@ -35,13 +40,16 @@ struct Message
 struct Peer
 {
 	int fd;
-	enum ClientType { UNREGED, CLIENT, SERVER, SERVICE } type;
+	enum ClientType { UNREGD, CLIENT, SERVER, SERVICE } type;
 	char nick[16], user[16], real[32], host[64];
-	char **channels;
-	size_t channels_count;
-	char modes[52];
+	struct Channel *channels[32];
+	enum PeerStatus {
+		BIT(DELETE),
+		BIT(ANNOUNCE),
+	} flags;
 	char buf[MESSAGE_MAX];
-	size_t recvd;
+	size_t recvd, channels_c;
+	char modes[52];
 };
 
 struct Channel
@@ -51,13 +59,16 @@ struct Channel
 	struct {
 		char mode;
 		char param[MESSAGE_MAX - 1];
-	} *modes;
-	size_t modes_count;
+	} modes[MODES_MAX];
+	struct Peer *users[USERS_PER_CHANNEL];
+	size_t modes_c, users_c;
 };
 
 typedef int Handler(struct Message *msg, struct Peer *peer);
 
+extern struct Channel channels[CHANNELS_MAX];
 extern struct Peer peers[PEERS_MAX];
+extern size_t channels_c, peers_c;
 extern const char *hostname;
 extern const char *host;
 extern int port;
@@ -65,10 +76,15 @@ extern int port;
 const char *getnick(const struct Peer *peer);
 void user_reg(struct Peer *peer, const char *nick, const char *user, const char *real);
 
+int channel_join(struct Channel *channel, struct Peer *peer);
+int channel_exit(struct Channel *channel, struct Peer *peer);
+
 int parse_message(char *buf, struct Message *msg);
 int handle(struct Peer *peer);
+int reply(const struct Peer *peer, int number, ...);
 Handler *find(const char *command);
 int writef(int fd, const char *fmt, ...);
+int writechanf(const struct Peer *except, const struct Channel *channel, const char *fmt, ...);
 void ircd(void);
 
 #endif /* __IRCD_H__ */