renpy/launcher/game/itch.rpy

151 lines
4.6 KiB
Plaintext
Raw Normal View History

2023-09-12 22:16:10 +00:00
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
2023-01-18 22:13:55 +00:00
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
init python:
def find_itch_butler():
import requests
if renpy.windows:
platform = "windows-amd64"
exe = "butler.exe"
elif renpy.macintosh:
platform = "darwin-amd64"
exe = "butler"
else:
platform = "linux-amd64"
exe = "butler"
dn = os.path.join(config.renpy_base, "tmp", "butler-" + platform)
zip = os.path.join(dn, "butler.zip")
exe = os.path.join(dn, exe)
if os.path.exists(exe):
return exe
interface.processing(_("Downloading the itch.io butler."))
try:
os.makedirs(dn)
except Exception:
pass
with interface.error_handling(_("Downloading the itch.io butler.")):
url = "https://broth.itch.ovh/butler/{}/LATEST/archive/default".format(platform)
response = requests.get(url, headers={'User-Agent' : "Renpy"})
with open(zip, "wb") as f:
f.write(response.content)
import zipfile
with zipfile.ZipFile(zip) as zf:
zf.extractall(dn)
try:
os.chmod(exe, 0o755)
except Exception:
pass
return exe
label itch:
call build_update_dump
python hide:
butler = find_itch_butler()
build = project.current.dump["build"]
destination = build["destination"]
parent = os.path.dirname(project.current.path)
destination = os.path.join(parent, destination)
version = build["version"]
if not os.path.exists(destination):
interface.error(
_("The built distributions could not be found. Please choose 'Build' and try again."),
label="build_distributions"
)
# A list of full filename, channel tuples.
files = [ ]
for fn in os.listdir(destination):
2023-09-12 22:16:10 +00:00
for pattern, channel in reversed(build['itch_channels']):
if fnmatch.fnmatch(fn, pattern):
break
2023-01-18 22:13:55 +00:00
else:
continue
2023-09-12 22:16:10 +00:00
fn = os.path.join(destination, fn)
2023-01-18 22:13:55 +00:00
files.append((fn, channel))
if not os.path.exists(destination):
interface.error(
_("No uploadable files were found. Please choose 'Build' and try again."),
label="build_distributions"
)
if not butler:
interface.error(
_("The butler program was not found."),
_("Please install the itch.io app, which includes butler, and try again."),
label="build_distributions"
)
itch_project = project.current.dump["build"].get("itch_project", None)
if itch_project is None or ("/" not in itch_project):
interface.error(
_("The name of the itch project has not been set."),
_("Please {a=https://itch.io/game/new}create your project{/a}, then add a line like \n{vspace=5}define build.itch_project = \"user-name/game-name\"\n{vspace=5} to options.rpy."),
label="build_distributions"
)
cc = ConsoleCommand()
for filename, channel in files:
cc.add(
butler,
"push",
filename,
itch_project + ":" + channel,
"--userversion",
build["version"],
)
cc.run()
jump build_distributions