]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu/custom/extresponse.qc
ext response system added; NOTE: two outstanding things:
[divverent/nexuiz.git] / data / qcsrc / menu / custom / extresponse.qc
1 bool _Nex_ExtResponseSystem_RequestsSent;
2 bool _Nex_ExtResponseSystem_VersionHandled;
3 bool _Nex_ExtResponseSystem_BanlistHandled;
4 string _Nex_ExtResponseSystem_UpdateTo;
5 float _Nex_ExtResponseSystem_RetryTime;
6 bool _Nex_ExtResponseSystem_UpdateStringSet;
7 bool _Nex_ExtResponseSystem_Initialized;
8
9 void() Item_Nex_ExtResponseSystem_SendQuery =
10 {
11         dprint("Sending extended response requests...\n");
12         localcmd(strcat("packet update.alientrap.org:27950 \"getExtResponse checkUpdates nexuiz ", cvar_string("g_nexuizversion"), "\"\n"));
13         localcmd(strcat("packet update.alientrap.org:27950 \"getExtResponse getBanlist nexuiz\"\n"));
14         _Nex_ExtResponseSystem_RequestsSent = TRUE;
15         _Nex_ExtResponseSystem_RetryTime = Timer_Time + 10;
16 }
17
18 void(float argc) Item_Nex_ExtResponseSystem_Parse =
19 {
20         float i;
21         string banlist;
22         dprint("Received extended response packet from ", argv(0), "\n");
23         if(!_Nex_ExtResponseSystem_RequestsSent)
24         {
25                 dprint("  But I haven't sent a request yet! Ignoring.\n");
26                 return;
27         }
28         if(argv(1) == "noUpdateAvailable")
29         {
30                 if(_Nex_ExtResponseSystem_VersionHandled)
31                 {
32                         dprint("  duplicated update notice, ignored\n");
33                         return;
34                 }
35                 _Nex_ExtResponseSystem_VersionHandled = TRUE;
36         }
37         else if(argv(1) == "updateAvailable")
38         {
39                 if(_Nex_ExtResponseSystem_VersionHandled)
40                 {
41                         dprint("  duplicated update notice, ignored\n");
42                         return;
43                 }
44                 _Nex_ExtResponseSystem_VersionHandled = TRUE;
45                 _Nex_ExtResponseSystem_UpdateTo = strzone(argv(2)); // note: only one packet can be handled, so this can't be a leak
46                 //Nex_MessageBox("Update available!", strcat("We recommend you to download Nexuiz ", _Nex_ExtResponseSystem_UpdateTo, " from http://www.nexuiz.com/"), "Ok", "Download in background", Util_NullFunction, Util_NullFunction);
47         }
48         else if(argv(1) == "banlist")
49         {
50                 if(_Nex_ExtResponseSystem_BanlistHandled)
51                 {
52                         dprint("  duplicated banlist notice\n");
53                         return;
54                 }
55                 _Nex_ExtResponseSystem_BanlistHandled = TRUE;
56                 dprint("  BANLIST RECEIVED:");
57
58                 if(cvar_string("net_banlist") == cvar_string("_alientrap_net_banlist"))
59                 {
60                         banlist = ""; // IP of www.alientrap.org
61                         for(i = 0; i < argc - 2; ++i)
62                         {
63                                 banlist = strcat(banlist, argv(i + 2), " ");
64                                 dprint(" ", argv(i + 2));
65                         }
66                         dprint(" (", ftos(i), " items)\n");
67                         cvar_set("net_banlist", banlist);
68                         cvar_set("_alientrap_net_banlist", banlist);
69                 }
70                 else
71                 {
72                         for(i = 0; i < argc - 2; ++i)
73                                 dprint(" ", argv(i + 2));
74                         dprint(" (", ftos(i), " items; overridden by user setting)\n");
75                 }
76         }
77         else
78                 dprint("  UNKNOWN RESPONSE TYPE: ", argv(1), "\n");
79 }
80
81 void() Item_Nex_ExtResponseSystem_CheckForResponse =
82 {
83         local string s;
84         local float argc;
85         while(strlen((s = getextresponse())))
86         {
87                 argc = tokenize(s);
88                 Item_Nex_ExtResponseSystem_Parse(argc);
89         }
90 }
91
92 void() Item_Nex_ExtResponseSystem_Update =
93 {
94         Item_Nex_ExtResponseSystem_CheckForResponse();
95
96         if(!_Nex_ExtResponseSystem_VersionHandled)
97                 if(Timer_Time > _Nex_ExtResponseSystem_RetryTime)
98                         Item_Nex_ExtResponseSystem_SendQuery();
99
100         if(_Nex_ExtResponseSystem_UpdateTo)
101                 if(!_Nex_ExtResponseSystem_UpdateStringSet)
102                 {
103                         local string filler;
104                         local float count;
105
106                         filler = "";
107                         for(count = strlen(_Nex_ExtResponseSystem_UpdateTo); count < 5; ++count)
108                                 filler = strcat(filler, " ");
109
110                         String_EntitySet(self, text, strcat(filler, "Update to Nexuiz ", _Nex_ExtResponseSystem_UpdateTo, " on:"));
111                         self.size = '0 0 0';
112                         _Nex_ExtResponseSystem_UpdateStringSet = TRUE;
113                 }
114
115         Item_Label_Update();
116 }
117
118 void() Item_Nex_ExtResponseSystem_Spawn =
119 {
120         if(_Nex_ExtResponseSystem_Initialized)
121                 objerror("Item_Nex_ExtResponseSystem is a singleton!");
122         _Nex_ExtResponseSystem_Initialized = TRUE;
123         Item_Label_Spawn();
124         self._update = Item_Nex_ExtResponseSystem_Update;
125 }