diff -crN ../ircu2.10.06-DBH8-noproxy4/CAMBIOS ../ircu2.10.06-DBH9/CAMBIOS *** ../ircu2.10.06-DBH8-noproxy4/CAMBIOS Thu Jul 29 14:56:16 1999 --- ../ircu2.10.06-DBH9/CAMBIOS Fri Jul 30 12:53:47 1999 *************** *** 1,3 **** --- 1,34 ---- + * 1999/07/29 savage@apostols.org (patch.dbh9) + ----------------------------------------------------------------------- + Incorpora el comando SERVER-SERVER BMODE, con formato: + + :origen BMODE ChanServ #canal +modos :parametros + + ChanServ se busca en la tabla B, y se nos traduce a 'CHaN!^@^', y es lo + que veran los usuarios en los cambios de modos del canal realizados por + los servers (autoops, etc). Para mas info ver codigo m_botmode() en + chammel.c + + Modos de usuario: + + B -> Modo Bot, permite TODO sobre canales, sin estar dentro, + limitado a los BOTS, no se puede colocar en modo usuario. + + Se ha usado un bit de nustro campo Client->hmodes + + Modos de Canal: + + r -> Canal Registrado (existe en tabla C, no se puede poner/quitar) + R -> Canal Restringido, solo acepta users Registrados + A -> Activacion de autoop para los ke salgan en tabla C + S -> Modo Secure OP (no implementado de momento) + + Se han usado 4 bits del campo chptr->modes.modes: + #define MODE_REGCHAN 0x020000 + #define MODE_REGNICKS 0x040000 + #define MODE_AUTOOP 0x080000 + #define MODE_SECUREOP 0x100000 + * 1999/07/29 savage@apostols.org (patch.noproxy4) ----------------------------------------------------------------------- Se corrige el tema caida por timeout si tienes el 1080 cerrado sin aviso diff -crN ../ircu2.10.06-DBH8-noproxy4/include/channel.h ../ircu2.10.06-DBH9/include/channel.h *** ../ircu2.10.06-DBH8-noproxy4/include/channel.h Thu Jul 29 13:20:59 1999 --- ../ircu2.10.06-DBH9/include/channel.h Thu Jul 29 21:23:47 1999 *************** *** 78,83 **** --- 78,98 ---- * temporary TS; can be removed when all 2.10 */ #define MODE_LISTED 0x10000 + #if defined(DB_HISPANO) || defined(DB_ESNET) + #define MODE_REGCHAN 0x020000 + #define MODE_REGNICKS 0x040000 + #define MODE_AUTOOP 0x080000 + #define MODE_SECUREOP 0x100000 + + #define RegisteredChannel(x) ((x) && ((x)->mode.mode & MODE_REGCHAN)) + #define RestrictedChannel(x) ((x) && ((x)->mode.mode & MODE_REGNICKS)) + #define AutoOpChannel(x) ((x) && ((x)->mode.mode & MODE_AUTOOP)) + #define SecureOpChannel(x) ((x) && ((x)->mode.mode & MODE_SECUREOP)) + + extern int m_botmode(aClient *cptr, aClient *sptr, int parc, char *parv[]); + + #endif /* DB_HISPANO || DB_ESNET */ + /* * mode flags which take another parameter (With PARAmeterS) */ diff -crN ../ircu2.10.06-DBH8-noproxy4/include/msg.h ../ircu2.10.06-DBH9/include/msg.h *** ../ircu2.10.06-DBH8-noproxy4/include/msg.h Thu Jul 29 13:20:59 1999 --- ../ircu2.10.06-DBH9/include/msg.h Thu Jul 29 21:29:06 1999 *************** *** 47,55 **** #endif #ifdef DB_HISPANO ! #define MSG_DBH "DBH" /* Base de Datos IRC-HISPANO */ #define TOK_DBH "DBH" #define CLASS_DBH LEVEL_PROPAGATE #endif #define MSG_PRIVATE "PRIVMSG" /* PRIV */ --- 47,61 ---- #endif #ifdef DB_HISPANO ! #define MSG_DBH "DBH" /* Base de Datos IRC-HISPANO */ #define TOK_DBH "DBH" #define CLASS_DBH LEVEL_PROPAGATE + #endif + + #if defined(DB_HISPANO) || defined(DB_ESNET) + #define MSG_BMODE "BMODE" /* Base de Datos IRC-HISPANO */ + #define TOK_BMODE "BMODE" + #define CLASS_BMODE LEVEL_PROPAGATE #endif #define MSG_PRIVATE "PRIVMSG" /* PRIV */ diff -crN ../ircu2.10.06-DBH8-noproxy4/include/numeric.h ../ircu2.10.06-DBH9/include/numeric.h *** ../ircu2.10.06-DBH8-noproxy4/include/numeric.h Thu Jul 29 13:20:59 1999 --- ../ircu2.10.06-DBH9/include/numeric.h Thu Jul 29 20:00:18 1999 *************** *** 103,109 **** #define ERR_BANNEDFROMCHAN 474 #define ERR_BADCHANNELKEY 475 #define ERR_BADCHANMASK 476 /* Undernet extension */ ! /* ERR_NEEDREGGEDNICK 477 DalNet Extention */ #define ERR_BANLISTFULL 478 /* Undernet extension */ /* #define ERR_BADCHANNAME 479 EFNet extension */ --- 103,109 ---- #define ERR_BANNEDFROMCHAN 474 #define ERR_BADCHANNELKEY 475 #define ERR_BADCHANMASK 476 /* Undernet extension */ ! #define ERR_NEEDREGGEDNICK 477 /* DalNet Extention */ #define ERR_BANLISTFULL 478 /* Undernet extension */ /* #define ERR_BADCHANNAME 479 EFNet extension */ diff -crN ../ircu2.10.06-DBH8-noproxy4/include/s_bsd.h ../ircu2.10.06-DBH9/include/s_bsd.h *** ../ircu2.10.06-DBH8-noproxy4/include/s_bsd.h Thu Jul 29 13:20:59 1999 --- ../ircu2.10.06-DBH9/include/s_bsd.h Thu Jul 29 20:35:34 1999 *************** *** 189,198 **** #define HMODE_SOCKS 0x00000004 /* se esta chekeando socks */ #define HMODE_WRSOCKS 0x00000008 /* se tiene ke escribir en socks */ #define HMODE_HELPOP 0x00000010 /* Es un oper con modo +h */ /* Modos hispano a propagar */ #define SEND_HMODES \ ! (HMODE_NICKREGISTERED | HMODE_HELPOP) /* Modos hispano TODOS */ #define ALL_HMODES \ --- 189,199 ---- #define HMODE_SOCKS 0x00000004 /* se esta chekeando socks */ #define HMODE_WRSOCKS 0x00000008 /* se tiene ke escribir en socks */ #define HMODE_HELPOP 0x00000010 /* Es un oper con modo +h */ + #define HMODE_SERVICESBOT 0x00000020 /* Es un bot de canales */ /* Modos hispano a propagar */ #define SEND_HMODES \ ! (HMODE_NICKREGISTERED | HMODE_HELPOP | HMODE_SERVICESBOT) /* Modos hispano TODOS */ #define ALL_HMODES \ *************** *** 203,220 **** --- 204,224 ---- #define DoingSocks(x) ((x)->hmodes & HMODE_SOCKS) #define DoingWrSocks(x) ((x)->hmodes & HMODE_WRSOCKS) #define IsHelpOp(x) ((x)->hmodes & HMODE_HELPOP) + #define IsServicesBot(x) ((x)->hmodes & HMODE_SERVICESBOT) /* Macros para poner modos hispano */ #define SetNickRegistered(x) ((x)->hmodes |= HMODE_NICKREGISTERED) #define SetSocks(x) ((x)->hmodes |= HMODE_SOCKS) #define SetWrSocks(x) ((x)->hmodes |= HMODE_WRSOCKS) #define SetHelpOp(x) ((x)->hmodes |= HMODE_HELPOP) + #define SetServicesBot(x) ((x)->hmodes |= HMODE_SERVICESBOT) /* Macros para borrar modos hispano */ #define ClearNickRegistered(x) ((x)->hmodes &= ~HMODE_NICKREGISTERED) #define ClearSocks(x) ((x)->hmodes &= ~HMODE_SOCKS) #define ClearWrSocks(x) ((x)->hmodes &= ~HMODE_WRSOCKS) #define ClearHelpOp(x) ((x)->hmodes &= ~HMODE_HELPOP) + #define ClearServicesBot(x) ((x)->hmodes &= ~HMODE_SERVICESBOT) #endif /* DB_HISPANO || DB_ESNET */ diff -crN ../ircu2.10.06-DBH8-noproxy4/include/s_serv.h ../ircu2.10.06-DBH9/include/s_serv.h *** ../ircu2.10.06-DBH8-noproxy4/include/s_serv.h Thu Jul 29 13:20:59 1999 --- ../ircu2.10.06-DBH9/include/s_serv.h Thu Jul 29 17:40:22 1999 *************** *** 80,85 **** --- 80,86 ---- extern void tea(unsigned long v[],unsigned long k[],unsigned long x[]); extern struct dbh_reg * dbh_buscar_registro_local(char tabla, char *clave); + int dbh_es_miembro(char tabla, char *clave, char *subcadena); #endif #ifdef DB_HISPANO diff -crN ../ircu2.10.06-DBH8-noproxy4/include/struct.h ../ircu2.10.06-DBH9/include/struct.h *** ../ircu2.10.06-DBH8-noproxy4/include/struct.h Thu Jul 29 13:20:59 1999 --- ../ircu2.10.06-DBH9/include/struct.h Thu Jul 29 18:06:51 1999 *************** *** 185,191 **** --- 185,195 ---- #define DBH_NICKDB 'N' #define DBH_OPERDB 'O' #define DBH_CHANDB 'C' + #define DBH_BOTSDB 'B' #define ESNET_NICKDB 'n' + + /* Para las features del Virtual CHaN */ + #define DBH_CHANSERV "ChanServ" struct dbh_reg { char *destino; diff -crN ../ircu2.10.06-DBH8-noproxy4/ircd/channel.c ../ircu2.10.06-DBH9/ircd/channel.c *** ../ircu2.10.06-DBH8-noproxy4/ircd/channel.c Thu Jul 29 13:21:00 1999 --- ../ircu2.10.06-DBH9/ircd/channel.c Fri Jul 30 00:07:37 1999 *************** *** 512,517 **** --- 512,522 ---- { Reg1 Link *lp; + #if defined(DB_HISPANO) || defined(DB_ESNET) + if( IsServicesBot(cptr) ) + return 0; /* siempre pueden */ + #endif + lp = IsMember(cptr, chptr); if ((!lp || !(lp->flags & (CHFL_CHANOP | CHFL_VOICE)) || *************** *** 550,555 **** --- 555,570 ---- *mbuf++ = 'i'; if (chptr->mode.mode & MODE_NOPRIVMSGS) *mbuf++ = 'n'; + #if defined(DB_HISPANO) || defined(DB_ESNET) + if (RegisteredChannel(chptr)) + *mbuf++ = 'r'; + if (RestrictedChannel(chptr)) + *mbuf++ = 'R'; + if (AutoOpChannel(chptr)) + *mbuf++ = 'A'; + if (SecureOpChannel(chptr)) + *mbuf++ = 'S'; + #endif /* DB_HISPANO || DB_ESNET */ if (chptr->mode.limit) { *mbuf++ = 'l'; *************** *** 774,779 **** --- 789,892 ---- } } + #if defined(DB_HISPANO) || defined(DB_ESNET) + /* + * m_botmode + * parv[0] - sender + * parv[1] - botname (ChanServ, ..) + * parv[2] - channel + * + * burda imitacion de m_mode + */ + + int m_botmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) + { + int badop, sendts; + aChannel *chptr; + char *botname; + struct dbh_reg *r; + + if(!IsServer(cptr) && !IsOper(sptr)) + return 0; + + /* Now, try to find the channel in question */ + if (parc > 3) + { + chptr = FindChannel(parv[2]); + if (chptr == NullChn) + return 0; /* m_botumode(cptr, sptr, parc, parv); */ + } + else + { + sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "BMODE"); + return 0; + } + + sptr->flags &= ~FLAGS_TS8; + + if (MyUser(sptr)) + clean_channelname(parv[2]); + else if (IsLocalChannel(parv[2])) + return 0; + + /* sending an error wasnt good, lets just send an empty mode reply.. poptix */ + if (IsModelessChannel(chptr->chname)) + { + if (IsUser(sptr)) + sendto_one(sptr, rpl_str(RPL_CHANNELMODEIS), me.name, parv[0], chptr->chname, "+nt", ""); + return 0; + } + + if (!(sendts = set_mode(cptr, sptr, chptr, parc - 3, parv + 3, + modebuf, parabuf, nparabuf, &badop))) + { + sendto_one(sptr, err_str(IsMember(sptr, chptr) ? ERR_CHANOPRIVSNEEDED : + ERR_NOTONCHANNEL), me.name, parv[0], chptr->chname); + return 0; + } + + badop=0; + + r=dbh_buscar_registro_local(DBH_BOTSDB, parv[1]); + if(r && r->valor) + botname=r->valor; + else + botname=me.name; + + if (strlen(modebuf) > (size_t) 1 || sendts > 0) + { + if (badop != 2 && strlen(modebuf) > (size_t) 1) + sendto_channel_butserv(chptr, NULL, ":%s MODE %s %s %s", + botname, chptr->chname, modebuf, parabuf); + if (IsLocalChannel(chptr->chname)) + return 0; + /* We send a creationtime of 0, to mark it as a hack --Run */ + if (IsServer(sptr) && (badop == 2 || sendts > 0)) + { + if (*modebuf == '\0') + strcpy(modebuf, "+"); + if (badop != 2) + { + sendto_lowprot_butone(cptr, 9, ":%s BMODE %s %s %s %s " TIME_T_FMT, + parv[0], parv[1], chptr->chname, modebuf, parabuf, + (badop == 4) ? (time_t) 0 : chptr->creationtime); + sendto_highprot_butone(cptr, 10, ":%s BMODE %s %s %s %s " TIME_T_FMT, + parv[0], parv[1], chptr->chname, modebuf, nparabuf, + (badop == 4) ? (time_t) 0 : chptr->creationtime); + } + } + else + { + sendto_lowprot_butone(cptr, 9, ":%s BMODE %s %s %s %s", + parv[0], parv[1], chptr->chname, modebuf, parabuf); + sendto_highprot_butone(cptr, 10, ":%s BMODE %s %s %s %s", + parv[0], parv[1], chptr->chname, modebuf, nparabuf); + } + } + return 0; + } + #endif + /* * m_mode * parv[0] - sender *************** *** 1007,1012 **** --- 1120,1129 ---- MODE_MODERATED, 'm', MODE_NOPRIVMSGS, 'n', MODE_TOPICLIMIT, 't', MODE_INVITEONLY, 'i', MODE_VOICE, 'v', MODE_KEY, 'k', + #if defined(DB_HISPANO) || defined(DB_ESNET) + MODE_REGCHAN, 'r', MODE_REGNICKS, 'R', + MODE_AUTOOP, 'A', MODE_SECUREOP, 'S', + #endif 0x0, 0x0 }; *************** *** 1047,1053 **** --- 1164,1174 ---- * At this point, let any member pass, so they are allowed * to see the bans. */ + #if defined(DB_HISPANO) || defined(DB_ESNET) + if (!(IsServicesBot(cptr) || IsServer(cptr) || (tmp = IsMember(sptr, chptr)))) + #else if (!(IsServer(cptr) || (tmp = IsMember(sptr, chptr)))) + #endif return 0; newmode = mode->mode; *************** *** 1255,1260 **** --- 1376,1386 ---- while ((lp = chptr->invites)) del_invite(lp->value.cptr, chptr); goto def; /* Porque insertamos codigo */ + #if defined(DB_HISPANO) || defined(DB_ESNET) + /* el modo r no se cambia */ + case 'r': + break; + #endif #ifdef XMODE_ESNET case 'x': /* *************** *** 1301,1307 **** * El fundador de un canal puede usar los modos X en su canal * 1999/06/30 savage@apostols.org */ ! if(reg && IsNickRegistered(sptr) && !strCasediff(sptr->name,reg->valor)) { if(!is_chan_op(sptr,chptr)) jcea_xmode_esnet=!0; --- 1427,1434 ---- * El fundador de un canal puede usar los modos X en su canal * 1999/06/30 savage@apostols.org */ ! if(IsNickRegistered(sptr) && ! dbh_es_miembro(DBH_CHANDB, chptr->chname,sptr->name)==1) { if(!is_chan_op(sptr,chptr)) jcea_xmode_esnet=!0; *************** *** 1407,1413 **** ** fijar parametros pase lo que pase. ** jcea@argo.es - 03/Feb/98 */ ! if (!jcea_xmode_esnet && !IsServer(cptr) && (!tmp || !(tmp->flags & CHFL_CHANOP))) { *badop = 0; return (opcnt || newmode != mode->mode || limitset || keychange) ? 0 : -1; --- 1534,1544 ---- ** fijar parametros pase lo que pase. ** jcea@argo.es - 03/Feb/98 */ ! if (!jcea_xmode_esnet ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! && !IsServicesBot(sptr) ! #endif ! && !IsServer(cptr) && (!tmp || !(tmp->flags & CHFL_CHANOP))) { *badop = 0; return (opcnt || newmode != mode->mode || limitset || keychange) ? 0 : -1; *************** *** 1422,1438 **** bounce = (*badop == 1 || *badop == 2 || is_deopped(sptr, chptr)) ? 1 : 0; /* ** Si somos IRCOPs y hemos puesto el flag X, podemos ** fijar parametros pase lo que pase. ** jcea@argo.es - 03/Feb/98 */ if(jcea_xmode_esnet) { bounce=0; *mbuf++='x'; } - whatt = 0; for (ip = flags; *ip; ip += 2) if ((*ip & newmode) && !(*ip & oldm.mode)) { --- 1553,1580 ---- bounce = (*badop == 1 || *badop == 2 || is_deopped(sptr, chptr)) ? 1 : 0; + #if defined(DB_HISPANO) || defined(DB_ESNET) + if(IsServicesBot(sptr)) + { + bounce=0; + *badop=0; + } + #endif + /* ** Si somos IRCOPs y hemos puesto el flag X, podemos ** fijar parametros pase lo que pase. ** jcea@argo.es - 03/Feb/98 */ + whatt = 0; + if(jcea_xmode_esnet) { bounce=0; + whatt = MODE_ADD; + *mbuf++='+'; *mbuf++='x'; } for (ip = flags; *ip; ip += 2) if ((*ip & newmode) && !(*ip & oldm.mode)) { *************** *** 2069,2079 **** * 1999/06/30 savage@apostols.org */ ! if( (!BadPtr(key)) && reg && IsNickRegistered(sptr) && !strCasediff(reg->valor, sptr->name) && (!compall("FUNDADOR", key)) ) return 0; #endif } #endif /* DB_HISPANO && (DBH_OPER_HACK || DBH_CHAN_HACK) */ /* Now a banned user CAN join if invited -- Nemesi */ --- 2211,2226 ---- * 1999/06/30 savage@apostols.org */ ! if( (!BadPtr(key)) && IsNickRegistered(sptr) ! && dbh_es_miembro(DBH_CHANDB, chptr->chname, sptr->name)==1 && (!compall("FUNDADOR", key)) ) return 0; #endif } + + if( RestrictedChannel(chptr) && !IsNickRegistered(sptr) ) + return ERR_NEEDREGGEDNICK; + #endif /* DB_HISPANO && (DBH_OPER_HACK || DBH_CHAN_HACK) */ /* Now a banned user CAN join if invited -- Nemesi */ *************** *** 2446,2451 **** --- 2593,2603 ---- } } chptr = get_channel(sptr, name, CREATE); + #if defined(DB_HISPANO) || defined(DB_ESNET) + if( chptr && dbh_buscar_registro_local(DBH_CHANDB, name) ) + chptr->mode.mode |= MODE_REGCHAN; + /* Aki debo implantar los modos por defecto sacados de la DBH */ + #endif if (chptr && (lp = find_user_link(chptr->members, sptr))) { if (lp->flags & CHFL_ZOMBIE) *************** *** 2488,2494 **** { sendto_one(sptr, err_str(i), me.name, parv[0], chptr->chname); continue; ! } } /* * Complete user entry to the new channel (if any) --- 2640,2652 ---- { sendto_one(sptr, err_str(i), me.name, parv[0], chptr->chname); continue; ! } ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! if( AutoOpChannel(chptr) && ! IsNickRegistered(sptr) && ! dbh_es_miembro(DBH_CHANDB, chptr->chname, sptr->name) ) ! flags = CHFL_CHANOP; ! #endif } /* * Complete user entry to the new channel (if any) *************** *** 2572,2578 **** sendto_serv_butone(cptr, ":%s MODE %s + " TIME_T_FMT, me.name, chptr->chname, chptr->creationtime); /* ok, send TS */ chptr->mode.mode &= ~MODE_SENDTS; /* reset flag */ ! } } } --- 2730,2755 ---- sendto_serv_butone(cptr, ":%s MODE %s + " TIME_T_FMT, me.name, chptr->chname, chptr->creationtime); /* ok, send TS */ chptr->mode.mode &= ~MODE_SENDTS; /* reset flag */ ! } ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! if( AutoOpChannel(chptr) ! && IsNickRegistered(sptr) ! && dbh_es_miembro(DBH_CHANDB, chptr->chname, sptr->name) ) ! { ! struct dbh_reg *r; ! char *botname; ! ! if( (r=dbh_buscar_registro_local(DBH_BOTSDB, DBH_CHANSERV)) != NULL) ! botname=r->valor; ! else ! botname=me.name; ! ! sendto_serv_butone(cptr, "%c BMODE %s %s +o %c%c%c " TIME_T_FMT, ! me.yxx[0], DBH_CHANSERV, chptr->chname, NumNick(sptr), chptr->creationtime ); ! sendto_channel_butserv(chptr, NULL, ":%s MODE %s +o %s", ! botname, chptr->chname, sptr->name ); ! } ! #endif } } *************** *** 3703,3709 **** --- 3880,3890 ---- chptr->chname); return 0; } + #if defined(DB_HISPANO) || defined(DB_ESNET) + if (!IsServicesBot(sptr) && !IsServer(cptr) && !is_chan_op(sptr, chptr)) + #else if (!IsServer(cptr) && !is_chan_op(sptr, chptr)) + #endif { sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED), me.name, parv[0], chptr->chname); *************** *** 3729,3735 **** !(lp->flags & CHFL_ZOMBIE)) || IsServer(sptr)) { if (who->from != cptr && ! ((lp2 && (lp2->flags & CHFL_DEOPPED)) || (!lp2 && IsUser(sptr)))) { /* * Bounce here: --- 3910,3919 ---- !(lp->flags & CHFL_ZOMBIE)) || IsServer(sptr)) { if (who->from != cptr && ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! !IsServicesBot(sptr) && ! #endif ! ((lp2 && (lp2->flags & CHFL_DEOPPED)) || (!lp2 && IsUser(sptr)))) { /* * Bounce here: *************** *** 3881,3888 **** --- 4065,4077 ---- for (; (name = strtoken(&p, parv[1], ",")); parv[1] = NULL) { chptr = NULL; + #if defined(DB_HISPANO) || defined(DB_ESNET) + if (!IsChannelName(name) || !(chptr = FindChannel(name)) || + (!IsServicesBot(sptr) && ((topic || SecretChannel(chptr)) && !IsMember(sptr, chptr)))) + #else if (!IsChannelName(name) || !(chptr = FindChannel(name)) || ((topic || SecretChannel(chptr)) && !IsMember(sptr, chptr))) + #endif { sendto_one(sptr, err_str(chptr ? ERR_NOTONCHANNEL : ERR_NOSUCHCHANNEL), me.name, parv[0], chptr ? chptr->chname : name); *************** *** 3911,3917 **** --- 4100,4110 ---- } } else if (((chptr->mode.mode & MODE_TOPICLIMIT) == 0 || + #if defined(DB_HISPANO) || defined(DB_ESNET) + is_chan_op(sptr, chptr) || IsServicesBot(sptr)) && topic) + #else is_chan_op(sptr, chptr)) && topic) + #endif { /* setting a topic */ strncpy(chptr->topic, topic, TOPICLEN); *************** *** 3999,4005 **** --- 4192,4202 ---- return 0; } + #if defined(DB_HISPANO) || defined(DB_ESNET) + if (!IsMember(sptr, chptr) && !IsServicesBot(sptr)) + #else if (!IsMember(sptr, chptr)) + #endif { sendto_one(sptr, err_str(ERR_NOTONCHANNEL), me.name, parv[0], chptr->chname); *************** *** 4015,4021 **** --- 4212,4222 ---- if (MyConnect(sptr)) { + #if defined(DB_HISPANO) || defined(DB_ESNET) + if (!is_chan_op(sptr, chptr) && !IsServicesBot(sptr)) + #else if (!is_chan_op(sptr, chptr)) + #endif { sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED), me.name, parv[0], chptr->chname); diff -crN ../ircu2.10.06-DBH8-noproxy4/ircd/parse.c ../ircu2.10.06-DBH9/ircd/parse.c *** ../ircu2.10.06-DBH8-noproxy4/ircd/parse.c Thu Jul 29 13:21:00 1999 --- ../ircu2.10.06-DBH9/ircd/parse.c Thu Jul 29 21:22:55 1999 *************** *** 125,130 **** --- 125,133 ---- #ifdef DB_HISPANO {CLASS_DBH, MSG_DBH, TOK_DBH, m_dbh, 0, MAXPARA, MFLG_SLOW, 0L}, #endif + #if defined(DB_HISPANO) || defined(DB_ESNET) + {CLASS_BMODE, MSG_BMODE, TOK_BMODE, m_botmode, 0, MAXPARA, MFLG_SLOW, 0L}, + #endif {0, (char *)0, (char *)0, (int (*)(aClient *, aClient *, int, char **))0, 0, 0, 0, 0L} } ; /* *INDENT-ON* */ diff -crN ../ircu2.10.06-DBH8-noproxy4/ircd/s_debug.c ../ircu2.10.06-DBH9/ircd/s_debug.c *** ../ircu2.10.06-DBH8-noproxy4/ircd/s_debug.c Thu Jul 29 13:54:27 1999 --- ../ircu2.10.06-DBH9/ircd/s_debug.c Thu Jul 29 23:33:16 1999 *************** *** 202,208 **** #endif #ifdef DB_HISPANO '.','I','R','C','-', 'H','I','S','P','A','N','O','.','O','R','G',':', ! 'D','B','H' ,'8','+', 'N','+', --- 202,208 ---- #endif #ifdef DB_HISPANO '.','I','R','C','-', 'H','I','S','P','A','N','O','.','O','R','G',':', ! 'D','B','H' ,'9','+', 'N','+', diff -crN ../ircu2.10.06-DBH8-noproxy4/ircd/s_err.c ../ircu2.10.06-DBH9/ircd/s_err.c *** ../ircu2.10.06-DBH8-noproxy4/ircd/s_err.c Thu Jul 29 13:21:00 1999 --- ../ircu2.10.06-DBH9/ircd/s_err.c Fri Jul 30 02:54:20 1999 *************** *** 221,227 **** --- 221,231 ---- /* 476 */ {ERR_BADCHANMASK, "%s :Bad Channel Mask"}, /* 477 */ + #if defined(DB_HISPANO) || defined(DB_ESNET) + {ERR_NEEDREGGEDNICK, "%s :Cannot join channel (+R)"}, + #else {0, (char *)NULL}, + #endif /* 478 */ {ERR_BANLISTFULL, "%s %s :Channel ban/ignore list is full"}, /* 479 */ diff -crN ../ircu2.10.06-DBH8-noproxy4/ircd/s_serv.c ../ircu2.10.06-DBH9/ircd/s_serv.c *** ../ircu2.10.06-DBH8-noproxy4/ircd/s_serv.c Thu Jul 29 13:21:00 1999 --- ../ircu2.10.06-DBH9/ircd/s_serv.c Thu Jul 29 21:34:00 1999 *************** *** 57,62 **** --- 57,63 ---- #if defined(DB_ESNET) || defined(DB_HISPANO) #include "msg.h" + #include "support.h" /* * Las tablas con los registros, serie, version ... */ *************** *** 1422,1427 **** --- 1423,1462 ---- return NULL; } + /* + * dbh_es_miembro (tabla, clave, subcadena) + * + * varor registro es una lista separada por comas, y si subcadena es + # una de ellas, retorna la posicion, sino 0 + * 1999/07/03 savage@apostols.org + */ + int dbh_es_miembro(char tabla, char *clave, char *subcadena) + { + int j,i=0; + char *buff, *f, *s=NULL; + struct dbh_reg *reg; + + if( (reg=dbh_buscar_registro_local(tabla,clave)) == NULL ) + return 0; + + buff=RunMalloc(strlen(reg->valor)+1); + if(!buff) + return 0; + + strcpy(buff,reg->valor); + for(f=strtoken(&s,buff,","); f!=NULL; f=strtoken(&s,NULL,",")) + { + j++; + if(!strCasediff(f,subcadena)) { + i++; + break; + } + } + + RunFree(buff); + return i; + } + #endif /* defined(DB_ESNET) || defined(DB_HISPANO) */ #ifdef DB_ESNET *************** *** 2514,2519 **** --- 2549,2555 ---- tabla_residente[DBH_NICKDB]=1; tabla_residente[DBH_OPERDB]=1; tabla_residente[DBH_CHANDB]=1; + tabla_residente[DBH_BOTSDB]=1; /* --------------------------------------------------- */ for(i=DBH_PRIMERA_TABLA;i<=DBH_ULTIMA_TABLA;i++) diff -crN ../ircu2.10.06-DBH8-noproxy4/ircd/s_user.c ../ircu2.10.06-DBH9/ircd/s_user.c *** ../ircu2.10.06-DBH8-noproxy4/ircd/s_user.c Thu Jul 29 13:21:00 1999 --- ../ircu2.10.06-DBH9/ircd/s_user.c Thu Jul 29 23:49:29 1999 *************** *** 736,741 **** --- 736,742 ---- static int user_hmodes[] = { HMODE_NICKREGISTERED, 'r', HMODE_HELPOP, 'h', + HMODE_SERVICESBOT, 'B', 0, 0 }; #endif /* DB_HISPANO || DB_ESNET */ *************** *** 2815,2820 **** --- 2816,2824 ---- /* el modo +h solo se lopueden poner los OPER y kitar a voluntad */ if( !(sethmodes & HMODE_HELPOP) && !( IsNickRegistered(sptr) && dbh_buscar_registro_local(DBH_OPERDB,sptr->name)) ) ClearHelpOp(sptr); + + if( !(sethmodes & HMODE_SERVICESBOT) ) + ClearServicesBot(sptr); } #endif