Use guid of game.ini for directory name
This commit is contained in:
parent
66eea76bb4
commit
7515e4ab9a
@ -1,13 +1,43 @@
|
|||||||
|
"""
|
||||||
|
Implementation of C# System.Guid
|
||||||
|
|
||||||
|
References:
|
||||||
|
https://referencesource.microsoft.com/#mscorlib/system/guid.cs
|
||||||
|
|
||||||
|
# TODO Add License
|
||||||
|
"""
|
||||||
|
|
||||||
from struct import Struct, pack
|
from struct import Struct, pack
|
||||||
from math import log
|
from math import log
|
||||||
|
|
||||||
# 16 bytes, 11 arguments
|
# Constants for masking bytes
|
||||||
MAXINT64 = 0xFFFFFFFFFFFFFFFF
|
MAXINT64 = 0xFFFFFFFFFFFFFFFF
|
||||||
|
MAXINT16 = 0xFFFF
|
||||||
MAXINT8 = 0xFF
|
MAXINT8 = 0xFF
|
||||||
|
|
||||||
|
|
||||||
class Guid:
|
class Guid:
|
||||||
|
"""
|
||||||
|
A Global Unique Identifier (Guid) based on the one provided in C#'s System package
|
||||||
|
|
||||||
|
The Guid is stored as a tuple of length 11 for easy processing and comparisons
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
guid (tuple): A tuple containing the guid
|
||||||
|
"""
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
|
"""
|
||||||
|
Initialize the Guid
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
Union[int, str, bytes, short(int will be masked to short)]:
|
||||||
|
The arguments can be in any of the following formats:
|
||||||
|
(bytes(len 16))
|
||||||
|
(int(len <= 4), short, short, bytes(len 8))
|
||||||
|
(int(len <= 8), int(len <= 8))
|
||||||
|
(int(len <= 16))
|
||||||
|
(str) - str must be formatted 00000000-0000-0000-0000-000000000000
|
||||||
|
"""
|
||||||
# Guid will be stored as a tuple len 11
|
# Guid will be stored as a tuple len 11
|
||||||
if bool(args):
|
if bool(args):
|
||||||
self.get_guid(args)
|
self.get_guid(args)
|
||||||
@ -24,13 +54,9 @@ class Guid:
|
|||||||
*b[8:16]
|
*b[8:16]
|
||||||
)
|
)
|
||||||
self.guid = s.unpack(guid)
|
self.guid = s.unpack(guid)
|
||||||
elif len(args) == 11 and all(isinstance(arg, int) for arg in args[0:3]) \
|
|
||||||
and all(isinstance(arg, bytes) for arg in args[3:]) and all(len(arg) == 1 for arg in args[3:]):
|
|
||||||
guid = s.pack(*args)
|
|
||||||
self.guid = s.unpack(guid)
|
|
||||||
elif len(args) == 4 and all(isinstance(arg, int) for arg in args[0:3]) \
|
elif len(args) == 4 and all(isinstance(arg, int) for arg in args[0:3]) \
|
||||||
and isinstance(args[3], bytes) and len(args[3]) == 8:
|
and isinstance(args[3], bytes) and len(args[3]) == 8:
|
||||||
guid = s.pack(args[0], args[1], args[2], *args[3])
|
guid = s.pack(args[0], args[1] & MAXINT16, args[2] & MAXINT16, *args[3])
|
||||||
self.guid = s.unpack(guid)
|
self.guid = s.unpack(guid)
|
||||||
elif len(args) == 2 and all(isinstance(arg, int) for arg in args):
|
elif len(args) == 2 and all(isinstance(arg, int) for arg in args):
|
||||||
if all((self.bytes_needed(arg) <= 4) for arg in args):
|
if all((self.bytes_needed(arg) <= 4) for arg in args):
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import json
|
|||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
from .guid import Guid
|
from .guid import Guid
|
||||||
from shutil import rmtree
|
from shutil import rmtree
|
||||||
|
from hashlib import md5
|
||||||
|
|
||||||
config_dir = 'config/'
|
config_dir = 'config/'
|
||||||
bot_config_file = 'bot_config.json'
|
bot_config_file = 'bot_config.json'
|
||||||
@ -47,7 +48,9 @@ def rename_section(cfg, sec, sec_new):
|
|||||||
|
|
||||||
def get_server_guid(server_file):
|
def get_server_guid(server_file):
|
||||||
server_file = server_file.encode()
|
server_file = server_file.encode()
|
||||||
|
m = md5(server_file).hexdigest().encode()
|
||||||
|
guid = Guid(int(m.hex()))
|
||||||
|
return guid
|
||||||
|
|
||||||
|
|
||||||
def process_file(in_file, file_type) -> ConfigParser:
|
def process_file(in_file, file_type) -> ConfigParser:
|
||||||
@ -87,9 +90,10 @@ def process_file(in_file, file_type) -> ConfigParser:
|
|||||||
return config
|
return config
|
||||||
|
|
||||||
|
|
||||||
def process_files(z) -> (ConfigParser, ConfigParser, list):
|
def process_files(z) -> (ConfigParser, ConfigParser, list, Guid):
|
||||||
dino_data = dict()
|
dino_data = dict()
|
||||||
game_config = ConfigParser()
|
game_config = ConfigParser()
|
||||||
|
server_guid = Guid()
|
||||||
mods = list()
|
mods = list()
|
||||||
path = 'submissions_temp/tmp/'
|
path = 'submissions_temp/tmp/'
|
||||||
z.extractall(path=path)
|
z.extractall(path=path)
|
||||||
@ -144,7 +148,7 @@ def process_files(z) -> (ConfigParser, ConfigParser, list):
|
|||||||
rmtree('submissions_temp/tmp')
|
rmtree('submissions_temp/tmp')
|
||||||
if not mods:
|
if not mods:
|
||||||
mods = check_for_modded_dinos(dino_data, mods)
|
mods = check_for_modded_dinos(dino_data, mods)
|
||||||
return game_config, dino_data, mods
|
return game_config, dino_data, mods, server_guid
|
||||||
|
|
||||||
|
|
||||||
def generate_game_ini(game_config, mods, directory):
|
def generate_game_ini(game_config, mods, directory):
|
||||||
@ -164,11 +168,11 @@ def generate_dino_files(dino_data, directory):
|
|||||||
dino.write(f, space_around_delimiters=False)
|
dino.write(f, space_around_delimiters=False)
|
||||||
|
|
||||||
|
|
||||||
def generate_files(storage_dir, ctx, filename, game_ini, dinos_data, mods):
|
def generate_files(storage_dir, ctx, dirname, game_ini, dinos_data, mods):
|
||||||
if not os.path.isdir(f'{storage_dir}/{ctx.author.id}'):
|
if not os.path.isdir(f'{storage_dir}/{ctx.author.id}'):
|
||||||
os.mkdir(f'{storage_dir}/{ctx.author.id}')
|
os.mkdir(f'{storage_dir}/{ctx.author.id}')
|
||||||
directory = f'{storage_dir}/{ctx.author.id}/{filename.replace(".zip", "")}_' \
|
directory = f'{storage_dir}/{ctx.author.id}/{dirname}'
|
||||||
f'{ctx.message.created_at.strftime("%Y%m%dT%H%M%S")}'
|
if not os.path.isdir(directory):
|
||||||
os.mkdir(directory)
|
os.mkdir(directory)
|
||||||
generate_game_ini(game_ini, mods, directory)
|
generate_game_ini(game_ini, mods, directory)
|
||||||
generate_dino_files(dinos_data, directory)
|
generate_dino_files(dinos_data, directory)
|
||||||
|
|||||||
@ -5,6 +5,7 @@ from io import BytesIO
|
|||||||
from .imports import process_files, utils
|
from .imports import process_files, utils
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
import os
|
import os
|
||||||
|
from .imports.guid import Guid
|
||||||
|
|
||||||
storage_dir = '../ASB_dino_submissions'
|
storage_dir = '../ASB_dino_submissions'
|
||||||
owner_id = 351794468870946827
|
owner_id = 351794468870946827
|
||||||
@ -29,7 +30,7 @@ class Uploader:
|
|||||||
with BytesIO() as file:
|
with BytesIO() as file:
|
||||||
await attachment.save(file)
|
await attachment.save(file)
|
||||||
unzipped = process_files.load_zip(file)
|
unzipped = process_files.load_zip(file)
|
||||||
game_ini, dinos_data, mods = process_files.process_files(unzipped)
|
game_ini, dinos_data, mods, server_guid = process_files.process_files(unzipped)
|
||||||
if not game_ini and not dinos_data and not mods:
|
if not game_ini and not dinos_data and not mods:
|
||||||
await msg.edit(content='There was an encoding error with one of the files provided '
|
await msg.edit(content='There was an encoding error with one of the files provided '
|
||||||
'and they cannot be processed')
|
'and they cannot be processed')
|
||||||
@ -72,6 +73,7 @@ class Uploader:
|
|||||||
await msg.edit(content="You chose to process as official.")
|
await msg.edit(content="You chose to process as official.")
|
||||||
await asyncio.sleep(4.0)
|
await asyncio.sleep(4.0)
|
||||||
official = 'official'
|
official = 'official'
|
||||||
|
server_guid = Guid(b'officialserver00')
|
||||||
elif str(reaction.emoji) == self.bot.unicode_emojis["y"]:
|
elif str(reaction.emoji) == self.bot.unicode_emojis["y"]:
|
||||||
await msg.edit(content="You chose to provide the Game.ini file.\n"
|
await msg.edit(content="You chose to provide the Game.ini file.\n"
|
||||||
"I will wait for 5 minutes for you to send a message "
|
"I will wait for 5 minutes for you to send a message "
|
||||||
@ -98,6 +100,8 @@ class Uploader:
|
|||||||
with BytesIO() as f:
|
with BytesIO() as f:
|
||||||
game_msg.attachments[0].save(f)
|
game_msg.attachments[0].save(f)
|
||||||
game_ini = process_files.process_file(f, 'game.ini')
|
game_ini = process_files.process_file(f, 'game.ini')
|
||||||
|
f.seek(0)
|
||||||
|
server_guid = process_files.get_server_guid(f.read())
|
||||||
elif str(reaction.emoji) == self.bot.unicode_emojis['x']:
|
elif str(reaction.emoji) == self.bot.unicode_emojis['x']:
|
||||||
await msg.edit(content='Your request has been canceled.')
|
await msg.edit(content='Your request has been canceled.')
|
||||||
return
|
return
|
||||||
@ -133,10 +137,12 @@ class Uploader:
|
|||||||
await msg.edit(content="You selected SinglePlayer.")
|
await msg.edit(content="You selected SinglePlayer.")
|
||||||
await asyncio.sleep(4.0)
|
await asyncio.sleep(4.0)
|
||||||
singleplayer = True
|
singleplayer = True
|
||||||
|
server_guid = Guid(b'officialsinglepl')
|
||||||
elif str(reaction.emoji) == self.bot.unicode_emojis["x"]:
|
elif str(reaction.emoji) == self.bot.unicode_emojis["x"]:
|
||||||
await msg.edit(content="You selected Server.")
|
await msg.edit(content="You selected Server.")
|
||||||
await asyncio.sleep(4.0)
|
await asyncio.sleep(4.0)
|
||||||
singleplayer = False
|
singleplayer = False
|
||||||
|
server_guid = Guid(b'officialserver00')
|
||||||
|
|
||||||
if singleplayer:
|
if singleplayer:
|
||||||
game_ini.add_section('/script/shootergame.shootergamemode')
|
game_ini.add_section('/script/shootergame.shootergamemode')
|
||||||
@ -154,7 +160,7 @@ class Uploader:
|
|||||||
pull_status = await utils.git_pull(self.bot.loop, storage_dir)
|
pull_status = await utils.git_pull(self.bot.loop, storage_dir)
|
||||||
if pull_status == 'Completed':
|
if pull_status == 'Completed':
|
||||||
await msg.edit(content='Processing... Sync complete... Generating new files')
|
await msg.edit(content='Processing... Sync complete... Generating new files')
|
||||||
process_files.generate_files(storage_dir, ctx, attachment.filename,
|
process_files.generate_files(storage_dir, ctx, server_guid,
|
||||||
game_ini, dinos_data, mods)
|
game_ini, dinos_data, mods)
|
||||||
await msg.edit(content='Processing... Files generated... Committing changes')
|
await msg.edit(content='Processing... Files generated... Committing changes')
|
||||||
await utils.git_add(self.bot.loop, storage_dir, '*')
|
await utils.git_add(self.bot.loop, storage_dir, '*')
|
||||||
@ -180,7 +186,7 @@ class Uploader:
|
|||||||
else:
|
else:
|
||||||
await self.bot.get_user(owner_id).send(f'There was an error with git pull\n'
|
await self.bot.get_user(owner_id).send(f'There was an error with git pull\n'
|
||||||
f'{pull_status}')
|
f'{pull_status}')
|
||||||
process_files.generate_files('submissions_temp', ctx, attachment.filename,
|
process_files.generate_files('submissions_temp', ctx, server_guid,
|
||||||
game_ini, dinos_data, mods)
|
game_ini, dinos_data, mods)
|
||||||
await msg.edit(content='Could not sync with GitHub.\n'
|
await msg.edit(content='Could not sync with GitHub.\n'
|
||||||
'Dusty.P has been notified and your files are stored in a '
|
'Dusty.P has been notified and your files are stored in a '
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user