]> jfr.im git - irc/quakenet/newserv.git/blame - newsearch/ns-modes.c
Add jupe support
[irc/quakenet/newserv.git] / newsearch / ns-modes.c
CommitLineData
c86edd1d
Q
1/*
2 * MODES functionality
3 */
4
5#include "newsearch.h"
6
7#include <stdio.h>
8#include <stdlib.h>
9
10#include "../nick/nick.h"
11#include "../channel/channel.h"
12#include "../lib/flags.h"
13
14struct modes_localdata {
15 int type;
16 flag_t setmodes;
17 flag_t clearmodes;
18};
19
20void *modes_exe(struct searchNode *thenode, int type, void *theinput);
21void modes_free(struct searchNode *thenode);
22
23struct searchNode *modes_parse(int type, int argc, char **argv) {
24 struct modes_localdata *localdata;
25 struct searchNode *thenode;
26 const flag *flaglist;
27
28 if (argc!=1) {
29 parseError="modes: usage: modes (mode string)";
30 return NULL;
31 }
32
33 switch (type) {
34 case SEARCHTYPE_CHANNEL:
35 flaglist=cmodeflags;
36 break;
37
38 case SEARCHTYPE_NICK:
39 flaglist=umodeflags;
40 break;
41
42 default:
43 parseError="modes: unsupported search type";
44 return NULL;
45 }
46
47 localdata=(struct modes_localdata *)malloc(sizeof(struct modes_localdata));
48
49 localdata->type=type;
50 localdata->setmodes=0;
51 localdata->clearmodes = ~0;
52
53 setflags(&(localdata->setmodes), 0xFFFF, argv[0], flaglist, REJECT_NONE);
54 setflags(&(localdata->clearmodes), 0xFFFF, argv[0], flaglist, REJECT_NONE);
55
56 localdata->clearmodes = ~(localdata->clearmodes);
57
58 thenode=(struct searchNode *)malloc(sizeof(struct searchNode));
59
60 thenode->returntype = RETURNTYPE_BOOL;
61 thenode->localdata = (void *)localdata;
62 thenode->exe = modes_exe;
63 thenode->free = modes_free;
64
65 return thenode;
66}
67
68void *modes_exe(struct searchNode *thenode, int type, void *value) {
69 struct modes_localdata *localdata;
70 nick *np;
71 chanindex *cip;
72 flag_t flags;
73
74 localdata = (struct modes_localdata *)thenode->localdata;
75
76 switch (localdata->type) {
77 case SEARCHTYPE_CHANNEL:
78 cip=(chanindex *)value;
79 if (!cip->channel)
80 return NULL;
81 flags=cip->channel->flags;
82 break;
83
84 case SEARCHTYPE_NICK:
85 np=(nick *)value;
86 flags=np->umodes;
87 break;
88
89 default:
90 return NULL;
91 }
92
93 if (~flags & (localdata->setmodes))
94 return falseval(type);
95
96 if (flags & (localdata->clearmodes))
97 return falseval(type);
98
99 return trueval(type);
100}
101
102void modes_free(struct searchNode *thenode) {
103 free (thenode->localdata);
104 free (thenode);
105}