Complete.Org:
Mailing Lists:
Archives:
freeciv-dev:
June 2004: [Freeciv-Dev] Sorting the metaserver / LAN servers list. |
![]() |
[Freeciv-Dev] Sorting the metaserver / LAN servers list.[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
I got a bit bored of scrolling through the list of all the servers just to find the "best" one, so I wrote a small patch to sort the list in a way that the servers I think are most usefull apear first. David Kolf diff -ruN -Xfreeciv/diff_ignore freeciv/client/clinet.c freeciv+metasort/client/clinet.c --- freeciv/client/clinet.c 2004-05-19 22:14:26.000000000 +0200 +++ freeciv+metasort/client/clinet.c 2004-06-15 22:42:23.000000000 +0200 @@ -483,6 +483,121 @@ /************************************************************************** + Compare two metaserver entries so we can sort the list. + Currently this is just a quick hack - it might be better to + shift this to the user interface, so that the user can change the + sorting. - D. Kolf +**************************************************************************/ +static int compare_servers(const void *p1, const void *p2) +{ + struct server *s1, *s2; + + /* p1 and p2 are pointers to pointers */ + s1 = (struct server *) *(struct server **)p1; + s2 = (struct server *) *(struct server **)p2; + + /* First we check whether one of the servers has a compatible version + while the other has not. The one with the 'better' version should + come first. + The versions are considered compatible when they match up to the second dot + or to the end of the string. */ + + { + char *cur_ver = VERSION_STRING; + int dot = 0, incompatible1 = 0, incompatible2 = 0; + int i; + + for (i = 0; cur_ver[i] != 0 && dot < 2; i++) { + if (!incompatible1 && s1->version[i] != cur_ver[i]) { + incompatible1 = 1; + } + + if (!incompatible2 && s2->version[i] != cur_ver[i]) { + incompatible2 = 1; + } + + if (cur_ver[i] == '.') { + dot++; + } + } + + if (incompatible1 && !incompatible2) { + return 1; + } else if (!incompatible1 && incompatible2) { + return -1; + } + } + + /* Game status. */ + + { + char *status_strings[] = { + "Pregame", + "Waiting", + "Running", + "Game over" + }; + + int status1 = 4, status2 = 4; + int i; + + for (i = 0; i < 4; i++) { + if (strcmp(s1->status, status_strings[i]) == 0) { + status1 = i; + } + if (strcmp(s2->status, status_strings[i]) == 0) { + status2 = i; + } + } + + if (status1 < status2) { + return -1; + } else if (status1 > status2) { + return 1; + } + } + + /* Players. + The servers with the most players should apear first */ + { + int c1, c2; + + c1 = atoi(s1->players); + c2 = atoi(s2->players); + + if (c1 > c2) { + return -1; + } else if (c2 > c1) { + return 1; + } + } + + /* Servername */ + { + int c = strcmp(s1->name, s2->name); + + if (c != 0) return c; + } + + /* Port */ + { + int p1, p2; + + p1 = atoi(s1->port); + p2 = atoi(s2->port); + + if (p1 < p2) { + return -1; + } else if (p1 > p2) { + return 1; + } + } + + /* Still couldn't decide? */ + return 0; +} + +/************************************************************************** Create the list of servers from the metaserver The result must be free'd with delete_server_list() when no longer used @@ -634,6 +749,7 @@ } fz_fclose(f); + server_list_sort (server_list, compare_servers); return server_list; } @@ -843,6 +959,7 @@ pserver->metastring = mystrdup(metastring); server_list_insert(lan_servers, pserver); + server_list_sort (lan_servers, compare_servers); } else { return lan_servers; }
|