MkDocs: sphinx docstrings rewritten to google, improved config, written the major part of how-to. Readme: centered title + logo, added badges, features list, updated changelog. Improved Files API, added automatical session saving and restoring to Client. Some changes in makefile and gitignore. License Notice now refers to all contributors.
4.9 KiB
How-To 4: Files
Intro
In python-aternos, all files on your Minecraft server are represented as atfile.AternosFile objects.
They can be accessed through atfm.FileManager instance,
let's assign it to fm
variable:
>>> fm = serv.files()
List directory contents
>>> root = fm.list_dir('/')
[<python_aternos.atfile.AternosFile object at 0x7f1b0...>, ...]
Get file by its path
>>> myfile = fm.get_file('/server.properties')
<python_aternos.atfile.AternosFile object at 0x7f1b0...>
File info
AternosFile object can point to
both a file and a directory
and contain almost the same properties and methods.
(So it's more correct to call it "Object in the server's filesystem",
but I chose an easier name for the class.)
path
- Full path to the file including trailing slash and without leading slash.name
- Filename with extension without trailing slash.dirname
- Full path to the directory which contains the file without leading slash.is_file
andis_dir
- File type in boolean.ftype
- File type inFileType
enum value:FileType.file
FileType.dir
andFileType.directory
size
- File size in bytes, float.
0.0
for directories and-1.0
when error occures.deleteable
,downloadable
andeditable
are explained in the next section.
File
>>> f = root[5]
>>> f.path
'/server.properties'
>>> f.name
'server.properties'
>>> f.dirname
''
>>> f.is_file
False
>>> f.is_dir
True
>>> from python_aternos import FileType
>>> f.ftype == FileType.file
True
>>> f.ftype == FileType.directory
False
>>> f.size
1240.0
>>> f.deleteable
False
>>> f.downloadable
False
>>> f.editable
False
Directory
>>> f = root[2]
>>> f.path
'/config'
>>> f.name
'config'
>>> f.dirname
''
>>> f.is_file
False
>>> f.is_dir
True
>>> from python_aternos import FileType
>>> f.ftype == FileType.file
False
>>> f.ftype == FileType.directory
True
>>> f.ftype == FileType.dir
True
>>> f.size
0.0
>>> f.deleteable
False
>>> f.downloadable
True
>>> f.editable
False
Methods
get_text
returns the file content from the Aternos editor page (opens when you click on the file on web site).set_text
is the same as "Save" button in the Aternos editor.get_content
requests file downloading and returns file content inbytes
(notstr
).
If it is a directory, Aternos returns its content in a ZIP file.set_content
likeset_text
, but takesbytes
as an argument.delete
removes file.create
creates a new file inside this one
(if it's a directory, otherwise throws RuntimeWarning).
Deletion and downloading rejection
In Aternos Files tab,
some files can be removed with a red button, some of them is protected.
You can check if the file is deleteable this way:
>>> f.deleteable
False
delete()
method will warn you if it's undeleteable,
and then you'll probably get FileError
because of Aternos deletion denial.
The same thing with downloadable
.
>>> f.downloadable
True
get_content()
will warn you if it's undownloadable.
And then you'll get FileError
.
And editable
means that you can click on the file
in Aternos "Files" tab to open editor.
get_text()
will warn about editing denial.
Creating files
Calling create
method only available for directories
(check it via f.is_dir
).
It takes two arguments:
name
- name of a new file,ftype
- type of a new file, must beFileType
enum value:FileType.file
FileType.dir
orFileType.directory
For example, let's create an empty config for some Forge mod, I'll call it "testmod".
# Import enum
from python_aternos import FileType
# Get configs directory
conf = fm.get_file('/config')
# Create empty file
conf.create('testmod.toml', FileType.file)
Editing files
Let's edit ops.json
.
It contains operators nicknames,
so the code below is the same as Players API.
import json
from python_aternos import Client
at = Client.from_credentials('username', 'password')
serv = at.list_servers()[0]
fm = serv.files()
ops = fm.get_file('/ops.json')
# If editable
use_get_text = True
# Check
if not ops.editable:
# One more check
if not ops.downloadable:
print('Error')
exit(0)
# If downloadable
use_get_text = False
def read():
if use_get_text:
return ops.get_text()
else:
return ops.get_content().decode('utf-8')
def write(content):
# set_text and set_content
# uses the same URLs.
# I prefer set_content
# but we need to convert content to bytes
content = content.encode('utf-8')
ops.set_content(content)
# It contains empty list [] by default
oper_raw = read()
# Convert to Python list
oper_lst = json.loads(oper_raw)
# Add an operator
oper_lst.append('DarkCat09')
# Convert back to JSON
oper_new = json.dumps(oper_lst)
# Write
ops.write(oper_new)