Anonymous avatar Anonymous committed ca80002

Update omode so that it can set +ah.

Comments (0)

Files changed (1)

extensions/m_omode.c

 	set_channel_mode(client_p, source_p->servptr, chptr, msptr, 
 			 parc - 2, parv + 2);
 #else
-	if (parc == 4 && !strcmp(parv[2], "+o") && !irccmp(parv[3], source_p->name))
+	if (parc == 4 && !strcmp(parv[2], "+a") && !irccmp(parv[3], source_p->name))
+	{
+		/* Admining themselves */
+		if (!wasonchannel)
+		{
+			sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL,
+					   form_str(ERR_USERNOTINCHANNEL), parv[3], chptr->chname);
+			return 0;
+		}
+		sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +a %s",
+				me.name, parv[1], source_p->name);
+		sendto_server(NULL, chptr, CAP_TS6, NOCAPS,
+				":%s TMODE %ld %s +a %s",
+				me.id, (long) chptr->channelts, parv[1],
+				source_p->id);
+		msptr->flags |= CHFL_ADMIN;
+	}
+	else if (parc == 4 && !strcmp(parv[2], "+o") && !irccmp(parv[3], source_p->name))
 	{
 		/* Opping themselves */
 		if (!wasonchannel)
 				source_p->id);
 		msptr->flags |= CHFL_CHANOP;
 	}
-	else
+	else if (parc == 4 && !strcmp(parv[2], "+h") && !irccmp(parv[3], source_p->name))
+	{
+		/* Halfopping themselves */
+		if (!wasonchannel)
+		{
+			sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL,
+					   form_str(ERR_USERNOTINCHANNEL), parv[3], chptr->chname);
+			return 0;
+		}
+		sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +h %s",
+				me.name, parv[1], source_p->name);
+		sendto_server(NULL, chptr, CAP_TS6, NOCAPS,
+				":%s TMODE %ld %s +h %s",
+				me.id, (long) chptr->channelts, parv[1],
+				source_p->id);
+		msptr->flags |= CHFL_HALFOP;
+	}
+	else if (ConfigChannel.use_admin)
 	{
 		/* Hack it so set_channel_mode() will accept */
 		if (wasonchannel)
-			msptr->flags |= CHFL_CHANOP;
+			msptr->flags |= CHFL_ADMIN;
 		else
 		{
 			add_user_to_channel(chptr, source_p, CHFL_CHANOP);
 		 * themselves as set_channel_mode() does not allow that
 		 * -- jilles */
 		if (wasonchannel)
+			msptr->flags &= ~CHFL_ADMIN;
+		else
+			remove_user_from_channel(msptr);
+	}
+	else
+	{
+		/* CHFL_ADMIN is only useful if admin is enabled
+		 * so hack it with op if it is not. */
+		if (wasonchannel)
+			msptr->flags |= CHFL_CHANOP;
+		else
+		{
+			add_user_to_channel(chptr, source_p, CHFL_CHANOP);
+			msptr = find_channel_membership(chptr, source_p);
+		}
+		set_channel_mode(client_p, source_p, chptr, msptr, 
+				parc - 2, parv + 2);
+		/* We know they were not opped before and they can't have opped
+		 * themselves as set_channel_mode() does not allow that 
+		 * -- jilles */
+		if (wasonchannel)
 			msptr->flags &= ~CHFL_CHANOP;
 		else
 			remove_user_from_channel(msptr);
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.