mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			253 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			253 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | |
|     Originally from /Source/gg2/Scripts/Plugins/loadserverplugins.gml in Gang Garrison 2
 | |
| 
 | |
|     Copyright (C) 2008-2013 Faucet Software
 | |
|     http://www.ganggarrison.com
 | |
| 
 | |
|     This program is free software; 
 | |
|     you can redistribute it and/or modify it under the terms of the GNU General Public License
 | |
|     as published by the Free Software Foundation; either version 3 of the License, or (at your option)
 | |
|     any later version.
 | |
|     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
 | |
|     without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 | |
|     See the GNU General Public License for more details.
 | |
|     You should have received a copy of the GNU General Public License along with this program; if not,
 | |
|     see <http://www.gnu.org/licenses>.
 | |
| 
 | |
|     Additional permission under GNU GPL version 3 section 7
 | |
|     If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library, 
 | |
|     the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
 | |
|     the licensors of this Program grant you additional permission to convey the resulting work.
 | |
| */
 | |
| 
 | |
| // loads plugins from ganggarrison.com asked for by server
 | |
| // argument0 - comma separated plugin list (pluginname@md5hash)
 | |
| // returns true on success, false on failure
 | |
| var list, hashList, text, i, pluginname, pluginhash, realhash, url, handle, filesize, progress, tempfile, tempdir, failed, lastContact, isCached;
 | |
| 
 | |
| failed = false;
 | |
| list = ds_list_create();
 | |
| lastContact = 0;
 | |
| isCached = false;
 | |
| isDebug = false;
 | |
| hashList = ds_list_create();
 | |
| 
 | |
| // split plugin list string
 | |
| list = split(argument0, ',');
 | |
| 
 | |
| // Split hashes from plugin names
 | |
| for (i = 0; i < ds_list_size(list); i += 1)
 | |
| {
 | |
|     text = ds_list_find_value(list, i);
 | |
|     pluginname = string_copy(text, 0, string_pos("@", text) - 1);
 | |
|     pluginhash = string_copy(text, string_pos("@", text) + 1, string_length(text) - string_pos("@", text));
 | |
|     ds_list_replace(list, i, pluginname);
 | |
|     ds_list_add(hashList, pluginhash);
 | |
| }
 | |
| 
 | |
| // Check plugin names and check for duplicates
 | |
| for (i = 0; i < ds_list_size(list); i += 1)
 | |
