import requests import base64 import os # GitHub repository information repository_owner = os.environ['GIT_USER_NAME'] repository_name = os.environ['GIT_REPO_NAME'] branch_name = 'main' # GitHub API token (generate one in your GitHub account settings) github_token = os.environ['GIT_TOKEN'] def game_link(): return f"""https://{repository_owner}.github.io/{repository_name}/""" def push(new_content, path, file_name): if len(path) == 0: file_path = file_name else: file_path = f'{path}/{file_name}' # Get the current file content url = f'https://api.github.com/repos/{repository_owner}/{repository_name}/contents/{file_path}?ref={branch_name}' headers = {'Authorization': f'token {github_token}'} response = requests.get(url, headers=headers) response_json = response.json() current_sha = response_json['sha'] encoded_content = base64.b64encode(new_content.encode()).decode() # Update the file content update_data = { 'message': f'Update {file_path} via API', 'content': encoded_content, 'sha': current_sha, 'branch': branch_name } update_url = f'https://api.github.com/repos/{repository_owner}/{repository_name}/contents/{file_path}' response = requests.put(update_url, json=update_data, headers=headers) return response def trigger_workflow(workflow_name): api_url = f"""https://api.github.com/repos/ {repository_owner}/{repository_name}/actions/workflows/{workflow_name}/dispatches""" headers = { 'Authorization': f'Bearer {github_token}', 'Accept': 'application/vnd.github.v3+json', } payload = { 'ref': 'main' } response = requests.post(api_url, headers=headers, json=payload) return response def update_repo(text): # TODO: use API's concurrency feature to ensure only 1 user submits at a time. file_dir_path = '' file_name = 'main.py' response = push(text, file_dir_path, file_name) if response.status_code != 200: return response.text else: print(f"{file_name} pushed") workflow_name = 'pygbag.yml' response = trigger_workflow(workflow_name) if response.status_code != 204: return response.text else: print(f"{workflow_name} workflow started") # TODO: poll running workflows and only return once all are done. return "update successful"