Author: DNB
Date: Wed Mar 30 13:50:25 2005
New Revision: 66
Modified:
branches/3.0/ChangeLog
branches/3.0/TriviaCmds.c
branches/3.0/TriviaServ.h
branches/3.0/TriviaUser.c
Log:
add score tracking per channel (still not saving to disk yet)
Modified: branches/3.0/ChangeLog
==============================================================================
--- branches/3.0/ChangeLog (original)
+++ branches/3.0/ChangeLog Wed Mar 30 13:50:25 2005
@@ -2,5 +2,6 @@
Fish (F), Mark (M), DeadNotBuried (D)
==============================================================================
3.0.a3-dev
+ - add score tracking per channel (not saving yet though) (D)
- add OPCHAN command for channel ops to set if Trivia gets Channel Op
status on joining or not (D)
Modified: branches/3.0/TriviaCmds.c
==============================================================================
--- branches/3.0/TriviaCmds.c (original)
+++ branches/3.0/TriviaCmds.c Wed Mar 30 13:50:25 2005
@@ -98,6 +98,7 @@
return NS_FAILURE;
}
tc->active = 1;
+ tc->curquest = NULL;
irc_prefmsg (tvs_bot, cmdparams->source, "Starting Trivia in %s shortly", tc->name);
irc_chanprivmsg (tvs_bot, tc->name, "%s has activated Trivia. Get Ready for the first question!", cmdparams->source->name);
return NS_SUCCESS;
Modified: branches/3.0/TriviaServ.h
==============================================================================
--- branches/3.0/TriviaServ.h (original)
+++ branches/3.0/TriviaServ.h Wed Mar 30 13:50:25 2005
@@ -53,7 +53,7 @@
char description[QUESTSIZE];
/* actually just the striped filename */
char name[QUESTSIZE];
-}QuestionFiles;
+} QuestionFiles;
typedef struct Questions {
long qn;
@@ -64,7 +64,7 @@
pcre *regexp;
int hints;
int points;
-}Questions;
+} Questions;
typedef struct TriviaChan {
char name[MAXCHANLEN];
@@ -77,13 +77,23 @@
int opchan;
Questions *curquest;
list_t *qfl;
-}TriviaChan;
+} TriviaChan;
-typedef struct TriviaScore {
- char nick[MAXNICK];
+typedef struct TriviaChannelScore {
+ char *prev;
+ char cname[MAXCHANLEN];
int score;
- time_t lastused;
-}TriviaScore;
+ int lastused;
+ char *next;
+} TriviaChannelScore;
+
+typedef struct TriviaUser {
+ char lastusednick[MAXNICK];
+ char lastregnick[MAXNICK];
+ int networkscore;
+ int lastused;
+ TriviaChannelScore *tcs;
+} TriviaUser;
list_t *qfl;
hash_t *tch;
@@ -115,6 +125,7 @@
void tvs_addpoints(Client *u, TriviaChan *tc);
int QuitUser(CmdParams* cmdparams);
int KillUser(CmdParams* cmdparams);
+int UserLeaving(Client *u);
/* TriviaCmds.c */
int tvs_cmd_score (CmdParams* cmdparams);
Modified: branches/3.0/TriviaUser.c
==============================================================================
--- branches/3.0/TriviaUser.c (original)
+++ branches/3.0/TriviaUser.c Wed Mar 30 13:50:25 2005
@@ -31,35 +31,67 @@
#include "TriviaServ.h"
/*
- * Adds points to user
- *
- * ToDo : 1. add network and channel points list
- * to keep channels and network points seperate
+ * Adds points to user for channel and network
*/
void tvs_addpoints(Client *u, TriviaChan *tc)
{
- TriviaScore *ts;
+ TriviaUser *tu;
+ TriviaChannelScore *ts, *tsn;
Questions *qe;
if (!u | !tc->curquest) {
nlog(LOG_WARNING, "Can't find user for AddPoints?!");
return;
}
- ts = (TriviaScore *) GetUserModValue (u);
- if (!ts) {
+ tu = (TriviaUser *)GetUserModValue(u);
+ if (!tu) {
+ tu = ns_calloc(sizeof(TriviaUser));
if (!(u->user->Umode & UMODE_REGNICK)) {
- /* not a registered user */
- irc_prefmsg (tvs_bot, u, "If you want your score to be kept between sessions, you should register your nickname");
+ tu->lastregnick[0] = '\0';
+ } else {
+ strlcpy(tu->lastregnick, u->name, MAXNICK);
+ }
+ tu->lastusednick[0] = '\0';
+ tu->networkscore = 0;
+ tu->lastused = 0;
+ ts = ns_calloc(sizeof(TriviaChannelScore));
+ tu->tcs = ts;
+ ts->prev = NULL;
+ strlcpy(ts->cname, tc->c->name, MAXNICK);
+ ts->score = 0;
+ ts->lastused = 0;
+ ts->next = NULL;
+ SetUserModValue (u, tu);
+ } else {
+ ts = tu->tcs;
+ /* not really a perm loop, just looks like one */
+ while (0 == 0) {
+ if (!ircstrcasecmp(tc->c->name, ts->cname)) {
+ break;
+ }
+ if (ts->next == NULL) {
+ tsn = ns_calloc(sizeof(TriviaChannelScore));
+ tsn->prev = ts;
+ strlcpy(tsn->cname, tc->c->name, MAXNICK);
+ tsn->score = 0;
+ tsn->lastused = 0;
+ tsn->next = NULL;
+ ts->next = tsn;
+ }
+ ts = ts->next;
}
- ts = ns_calloc(sizeof(TriviaScore));
- strlcpy(ts->nick, u->name, MAXNICK);
- SetUserModValue (u, ts);
}
-
+ strlcpy(tu->lastusednick, u->name, MAXNICK);
+ if (tu->lastregnick[0] == '\0' && tu->lastused < (me.now - 900)) {
+ irc_prefmsg (tvs_bot, u, "If you want your score to be kept between sessions, you should register your nickname");
+ }
+ tu->networkscore += TriviaServ.defaultpoints;
+ tu->lastused = me.now;
qe = tc->curquest;
- ts->score = ts->score + qe->points;
+ ts->score += qe->points;
ts->lastused = me.now;
- irc_chanprivmsg (tvs_bot, tc->name, "%s now has %d Points", u->name, ts->score);
+ irc_chanprivmsg (tvs_bot, tc->name, "%s now has %d Points in %s, and %d points network wide", u->name, ts->score, tc->c->name, tu->networkscore);
+ return;
}
/*
@@ -72,29 +104,33 @@
* and add them to the current users score, removing the
* old from the database if they change nicks and identify again)
*/
-int QuitUser (CmdParams* cmdparams)
-{
- TriviaScore *ts;
-
- ts = (TriviaScore *) GetUserModValue (cmdparams->source);
- if (ts) {
- /* XXX Save User */
- ns_free(ts);
- }
- return NS_SUCCESS;
+int QuitUser (CmdParams* cmdparams) {
+ return UserLeaving(cmdparams->source);
}
-/*
- * Same as QuitUser
-*/
-int KillUser (CmdParams* cmdparams)
-{
- TriviaScore *ts;
+int KillUser (CmdParams* cmdparams) {
+ return UserLeaving(cmdparams->target);
+}
- ts = (TriviaScore *) GetUserModValue (cmdparams->target);
- if (ts) {
- /* XXX Save User */
+int UserLeaving (Client *u) {
+ TriviaUser *tu;
+ TriviaChannelScore *ts, *tsp;
+
+ tu = (TriviaUser *)GetUserModValue(u);
+ if (tu) {
+ ts = tu->tcs;
+ while (ts->next != NULL) {
+ ts = ts->next;
+ }
+ while (ts->prev != NULL) {
+ tsp = ts;
+ ts = tsp->prev;
+ ts->next = NULL;
+ ns_free(tsp);
+ }
+ tu->tcs = NULL;
ns_free(ts);
+ ns_free(tu);
}
return NS_SUCCESS;
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.