schan_members.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*
  2. * Copyright (C) 2000,2001 Florian Sander
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation; either version 2
  7. * of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. static int schan_members_compare(void *data, void *key)
  19. {
  20. if (!rfc_casecmp(((struct stats_member *)data)->nick, (char *)key))
  21. return 1;
  22. return 0;
  23. }
  24. static int schan_members_expmem(void *data)
  25. {
  26. struct stats_member *p = (struct stats_member *)data;
  27. int size = 0;
  28. size += sizeof(struct stats_member);
  29. size += strlen(p->nick) + 1;
  30. size += strlen(p->uhost) + 1;
  31. return size;
  32. }
  33. static void schan_members_free(void *data)
  34. {
  35. struct stats_member *p = (struct stats_member *)data;
  36. nfree(p->nick);
  37. nfree(p->uhost);
  38. nfree(p);
  39. }
  40. static void schan_members_llist_init(struct llist_header *head)
  41. {
  42. head->root = NULL;
  43. head->size = 0;
  44. head->comparedata = schan_members_compare;
  45. head->expmemdata = schan_members_expmem;
  46. head->freedata = schan_members_free;
  47. }
  48. static struct stats_member *schan_members_create()
  49. {
  50. struct stats_member *nm;
  51. nm = nmalloc(sizeof(struct stats_member));
  52. nm->nick = NULL;
  53. nm->uhost = NULL;
  54. nm->joined = 0;
  55. nm->last = now;
  56. nm->user = NULL;
  57. nm->stats = NULL;
  58. nm->spoken_lines = 0;
  59. return nm;
  60. }
  61. static void schan_members_join(struct llist_header *head, char *nick, char *uhost, char *user, char *chan)
  62. {
  63. struct stats_member *m;
  64. char *host;
  65. #ifndef NO_EGG
  66. struct chanset_t *eggchan;
  67. #endif
  68. m = schan_members_create();
  69. m->nick = nmalloc(strlen(nick) + 1);
  70. strcpy(m->nick, nick);
  71. m->uhost = nmalloc(strlen(uhost) + 1);
  72. strcpy(m->uhost, uhost);
  73. m->joined = now;
  74. if (user) {
  75. m->user = findsuser_by_name(user);
  76. if (!m->user) {
  77. m->user = addsuser(user, now, now);
  78. debug1("Stats.Mod: Created suserrec for %s.", user);
  79. }
  80. } else {
  81. host = nmalloc(strlen(nick) + 1 + strlen(uhost) + 1);
  82. sprintf(host, "%s!%s", nick, uhost);
  83. m->user = findsuser(host);
  84. nfree(host);
  85. }
  86. if (m->user) {
  87. m->user->laston = now;
  88. m->stats = findlocstats(chan, m->user->user);
  89. if (!m->stats)
  90. m->stats = initstats(chan, m->user->user);
  91. }
  92. #ifndef NO_EGG
  93. eggchan = findchan_by_dname(chan);
  94. if (chan)
  95. m->eggmember = ismember(eggchan, nick);
  96. if (!m->eggmember)
  97. debug2("Warning[stats.mod]: Couldn't find eggmember for %s in %s.", nick, chan);
  98. #endif
  99. llist_append(head, (void *) m);
  100. }
  101. static void schan_members_update(struct stats_member *m, char *chan)
  102. {
  103. char *host;
  104. #ifndef NO_EGG
  105. struct userrec *u;
  106. #endif
  107. m->user = NULL;
  108. host = nmalloc(strlen(m->nick) + 1 + strlen(m->uhost) + 1);
  109. sprintf(host, "%s!%s", m->nick, m->uhost);
  110. #ifndef NO_EGG
  111. u = get_user_by_host(host);
  112. if (u) {
  113. m->user = findsuser_by_name(u->handle);
  114. if (!m->user) {
  115. m->user = addsuser(u->handle, now, now);
  116. debug1("Stats.Mod: Created suserrec for %s.", u->handle);
  117. }
  118. } else
  119. #endif
  120. m->user = findsuser(host);
  121. nfree(host);
  122. if (m->user) {
  123. m->stats = findlocstats(chan, m->user->user);
  124. if (!m->stats)
  125. m->stats = initstats(chan, m->user->user);
  126. }
  127. }
  128. static void schan_members_leave(struct llist_header *head, char *nick)
  129. {
  130. Assert(head);
  131. llist_delete(head, (void *)nick);
  132. }
  133. static void schan_members_rename(struct llist_header *head, char *oldnick, char *newnick)
  134. {
  135. struct stats_member *m;
  136. m = llist_find(head, (void *)oldnick);
  137. if (!m)
  138. return;
  139. Assert(newnick);
  140. m->nick = nrealloc(m->nick, strlen(newnick) + 1);
  141. strcpy(m->nick, newnick);
  142. }
  143. static struct stats_member *schan_members_find(struct llist_header *head, char *nick)
  144. {
  145. return llist_find(head, (void *)nick);
  146. }
  147. static struct stats_member *schan_members_getfirst(struct llist_header *head)
  148. {
  149. return (struct stats_member *)llist_getfirst(head);
  150. }
  151. static struct stats_member *schan_members_getnext(struct llist_header *head)
  152. {
  153. return (struct stats_member *)llist_getnext(head);
  154. }
  155. static int schan_members_count(struct llist_header *head)
  156. {
  157. return head->size;
  158. }