| {
 | |
|     pluginname = ds_list_find_value(list, i);
 | |
|     
 | |
|     // invalid plugin name
 | |
|     if (!checkpluginname(pluginname))
 | |
|     {
 | |
|         show_message('Error loading server-sent plugins - invalid plugin name:#"' + pluginname + '"');
 | |
|         return false;
 | |
|     }
 | |
|     // is duplicate
 | |
|     else if (ds_list_find_index(list, pluginname) != i)
 | |
|     {
 | |
|         show_message('Error loading server-sent plugins - duplicate plugin:#"' + pluginname + '"');
 | |
|         return false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Download plugins
 | |
| for (i = 0; i < ds_list_size(list); i += 1)
 | |
| {
 | |
|     pluginname = ds_list_find_value(list, i);
 | |
|     pluginhash = ds_list_find_value(hashList, i);
 | |
|     isDebug = file_exists(working_directory + "\ServerPluginsDebug\" + pluginname + ".zip");
 | |
|     isCached = file_exists(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash);
 | |
|     tempfile = temp_directory + "\" + pluginname + ".zip.tmp";
 | |
|     tempdir = temp_directory + "\" + pluginname + ".tmp";
 | |
| 
 | |
|     // check to see if we have a local copy for debugging
 | |
|     if (isDebug)
 | |
|     {
 | |
|         file_copy(working_directory + "\ServerPluginsDebug\" + pluginname + ".zip", tempfile);
 | |
|         // show warning
 | |
|         if (global.isHost)
 | |
|         {
 | |
|             show_message(
 | |
|                 "Warning: server-sent plugin '"
 | |
|                 + pluginname
 | |
|                 + "' is being loaded from ServerPluginsDebug. Make sure clients have the same version, else they may be unable to connect."
 | |
|             );
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             show_message(
 | |
|                 "Warning: server-sent plugin '"
 | |
|                 + pluginname
 | |
|                 + "' is being loaded from ServerPluginsDebug. Make sure the server has the same version, else you may be unable to connect."
 | |
|             );
 | |
|         }
 | |
|     }
 | |
|     // otherwise, check if we have it cached
 | |
|     else if (isCached)
 | |
|     {
 | |
|         file_copy(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash, tempfile);
 | |
|     }
 | |
|     // otherwise, download as usual
 | |
|     else
 | |
|     {
 | |
|         // construct the URL
 | |
|         // http://www.ganggarrison.com/plugins/$PLUGINNAME$@$PLUGINHASH$.zip)
 | |
|         url = PLUGIN_SOURCE + pluginname + "@" + pluginhash + ".zip";
 | |
|         
 | |
|         // let's make the download handle
 | |
|         handle = httpGet(url, -1);
 | |
|         
 | |
|         // download it
 | |
|         while (!httpRequestStatus(handle)) {
 | |
|             // prevent game locking up
 | |
|             io_handle();
 | |
| 
 | |
|             httpRequestStep(handle);
 | |
|             
 | |
|             if (!global.isHost) {
 | |
|                 // send ping if we haven't contacted server in 20 seconds
 | |
|                 // we need to do this to keep the connection open
 | |
|                 if (current_time-lastContact > 20000) {
 | |
|                     write_byte(global.serverSocket, PING);
 | |
|                     socket_send(global.serverSocket);
 | |
|                     lastContact = current_time;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // draw progress bar since they may be waiting a while
 | |
|             filesize = httpRequestResponseBodySize(handle);
 | |
|             progress = httpRequestResponseBodyProgress(handle);
 | |
|             draw_background_ext(background_index[0], 0, 0, background_xscale[0], background_yscale[0], 0, c_white, 1);
 | |
|             draw_set_color(c_white);
 | |
|             draw_set_alpha(1);
 | |
|             draw_set_halign(fa_left);
 | |
|             draw_rectangle(50, 550, 300, 560, 2);
 | |
|             draw_text(50, 530, "Downloading server-sent plugin " + string(i + 1) + "/" + string(ds_list_size(list)) + ' - "' + pluginname + '"');
 | |
|             if (filesize != -1)
 | |
|                 draw_rectangle(50, 550, 50 + progress / filesize * 250, 560, 0);
 | |
|             screen_refresh();
 | |
|         }
 | |
| 
 | |
|         // errored
 | |
|         if (httpRequestStatus(handle) == 2)
 | |
|         {
 | |
|             show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":#' + httpRequestError(handle));
 | |
|             failed = true;
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|         // request failed
 | |
|         if (httpRequestStatusCode(handle) != 200)
 | |
|         {
 | |
|             show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":#' + string(httpRequestStatusCode(handle)) + ' ' + httpRequestReasonPhrase(handle));
 | |
|             failed = true;
 | |
|             break;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             write_buffer_to_file(httpRequestResponseBody(handle), tempfile);
 | |
|             if (!file_exists(tempfile))
 | |
|             {
 | |
|                 show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":# No such file?');
 | |
|                 failed = true;
 | |
|                 break;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         httpRequestDestroy(handle);
 | |
|     }
 | |
| 
 | |
|     // check file integrity
 | |
|     realhash = GG2DLL_compute_MD5(tempfile);
 | |
|     if (realhash != pluginhash)
 | |
|     {
 | |
|         show_message('Error loading server-sent plugins - integrity check failed (MD5 hash mismatch) for:#"' + pluginname + '"');
 | |
|         failed = true;
 | |
|         break;
 | |
|     }
 | |
|     
 | |
|     // don't try to cache debug plugins
 | |
|     if (!isDebug)
 | |
|     {
 | |
|         // add to cache if we don't already have it
 | |
|         if (!file_exists(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash))
 | |
|         {
 | |
|             // make sure directory exists
 | |
|             if (!directory_exists(working_directory + "\ServerPluginsCache"))
 | |
|             {
 | |
|                 directory_create(working_directory + "\ServerPluginsCache");
 | |
|             }
 | |
|             // store in cache
 | |
|             file_copy(tempfile, working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // let's get 7-zip to extract the files
 | |
|     extractzip(tempfile, tempdir);
 | |
|     
 | |
|     // if the directory doesn't exist, extracting presumably failed
 | |
|     if (!directory_exists(tempdir))
 | |
|     {
 | |
|         show_message('Error loading server-sent plugins - extracting zip failed for:#"' + pluginname + '"');
 | |
|         failed = true;
 | |
|         break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| if (!failed)
 | |
| {
 | |
|     // Execute plugins
 | |
|     for (i = 0; i < ds_list_size(list); i += 1)
 | |
|     {
 | |
|         pluginname = ds_list_find_value(list, i);
 | |
|         tempdir = temp_directory + "\" + pluginname + ".tmp";
 | |
|         
 | |
|         // Debugging facility, so we know *which* plugin caused compile/execute error
 | |
|         fp = file_text_open_write(working_directory + "\last_plugin.log");
 | |
|         file_text_write_string(fp, pluginname);
 | |
|         file_text_close(fp);
 | |
| 
 | |
|         // packetID is (i), so make queues for it
 | |
|         ds_map_add(global.pluginPacketBuffers, i, ds_queue_create());
 | |
|         ds_map_add(global.pluginPacketPlayers, i, ds_queue_create());
 | |
| 
 | |
|         // Execute plugin
 | |
|         execute_file(
 | |
|             // the plugin's main gml file must be in the root of the zip
 | |
|             // it is called plugin.gml
 | |
|             tempdir + "\plugin.gml",
 | |
|             // the plugin needs to know where it is
 | |
|             // so the temporary directory is passed as first argument
 | |
|             tempdir,
 | |
|             // the plugin needs to know its packetID
 | |
|             // so it is passed as the second argument
 | |
|             i
 | |
|         );
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Delete last plugin log
 | |
| file_delete(working_directory + "\last_plugin.log");
 | |
| 
 | |
| // Get rid of plugin list
 | |
| ds_list_destroy(list);
 | |
| 
 | |
| // Get rid of plugin hash list
 | |
| ds_list_destroy(hashList);
 | |
| 
 | |
| return !failed;
 |