summary refs log tree commit diff stats
path: root/hslist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hslist.cpp')
-rw-r--r--hslist.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/hslist.cpp b/hslist.cpp index d2901b4..ec99a77 100644 --- a/hslist.cpp +++ b/hslist.cpp
@@ -76,10 +76,123 @@ std::vector<Highscore> HighscoreList::getLocalHighscores()
76 76
77std::vector<Highscore> HighscoreList::getGlobalHighscores() 77std::vector<Highscore> HighscoreList::getGlobalHighscores()
78{ 78{
79 IPaddress ipaddress;
79 80
81 if (SDLNet_ResolveHost(&ipaddress, "other.fourisland.com", 80) == -1)
82 {
83 printf("Could not resolve host \"other.fourisland.com\": %s\n", SDLNet_GetError());
84 throw 1;
85 }
86
87 TCPsocket tcpsock = SDLNet_TCP_Open(&ipaddress);
88 if (!tcpsock)
89 {
90 printf("Could not connect to host \"other.fourisland.com\": %s\n", SDLNet_GetError());
91 throw 2;
92 }
93
94 char* headers = "GET /mol/hslist.php HTTP/1.1\nHost: other.fourisland.com\nUser-Agent: Maze Of Life v2.0\nAccept: text/plain\nKeep-Alive: 300\nConnection: keep-alive\n\n";
95 if (SDLNet_TCP_Send(tcpsock, headers, strlen(headers)+1) < strlen(headers))
96 {
97 printf("Connection closed by peer: %s\n", SDLNet_GetError());
98 throw 3;
99 }
100
101 std::stringstream download(std::stringstream::in | std::stringstream::out);
102 char hslist[1024];
103 SDLNet_TCP_Recv(tcpsock, hslist, 1024);
104 download << hslist;
105 SDLNet_TCP_Close(tcpsock);
106
107 char temps[256];
108 download.getline(temps,256);
109 while (strlen(temps) != 1)
110 {
111 download.getline(temps,256);
112 }
113
114 std::vector<Highscore> temp = std::vector<Highscore>();
115 int scores;
116 download.getline(temps, 256);
117 if (sscanf(temps, "%d%*c", &scores) != 1)
118 {
119 printf("Recieved data is of an invalid format: %s\n", temps);
120 throw 4;
121 }
122
123 for (int i=0; i<scores; i++)
124 {
125 int namelen;
126 char namelens[13];
127 char* name = (char*) calloc(25, sizeof(char));
128 int score;
129 download.getline(temps, 256);
130
131 if (sscanf(temps, "%d", &namelen) != 1)
132 {
133 printf("Recieved data is of an invalid format: %s\n", temps);
134 throw 4;
135 }
136
137 sprintf(namelens, "%%*d%%%dc", namelen);
138
139 if (sscanf(temps, namelens, name) != 1)
140 {
141 printf("Recieved data is of an invalid format: %s\n", temps);
142 throw 4;
143 }
144
145 sprintf(namelens, "%%*d%%*%dc%%d%%*c", namelen);
146
147 if (sscanf(temps, namelens, &score) != 1)
148 {
149 printf("Recieved data is of an invalid format: %s\n", temps);
150 throw 4;
151 }
152
153 Highscore h = Highscore(name, score);
154 h.setRank(i+1);
155
156 temp.push_back(h);
157 }
158
159 return temp;
80} 160}
81 161
82LocalHighscoreList::LocalHighscoreList() 162LocalHighscoreList::LocalHighscoreList()
83{ 163{
84 this->hslist = getLocalHighscores(); 164 this->hslist = getLocalHighscores();
85} 165}
166
167GlobalHighscoreList::GlobalHighscoreList()
168{
169 fail = false;
170
171 try
172 {
173 this->hslist = getGlobalHighscores();
174 } catch (int e)
175 {
176 fail = true;
177 }
178}
179
180SDL_Surface* GlobalHighscoreList::render()
181{
182 if (fail)
183 {
184 SDL_Surface* tmp = SDL_CreateRGBSurface(SDL_SWSURFACE || SDL_SRCCOLORKEY, 480, 480, 32, 0,0,0,0);
185 Uint32 bgColor = SDL_MapRGB(tmp->format, 255, 255, 255);
186 SDL_FillRect(tmp, NULL, bgColor);
187 SDL_SetColorKey(tmp, SDL_SRCCOLORKEY, bgColor);
188 TTF_Font* dataFont = loadFont(25);
189 SDL_Color fontColor = {0, 0, 0, 0};
190 SDL_Surface* text = TTF_RenderText_Blended(dataFont, "Error retrieving highscores", fontColor);
191 SDL_Rect tSpace = {240-(text->w/2), 240-(text->h/2), text->w, text->h};
192 SDL_BlitSurface(text, NULL, tmp, &tSpace);
193
194 return tmp;
195 } else {
196 return super::render();
197 }
198}