static void piPingerReply ( unsigned int IP, unsigned short port, int ping, const char * pingData, int pingDataLen, PEER peer ) { piPingerReplyData data; PEER_CONNECTION; // Find who sent the ping. ////////////////////////// data.peer = peer; data.IP = IP; data.ping = ping; TableMap(connection->players, piPingerReplyMapFn, &data); GSI_UNUSED(port); GSI_UNUSED(pingData); GSI_UNUSED(pingDataLen); }
void SBServerEnumKeys(SBServer server, SBServerKeyEnumFn KeyFn, void *instance) { SBServerEnumData ed; ed.EnumFn = KeyFn; ed.instance = instance; TableMap(server->keyvals, KeyMapF, &ed); }
void piKeyCachePlayerChangedNick ( PEER peer, const char * oldNick, const char * newNick ) { piPlayerChangedNickMapData data; PEER_CONNECTION; data.oldNick = oldNick; data.newNick = newNick; TableMap(connection->globalWatchCache, piPlayerChangedNickMap, &data); TableMap(connection->roomWatchCache[0], piPlayerChangedNickMap, &data); TableMap(connection->roomWatchCache[1], piPlayerChangedNickMap, &data); TableMap(connection->roomWatchCache[2], piPlayerChangedNickMap, &data); }
char *DumpBucketSet(bucketset_t set) { dumpdata_t data; if (set == NULL) set = g_buckets; assert(set); data.data = (char *)gsimalloc(128); //alloc an initial buffer data.data[0] = 0; data.len = 0; data.maxlen = 128; TableMap(set->buckets,DumpMap, &data); return data.data; }
// Returns a player to ping, or NULL if there's noone to ping. ////////////////////////////////////////////////////////////// static piPlayer * piPickXpingPlayer ( PEER peer ) { piPickXpingPlayerData data; PEER_CONNECTION; // Check for no players. //////////////////////// if(!connection->players || !TableCount(connection->players)) return NULL; // Find someone near the top of the list. ///////////////////////////////////////// data.peer = peer; data.player = NULL; TableMap(connection->players, piPickXpingPlayerMap, &data); return data.player; }
static void piKeyCacheRefresh ( PEER peer, RoomType roomType, const char * nick ) { int num; piSetupKeysMapData data; PEERBool getIP; PEERBool getFlags; piWatchKey watchKey; PEER_CONNECTION; assert(IN_ROOM || ENTERING_ROOM); if(!IN_ROOM && !ENTERING_ROOM) return; // Get the IP if we're pinging this room. ///////////////////////////////////////// if(!nick) getIP = (connection->pingRoom[roomType] || connection->alwaysRequestPlayerInfo)?PEERTrue:PEERFalse; else getIP = PEERFalse; // Check if we're already getting the IP. ///////////////////////////////////////// if(getIP) { watchKey.key = "username"; getIP = (PEERBool)(!TableLookup(connection->roomWatchKeys[roomType], &watchKey)); } // Don't get flags on a player - he just joined, and will set them. /////////////////////////////////////////////////////////////////// getFlags = (PEERBool)(nick == NULL); // Check for a b_flags watch key. ///////////////////////////////// if(getFlags) { watchKey.key = "b_flags"; getFlags = (PEERBool)(!(TableLookup(connection->globalWatchKeys[roomType], &watchKey) || TableLookup(connection->roomWatchKeys[roomType], &watchKey))); } data.next = 0; num = TableCount(connection->globalWatchKeys[roomType]); if(num) { data.keys = (char **)gsimalloc(sizeof(char *) * num); if(!data.keys) return; TableMap(connection->globalWatchKeys[roomType], piSetupKeysMap, &data); assert(data.next == num); chatGetGlobalKeysA(connection->chat, nick?nick:ROOM, num, (const char **)data.keys, piGetGlobalKeysCallback, peer, CHATFalse); gsifree(data.keys); } if(!nick) { data.next = 0; num = TableCount(connection->roomWatchKeys[roomType]); if(getIP) num++; if(getFlags) num++; if(num) { data.keys = (char **)gsimalloc(sizeof(char *) * num); if(!data.keys) return; TableMap(connection->roomWatchKeys[roomType], piSetupKeysMap, &data); if(getIP) data.keys[data.next++] = "username"; if(getFlags) data.keys[data.next++] = "b_flags"; assert(data.next == num); chatGetChannelKeysA(connection->chat, ROOM, nick?nick:"*", num, (const char **)data.keys, piGetRoomKeysCallback, peer, CHATFalse); gsifree(data.keys); } } }