X-Git-Url: http://winboard.nl/cgi-bin?p=xboard.git;a=blobdiff_plain;f=backend.c;h=304acc21cc5ea023eec943d5dcc5a81fe93856b5;hp=2f96d082192b8b9d32a642e687d5e23f170bf726;hb=d016fb202fe45795e630e22ba516e754cf694ea6;hpb=f585310d39fc64bf99d19aa67ba76ba9d6e13909 diff --git a/backend.c b/backend.c index 2f96d08..304acc2 100644 --- a/backend.c +++ b/backend.c @@ -242,6 +242,9 @@ VariantClass currentlyInitializedVariant; /* [HGM] variantswitch */ int lastIndex = 0; /* [HGM] autoinc: last game/position used in match mode */ int opponentKibitzes; int lastSavedGame; /* [HGM] save: ID of game */ +char chatPartner[MAX_CHAT][MSG_SIZ]; /* [HGM] chat: list of chatting partners */ +extern int chatCount; +int chattingPartner; /* States for ics_getting_history */ #define H_FALSE 0 @@ -456,16 +459,17 @@ AppData appData; Board boards[MAX_MOVES]; /* [HGM] Following 7 needed for accurate legality tests: */ -char epStatus[MAX_MOVES]; -char castlingRights[MAX_MOVES][BOARD_SIZE]; // stores files for pieces with castling rights or -1 -char castlingRank[BOARD_SIZE]; // and corresponding ranks -char initialRights[BOARD_SIZE], FENcastlingRights[BOARD_SIZE], fileRights[BOARD_SIZE]; +signed char epStatus[MAX_MOVES]; +signed char castlingRights[MAX_MOVES][BOARD_SIZE]; // stores files for pieces with castling rights or -1 +signed char castlingRank[BOARD_SIZE]; // and corresponding ranks +signed char initialRights[BOARD_SIZE], FENcastlingRights[BOARD_SIZE], fileRights[BOARD_SIZE]; int nrCastlingRights; // For TwoKings, or to implement castling-unknown status int initialRulePlies, FENrulePlies; char FENepStatus; FILE *serverMoves = NULL; // next two for broadcasting (/serverMoves option) int loadFlag = 0; int shuffleOpenings; +int mute; // mute all sounds ChessSquare FIDEArray[2][BOARD_SIZE] = { { WhiteRook, WhiteKnight, WhiteBishop, WhiteQueen, @@ -1452,6 +1456,13 @@ read_from_player(isr, closure, message, count, error) } void +KeepAlive() +{ // [HGM] alive: periodically send dummy (date) command to ICS to prevent time-out + SendToICS("date\n"); + if(appData.keepAlive) ScheduleDelayedEvent(KeepAlive, appData.keepAlive*60*1000); +} + +void SendToICS(s) char *s; { @@ -2082,6 +2093,8 @@ read_from_ics(isr, closure, data, count, error) int tkind; int backup; /* [DM] For zippy color lines */ char *p; + char talker[MSG_SIZ]; // [HGM] chat + int channel; if (appData.debugMode) { if (!error) { @@ -2262,6 +2275,12 @@ read_from_ics(isr, closure, data, count, error) parse[parse_pos++] = buf[i]; if (buf[i] == '\n') { parse[parse_pos] = NULLCHAR; + if(chattingPartner>=0) { + char mess[MSG_SIZ]; + sprintf(mess, "%s%s", talker, parse); + OutputChatMessage(chattingPartner, mess); + chattingPartner = -1; + } else if(!suppressKibitz) // [HGM] kibitz AppendComment(forwardMostMove, StripHighlight(parse)); else { // [HGM kibitz: divert memorized engine kibitz to engine-output window @@ -2398,6 +2417,45 @@ read_from_ics(isr, closure, data, count, error) } } // [HGM] kibitz: end of patch +//if(appData.debugMode) fprintf(debugFP, "hunt for tell, buf = %s\n", buf+i); + + // [HGM] chat: intercept tells by users for which we have an open chat window + channel = -1; + if(started == STARTED_NONE && (looking_at(buf, &i, "* tells you:") || looking_at(buf, &i, "* says:") || + looking_at(buf, &i, "* whispers:") || + looking_at(buf, &i, "*(*):") && (sscanf(star_match[1], "%d", &channel),1) || + looking_at(buf, &i, "*(*)(*):") && sscanf(star_match[2], "%d", &channel) == 1 )) { + int p; + sscanf(star_match[0], "%[^(]", talker+1); // strip (C) or (U) off ICS handle + chattingPartner = -1; + + if(channel >= 0) // channel broadcast; look if there is a chatbox for this channel + for(p=0; p