kike: implement CAP invite-notify
This commit is contained in:
		
							
								
								
									
										22
									
								
								kike.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								kike.c
									
									
									
									
									
								
							@@ -296,6 +296,7 @@ enum
 | 
				
			|||||||
enum
 | 
					enum
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	IRC_CAP_MULTI_PREFIX             = (1 << 0),
 | 
						IRC_CAP_MULTI_PREFIX             = (1 << 0),
 | 
				
			||||||
 | 
						IRC_CAP_INVITE_NOTIFY            = (1 << 1)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct client
 | 
					struct client
 | 
				
			||||||
@@ -1144,7 +1145,7 @@ irc_handle_cap_ls (struct client *c, struct irc_cap_args *a)
 | 
				
			|||||||
			a->subcommand, "Ignoring invalid protocol version number");
 | 
								a->subcommand, "Ignoring invalid protocol version number");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c->cap_negotiating = true;
 | 
						c->cap_negotiating = true;
 | 
				
			||||||
	client_send (c, "CAP %s LS :multi-prefix", a->target);
 | 
						client_send (c, "CAP %s LS :multi-prefix invite-notify", a->target);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@@ -1155,6 +1156,8 @@ irc_handle_cap_list (struct client *c, struct irc_cap_args *a)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (c->caps_enabled & IRC_CAP_MULTI_PREFIX)
 | 
						if (c->caps_enabled & IRC_CAP_MULTI_PREFIX)
 | 
				
			||||||
		str_vector_add (&caps, "multi-prefix");
 | 
							str_vector_add (&caps, "multi-prefix");
 | 
				
			||||||
 | 
						if (c->caps_enabled & IRC_CAP_INVITE_NOTIFY)
 | 
				
			||||||
 | 
							str_vector_add (&caps, "invite-notify");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char *caps_str = join_str_vector (&caps, ' ');
 | 
						char *caps_str = join_str_vector (&caps, ' ');
 | 
				
			||||||
	str_vector_free (&caps);
 | 
						str_vector_free (&caps);
 | 
				
			||||||
@@ -1167,6 +1170,8 @@ irc_decode_capability (const char *name)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	if (!strcmp (name, "multi-prefix"))
 | 
						if (!strcmp (name, "multi-prefix"))
 | 
				
			||||||
		return IRC_CAP_MULTI_PREFIX;
 | 
							return IRC_CAP_MULTI_PREFIX;
 | 
				
			||||||
 | 
						if (!strcmp (name, "invite-notify"))
 | 
				
			||||||
 | 
							return IRC_CAP_INVITE_NOTIFY;
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2481,6 +2486,17 @@ irc_handle_kick (const struct irc_message *msg, struct client *c)
 | 
				
			|||||||
	str_vector_free (&users);
 | 
						str_vector_free (&users);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					irc_send_invite_notifications
 | 
				
			||||||
 | 
						(struct channel *chan, struct client *c, struct client *target)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						for (struct channel_user *iter = chan->users; iter; iter = iter->next)
 | 
				
			||||||
 | 
							if (iter->c != target && iter->c->caps_enabled & IRC_CAP_INVITE_NOTIFY)
 | 
				
			||||||
 | 
								client_send (iter->c, ":%s!%s@%s INVITE %s %s",
 | 
				
			||||||
 | 
									c->nickname, c->username, c->hostname,
 | 
				
			||||||
 | 
									target->nickname, chan->name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
irc_handle_invite (const struct irc_message *msg, struct client *c)
 | 
					irc_handle_invite (const struct irc_message *msg, struct client *c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -2507,6 +2523,10 @@ irc_handle_invite (const struct irc_message *msg, struct client *c)
 | 
				
			|||||||
			str_map_set (&client->invites, channel_name, (void *) 1);
 | 
								str_map_set (&client->invites, channel_name, (void *) 1);
 | 
				
			||||||
		else if ((chan->modes & IRC_CHAN_MODE_INVITE_ONLY))
 | 
							else if ((chan->modes & IRC_CHAN_MODE_INVITE_ONLY))
 | 
				
			||||||
			RETURN_WITH_REPLY (c, IRC_ERR_CHANOPRIVSNEEDED, channel_name);
 | 
								RETURN_WITH_REPLY (c, IRC_ERR_CHANOPRIVSNEEDED, channel_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// It's not specified when and how we should send out invite-notify
 | 
				
			||||||
 | 
							if (chan->modes & IRC_CHAN_MODE_INVITE_ONLY)
 | 
				
			||||||
 | 
								irc_send_invite_notifications (chan, c, client);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	client_send (client, ":%s!%s@%s INVITE %s %s",
 | 
						client_send (client, ":%s!%s@%s INVITE %s %s",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user