Changeset 1692

Show
Ignore:
Timestamp:
03/10/10 16:49:06 (6 months ago)
Author:
swalsh
Message:

Implement most of autojoin, actually making it work still to come, probably should test this too

Location:
trunk
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • trunk/include/dbm.h

    r1680 r1692  
    204204  GET_GROUPS, 
    205205  GET_GROUP_CHAN_INFO, 
     206  GET_AJOINS, 
     207  INSERT_AJOIN, 
     208  DELETE_AJOIN, 
    206209  QUERY_COUNT 
    207210}; 
  • trunk/include/nickname.h

    r1554 r1692  
    113113void nickname_list_admins_free(dlink_list *); 
    114114 
     115int nickname_ajoin_add(int, int); 
     116int nickname_ajoin_list(int, dlink_list *); 
     117int nickname_ajoin_del(int, int); 
     118void nickname_ajoinlist_free(dlink_list *); 
     119 
    115120Nickname *nickname_new(); 
    116121inline void nickname_free(Nickname *); 
  • trunk/languages/nickserv.en.lang

    r1582 r1692  
    153153            CERT DEL 994EB294C15F4EE647FB5A426C11444E697B1814 
    154154         
     155NS_HELP_AJOIN_SHORT 
     156        %s: Maintains the nickname auto join list. 
     157NS_HELP_AJOIN_LONG 
     158        Usage: AJOIN ADD #channel 
     159               AJOIN DEL #channel 
     160               AJOIN LIST 
     161         
     162        Maintains the nickname auto join list. Channels in this list will be 
     163        automatically joined by your client every time you identify with services. 
     164        Channels must be registered with channel services to be able to be added to 
     165        the list. 
     166         
     167        Examples: 
     168            AJOIN ADD #test 
     169            AJOIN DEL #test 
     170            AJOIN LIST 
     171         
     172        The following are valid options to this command: 
     173NS_HELP_AJOIN_ADD_SHORT 
     174        %s 
     175NS_HELP_AJOIN_ADD_LONG 
     176        Usage: AJOIN ADD #channel 
     177         
     178        Add a channel to the auto join list. The channel must be registered with 
     179        channel services but does not necessarily need to currently exist on the 
     180        network. 
     181         
     182        Examples: 
     183            AJOIN ADD #test 
     184NS_HELP_AJOIN_LIST_SHORT 
     185        %s 
     186NS_HELP_AJOIN_LIST_LONG 
     187        Usage: AJOIN LIST 
     188         
     189        List entries in your auto join list. 
     190         
     191        Example: 
     192            AJOIN LIST 
     193NS_HELP_AJOIN_DEL_SHORT 
     194        %s 
     195NS_HELP_AJOIN_DEL_LONG 
     196        Usage: AJOIN DEL #channel 
     197         
     198        Delete an entry from your auto join list. 
     199         
     200        Examples: 
     201            AJOIN DEL #test 
    155202NS_HELP_SET_SHORT 
    156203        %s: Set nickname properties. 
     
    504551        again.  If this is not the first time you have seen this message please 
    505552        contact network support. 
     553NS_AJOIN_INVALID_CHAN 
     554        Channel name %s is invalid. Channel names must begin with '#'. 
     555NS_AJOIN_CHAN_NOT_REG 
     556        Channel %s is not registered with channel services. Unable to add 
     557        auto join entries for channels that are not registered. 
     558NS_AJOIN_ADD 
     559        AJOIN entry %s has been added. 
     560NS_AJOIN_ADDFAIL 
     561        AJOIN entry %s failed to be added. This may have been an internal error, 
     562        please try again shortly. If this is not the first time you have seen this 
     563        message please contact network support. 
     564NS_AJOIN_START 
     565        AJOIN list: 
     566NS_AJOIN_ENTRY 
     567        %d      %s 
     568NS_AJOIN_LIST_NONE 
     569        Your AJOIN list is empty and contains no entry. 
     570NS_AJOIN_DEL 
     571        AJOIN entry %s deleted. 
     572NS_AJOIN_DEL_NONE 
     573        %s was not found on the AJOIN list. 
     574NS_AJOIN_DEL_ERROR 
     575        An error occured attempting to delete the AJOIN entry.  Please try again. 
     576        If this is not the first time you have seen this message please contact 
     577        network support. 
    506578NS_CERT_ADD 
    507579        CERT list entry %s added to nickname %s. 
  • trunk/modules/nickserv.c

    r1686 r1692  
    105105static void m_cert_del(struct Service *, struct Client *, int, char *[]); 
    106106 
     107static void m_ajoin_add(struct Service *, struct Client *, int, char *[]); 
     108static void m_ajoin_list(struct Service *, struct Client *, int, char *[]); 
     109static void m_ajoin_del(struct Service *, struct Client *, int, char *[]); 
     110 
    107111static int m_set_flag(struct Service *, struct Client *, char *, char *, 
    108112    unsigned char (*)(Nickname *), int (*)(Nickname *, unsigned char)); 
     
    188192}; 
    189193 
     194static struct ServiceMessage ajoin_sub[] = { 
     195  { NULL, "ADD", 0, 0, 2, 0, IDENTIFIED_FLAG, NS_HELP_AJOIN_ADD_SHORT,  
     196    NS_HELP_AJOIN_ADD_LONG, m_ajoin_add }, 
     197  { NULL, "LIST", 0, 0, 0, 0, IDENTIFIED_FLAG, NS_HELP_AJOIN_LIST_SHORT,  
     198    NS_HELP_AJOIN_LIST_LONG, m_ajoin_list }, 
     199  { NULL, "DEL", 0, 1, 1, 0, IDENTIFIED_FLAG, NS_HELP_AJOIN_DEL_SHORT,  
     200    NS_HELP_AJOIN_DEL_LONG, m_ajoin_del }, 
     201  { NULL, NULL, 0, 0, 0, 0, 0, 0, 0, NULL } 
     202}; 
     203 
     204static struct ServiceMessage ajoin_msgtab = { 
     205  cert_sub, "AJOIN", 0, 1, 1, 0, IDENTIFIED_FLAG, NS_HELP_AJOIN_SHORT,  
     206  NS_HELP_AJOIN_LONG, NULL 
     207}; 
     208 
    190209static struct ServiceMessage access_sub[] = { 
    191210  { NULL, "ADD", 0, 1, 1, 0, IDENTIFIED_FLAG, NS_HELP_ACCESS_ADD_SHORT,  
     
    284303  mod_add_servcmd(&nickserv->msg_tree, &access_msgtab); 
    285304  mod_add_servcmd(&nickserv->msg_tree, &cert_msgtab); 
     305  mod_add_servcmd(&nickserv->msg_tree, &ajoin_msgtab); 
    286306  mod_add_servcmd(&nickserv->msg_tree, &ghost_msgtab); 
    287307  mod_add_servcmd(&nickserv->msg_tree, &link_msgtab); 
     
    11281148 
    11291149static void 
     1150m_ajoin_add(struct Service *service, struct Client *client, int parc,  
     1151    char *parv[]) 
     1152{ 
     1153  Nickname *nick = client->nickname; 
     1154  DBChannel *chan; 
     1155 
     1156  if(*parv[1] != '#') 
     1157  { 
     1158    reply_user(service, service, client, NS_AJOIN_INVALID_CHAN, parv[1]); 
     1159    return; 
     1160  } 
     1161 
     1162  chan = dbchannel_find(parv[1]); 
     1163  if(chan == NULL) 
     1164  { 
     1165    reply_user(service, service, client, NS_AJOIN_CHAN_NOT_REG, parv[1]); 
     1166    return; 
     1167  } 
     1168 
     1169  if(nickname_ajoin_add(nickname_get_id(nick), dbchannel_get_id(chan))) 
     1170    reply_user(service, service, client, NS_AJOIN_ADD, parv[1]); 
     1171  else 
     1172    reply_user(service, service, client, NS_AJOIN_ADDFAIL, parv[1]); 
     1173 
     1174  db_channel_free(chan); 
     1175} 
     1176 
     1177static void 
     1178m_ajoin_list(struct Service *service, struct Client *client, int parc,  
     1179    char *parv[]) 
     1180{ 
     1181  Nickname *nick; 
     1182  dlink_list list = { 0 }; 
     1183  dlink_node *ptr; 
     1184  int i = 1; 
     1185 
     1186  nick = client->nickname; 
     1187 
     1188  nickname_ajoin_list(nick->id, &list); 
     1189 
     1190  if(dlink_list_length(&list) == 0) 
     1191    reply_user(service, service, client, NS_AJOIN_LIST_NONE); 
     1192  else 
     1193    reply_user(service, service, client, NS_AJOIN_START); 
     1194 
     1195  DLINK_FOREACH(ptr, list.head) 
     1196  { 
     1197    char *ajoin; 
     1198    ajoin = ptr->data; 
     1199    reply_user(service, service, client, NS_AJOIN_ENTRY, i++, ajoin); 
     1200  } 
     1201 
     1202  nickname_ajoinlist_free(&list); 
     1203} 
     1204 
     1205static void 
     1206m_ajoin_del(struct Service *service, struct Client *client, int parc,  
     1207    char *parv[]) 
     1208{ 
     1209  Nickname *nick = client->nickname; 
     1210  DBChannel *chan; 
     1211  int ret; 
     1212 
     1213  chan = dbchannel_find(parv[1]); 
     1214  if(chan == NULL) 
     1215  { 
     1216    reply_user(service, service, client, NS_AJOIN_CHAN_NOT_REG, parv[1]); 
     1217    return; 
     1218  } 
     1219 
     1220  ret = nickname_ajoin_delete(nick->id, chan->id); 
     1221 
     1222  if(ret > 0) 
     1223    reply_user(service, service, client, NS_AJOIN_DEL, parv[1]); 
     1224  else if(ret == 0) 
     1225    reply_user(service, service, client, NS_AJOIN_DEL_NONE, parv[1]); 
     1226  else 
     1227    reply_user(service, service, client, NS_AJOIN_DEL_ERROR); 
     1228} 
     1229 
     1230static void 
    11301231m_regain(struct Service *service, struct Client *client, int parc, char *parv[]) 
    11311232{ 
  • trunk/modules/pgsql.c

    r1680 r1692  
    321321    "channel.id=channel_access.channel_id AND channel_access.group_id=$1 " 
    322322    "ORDER BY lower(channel.channel)", QUERY }, 
     323  { GET_AJOINS, "SELECT channel.channel FROM account_autojoin " 
     324    "JOIN channel ON channel.id=account_autojoin.id WHERE account_autojoin.account_id=$1", 
     325    QUERY }, 
     326  { INSERT_AJOIN, "INSERT INTO account_autojoin (account_id, channel_id) VALUES " 
     327    "($1, $2)", EXECUTE }, 
     328  { DELETE_AJOIN, "DELETE FROM account_autojoin WHERE account_id=$1 AND channel_id=$2", 
     329    EXECUTE }, 
    323330}; 
    324331 
  • trunk/sql/nickserv-pgsql.sql

    r1608 r1692  
    7070CREATE TABLE account_autojoin ( 
    7171  id                  SERIAL PRIMARY KEY, 
     72  account_id          INTEGER REFERENCES account(id) ON DELETE CASCADE NOT NULL, 
    7273  channel_id          INTEGER REFERENCES channel(id) ON DELETE CASCADE NOT NULL 
    7374); 
  • trunk/src/nickname.c

    r1643 r1692  
    739739 
    740740int 
     741nickname_ajoin_add(int account_id, int channel_id) 
     742{ 
     743  int ret = db_execute_nonquery(INSERT_AJOIN, "ii", account_id, channel_id); 
     744 
     745  if(ret == -1) 
     746    return FALSE; 
     747 
     748  return TRUE; 
     749} 
     750 
     751int 
     752nickname_ajoin_delete(int account_id, int channel_id) 
     753{ 
     754  return db_execute_nonquery(DELETE_AJOIN, "ii", account_id, channel_id); 
     755} 
     756 
     757int 
     758nickname_ajoin_list(int account_id, dlink_list *list) 
     759{ 
     760  result_set_t *results; 
     761  int error, i; 
     762 
     763  results = db_execute(GET_AJOINS, &error, "i", account_id); 
     764  if(results == NULL && error != 0) 
     765  { 
     766    ilog(L_CRIT, "nickname_ajoin_list: database error %d", error); 
     767    return -1; 
     768  } 
     769  else if(results == NULL) 
     770    return -1; 
     771 
     772  for(i = 0; i < results->row_count; i++) 
     773  { 
     774    row_t *row = &results->rows[i]; 
     775    char *entry = row->cols[0]; 
     776 
     777    dlinkAdd(entry, make_dlink_node(), list); 
     778  } 
     779 
     780  db_free_result(results); 
     781 
     782  return dlink_list_length(list); 
     783} 
     784 
     785void 
     786nickname_ajoinlist_free(dlink_list *list) 
     787{ 
     788  dlink_node *ptr, *next; 
     789  char *entry; 
     790 
     791  ilog(L_DEBUG, "Freeing nickname ajoin list %p of length %lu", list, 
     792      dlink_list_length(list)); 
     793 
     794  DLINK_FOREACH_SAFE(ptr, next, list->head) 
     795  { 
     796    entry = (char*)ptr->data; 
     797    MyFree(entry); 
     798    dlinkDelete(ptr, list); 
     799    free_dlink_node(ptr); 
     800  } 
     801} 
     802 
     803int 
    741804nickname_cert_list(Nickname *nick, dlink_list *list) 
    742805{