]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chancmds/giveowner.c
Added "giveowner" command.
[irc/quakenet/newserv.git] / chanserv / chancmds / giveowner.c
1 /*
2 * CMDNAME: giveowner
3 * CMDLEVEL: QCMD_AUTHED
4 * CMDARGS: 3
5 * CMDDESC: Gives total control over a channel to another user.
6 * CMDFUNC: csc_dogiveowner
7 * CMDPROTO: int csc_dogiveowner(void *source, int cargc, char **cargv);
8 */
9
10 #include "../chanserv.h"
11 #include "../../nick/nick.h"
12 #include "../../lib/flags.h"
13 #include "../../lib/irc_string.h"
14 #include "../../channel/channel.h"
15 #include "../../parser/parser.h"
16 #include "../../irc/irc.h"
17 #include "../../localuser/localuserchannel.h"
18 #include <string.h>
19 #include <stdio.h>
20
21 int csc_dogiveowner(void *source, int cargc, char **cargv) {
22 nick *sender=source;
23 chanindex *cip;
24 regchan *rcp;
25 regchanuser *rcup;
26 reguser *rup=getreguserfromnick(sender), *target;
27 char flagbuf[30];
28 flag_t oldflags;
29 unsigned int thehash;
30 char hashstr[100];
31
32 if (cargc<2) {
33 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "giveowner");
34 return CMD_ERROR;
35 }
36
37 /* You need to either be +n or have the relevant override... */
38 if (!(cip=cs_checkaccess(sender, cargv[0], CA_OWNERPRIV,
39 NULL, "chanlev", QPRIV_CHANGECHANLEV, 0)))
40 return CMD_ERROR;
41
42 rcp=cip->exts[chanservext];
43
44 if (!(target=findreguser(sender, cargv[1])))
45 return CMD_ERROR; /* If there was an error, findreguser will have sent a message saying why.. */
46
47 rcup=findreguseronchannel(rcp, target);
48
49 /* You can only promote a master */
50 if (!rcup || !(rcup->flags & QCUFLAG_MASTER)) {
51 chanservstdmessage(sender,QM_GIVEOWNERNOTMASTER,target->username,cip->name->content);
52 return CMD_ERROR;
53 }
54
55 /* Can't promote if already owner */
56 if (rcup->flags & QCUFLAG_OWNER) {
57 chanservstdmessage(sender,QM_GIVEOWNERALREADYOWNER,target->username,cip->name->content);
58 return CMD_ERROR;
59 }
60
61 /* Compute ze hash */
62 sprintf(hashstr,"%u.%u.%u",rcp->ID,target->ID,rup->ID);
63 thehash=crc32(hashstr);
64
65 sprintf(hashstr,"%x",thehash);
66
67 if (cargc<3) {
68 chanservstdmessage(sender,QM_GIVEOWNERNEEDHASH,cip->name->content,target->username,
69 cip->name->content,target->username,hashstr);
70 return CMD_OK;
71 }
72
73 if (ircd_strcmp(cargv[2], hashstr)) {
74 chanservstdmessage(sender,QM_GIVEOWNERWRONGHASH,target->username,
75 cip->name->content);
76 return CMD_ERROR;
77 }
78
79 /* OK, hash matches, do it. */
80 oldflags = rcup->flags;
81 rcup->flags |= QCUFLAG_OWNER;
82
83 chanservstdmessage(sender,QM_DONE);
84
85 strcpy(flagbuf,printflags(oldflags,rcuflags));
86 cs_log(sender,"GIVEOWNER %s #%s (%s -> %s)",cip->name->content,rcup->user->username,
87 flagbuf,printflags(rcup->flags,rcuflags));
88
89 csdb_chanlevhistory_insert(rcp, sender, rcup->user, oldflags, rcup->flags);
90 csdb_updatechanuser(rcup);
91
92 return CMD_OK;
93 }