|
| 1 | +import asyncio |
| 2 | +import base64 |
| 3 | +import logging |
| 4 | +import signal |
| 5 | +from pathlib import Path |
| 6 | + |
| 7 | +import aiohttp |
| 8 | + |
| 9 | +from nameless.config import nameless_config |
| 10 | + |
| 11 | +CWD = Path(__file__).parent |
| 12 | +LAVALINK_URL = ( |
| 13 | + "https://github.com/lavalink-devs/Lavalink/releases/latest/download/Lavalink.jar" |
| 14 | +) |
| 15 | +LAVALINK_BIN = CWD / "bin" / "Lavalink.jar" |
| 16 | +LAVALINK_CONFIG = CWD / "bin" / "application.yml" |
| 17 | + |
| 18 | +proc: asyncio.subprocess.Process | None = None |
| 19 | +task: asyncio.Task[None] | None = None |
| 20 | +stop_event = asyncio.Event() |
| 21 | + |
| 22 | + |
| 23 | +async def start(): |
| 24 | + """Start the Lavalink server from /bin folder.""" |
| 25 | + global proc, stop_event |
| 26 | + while True: |
| 27 | + proc = await asyncio.create_subprocess_exec( |
| 28 | + "java", "-jar", "Lavalink.jar", cwd=CWD / "bin", stdout=-3 |
| 29 | + ) |
| 30 | + await proc.wait() |
| 31 | + if nameless_config["nameless"]["is_shutting_down"]: |
| 32 | + stop_event.set() |
| 33 | + break |
| 34 | + |
| 35 | + logging.warning("Lavalink server stopped. Restarting in 5 seconds...") |
| 36 | + await asyncio.sleep(5) |
| 37 | + |
| 38 | + |
| 39 | +async def stop(): |
| 40 | + """Stop the Lavalink server.""" |
| 41 | + global proc, task, stop_event |
| 42 | + |
| 43 | + if proc: |
| 44 | + proc.send_signal(signal.CTRL_C_EVENT) |
| 45 | + await proc.wait() |
| 46 | + proc = None |
| 47 | + |
| 48 | + if task: |
| 49 | + await stop_event.wait() |
| 50 | + task.cancel() |
| 51 | + task = None |
| 52 | + |
| 53 | + |
| 54 | +def check_file(): |
| 55 | + """Check if the Lavalink.jar file exists.""" |
| 56 | + try: |
| 57 | + with open(LAVALINK_BIN): |
| 58 | + return True |
| 59 | + except FileNotFoundError: |
| 60 | + return False |
| 61 | + |
| 62 | + |
| 63 | +async def default_config(): |
| 64 | + """Create a default Lavalink configuration file.""" |
| 65 | + LAVALINK_CONFIG.parent.mkdir(parents=True, exist_ok=True) |
| 66 | + with open(LAVALINK_CONFIG, "wb") as f: |
| 67 | + config = base64.b64decode( |
| 68 | + "c2VydmVyOiAjIFJFU1QgYW5kIFdTIHNlcnZlcg0KICBwb3J0OiAyMzMzDQogIGFkZHJlc3M6IDAuMC4wLjANCiAgaHR0cDI6DQogICAgZW5hYmxlZDogZmFsc2UgIyBXaGV0aGVyIHRvIGVuYWJsZSBIVFRQLzIgc3VwcG9ydA0KcGx1Z2luczoNCiAgeW91dHViZToNCiAgICBlbmFibGVkOiB0cnVlICMgV2hldGhlciB0aGlzIHNvdXJjZSBjYW4gYmUgdXNlZC4NCiAgICBhbGxvd1NlYXJjaDogdHJ1ZSAjIFdoZXRoZXIgInl0c2VhcmNoOiIgYW5kICJ5dG1zZWFyY2g6IiBjYW4gYmUgdXNlZC4NCiAgICBhbGxvd0RpcmVjdFZpZGVvSWRzOiB0cnVlICMgV2hldGhlciBqdXN0IHZpZGVvIElEcyBjYW4gbWF0Y2guIElmIGZhbHNlLCBvbmx5IGNvbXBsZXRlIFVSTHMgd2lsbCBiZSBsb2FkZWQuDQogICAgYWxsb3dEaXJlY3RQbGF5bGlzdElkczogdHJ1ZSAjIFdoZXRoZXIganVzdCBwbGF5bGlzdCBJRHMgY2FuIG1hdGNoLiBJZiBmYWxzZSwgb25seSBjb21wbGV0ZSBVUkxzIHdpbGwgYmUgbG9hZGVkLg0KICAgICMgVGhlIGNsaWVudHMgdG8gdXNlIGZvciB0cmFjayBsb2FkaW5nLiBTZWUgYmVsb3cgZm9yIGEgbGlzdCBvZiB2YWxpZCBjbGllbnRzLg0KICAgICMgQ2xpZW50cyBhcmUgcXVlcmllZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZ2l2ZW4gKHNvIHRoZSBmaXJzdCBjbGllbnQgaXMgcXVlcmllZCBmaXJzdCBhbmQgc28gb24uLi4pDQogICAgY2xpZW50czoNCiAgICAgIC0gTVVTSUMNCiAgICAgIC0gV0VCDQogICAgICAtIFdFQkVNQkVEREVEIA0KbGF2YWxpbms6DQogIHBsdWdpbnM6DQogICAgIyAgICAtIGRlcGVuZGVuY3k6ICJjb20uZ2l0aHViLmV4YW1wbGU6ZXhhbXBsZS1wbHVnaW46MS4wLjAiICMgcmVxdWlyZWQsIHRoZSBjb29yZGluYXRlcyBvZiB5b3VyIHBsdWdpbg0KICAgICMgICAgICByZXBvc2l0b3J5OiAiaHR0cHM6Ly9tYXZlbi5leGFtcGxlLmNvbS9yZWxlYXNlcyIgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIExhdmFsaW5rIHJlbGVhc2VzIHJlcG9zaXRvcnkgYnkgZGVmYXVsdA0KICAgICMgICAgICBzbmFwc2hvdDogZmFsc2UgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UsIHVzZWQgdG8gdGVsbCBMYXZhbGluayB0byB1c2UgdGhlIHNuYXBzaG90IHJlcG9zaXRvcnkgaW5zdGVhZCBvZiB0aGUgcmVsZWFzZSByZXBvc2l0b3J5DQogICAgIyAgcGx1Z2luc0RpcjogIi4vcGx1Z2lucyIgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gIi4vcGx1Z2lucyINCiAgICAjICBkZWZhdWx0UGx1Z2luUmVwb3NpdG9yeTogImh0dHBzOi8vbWF2ZW4ubGF2YWxpbmsuZGV2L3JlbGVhc2VzIiAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgTGF2YWxpbmsgcmVsZWFzZSByZXBvc2l0b3J5DQogICAgIyAgZGVmYXVsdFBsdWdpblNuYXBzaG90UmVwb3NpdG9yeTogImh0dHBzOi8vbWF2ZW4ubGF2YWxpbmsuZGV2L3NuYXBzaG90cyIgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIExhdmFsaW5rIHNuYXBzaG90IHJlcG9zaXRvcnkNCiAgICAjIFJlcGxhY2UgVkVSU0lPTiB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXMgc2hvd24gYnkgdGhlIFJlbGVhc2VzIHRhYiBvciBhIGxvbmcgY29tbWl0IGhhc2ggZm9yIHNuYXBzaG90cy4NCiAgICAtIGRlcGVuZGVuY3k6ICJkZXYubGF2YWxpbmsueW91dHViZTp5b3V0dWJlLXBsdWdpbjoxLjEwLjIiDQogICAgICBzbmFwc2hvdDogZmFsc2UNCiAgICAtIGRlcGVuZGVuY3k6ICJjb20uZ2l0aHViLnRvcGkzMTQuc3BvbnNvcmJsb2NrOnNwb25zb3JibG9jay1wbHVnaW46My4wLjEiDQogICAgICByZXBvc2l0b3J5OiAiaHR0cHM6Ly9tYXZlbi5sYXZhbGluay5kZXYvcmVsZWFzZXMiDQogICAgICBzbmFwc2hvdDogZmFsc2UNCiAgc2VydmVyOg0KICAgIHBhc3N3b3JkOiAieW91c2hhbGxub3RwYXNzIg0KICAgIHNvdXJjZXM6DQogICAgICB5b3V0dWJlOiBmYWxzZQ0KICAgICAgYmFuZGNhbXA6IHRydWUNCiAgICAgIHNvdW5kY2xvdWQ6IHRydWUNCiAgICAgIHR3aXRjaDogdHJ1ZQ0KICAgICAgdmltZW86IHRydWUNCiAgICAgIG5pY286IHRydWUNCiAgICAgIGh0dHA6IHRydWUgIyB3YXJuaW5nOiBrZWVwaW5nIEhUVFAgZW5hYmxlZCB3aXRob3V0IGEgcHJveHkgY29uZmlndXJlZCBjb3VsZCBleHBvc2UgeW91ciBzZXJ2ZXIncyBJUCBhZGRyZXNzLg0KICAgICAgbG9jYWw6IGZhbHNlDQogICAgZmlsdGVyczogIyBBbGwgZmlsdGVycyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0DQogICAgICB2b2x1bWU6IHRydWUNCiAgICAgIGVxdWFsaXplcjogdHJ1ZQ0KICAgICAga2FyYW9rZTogdHJ1ZQ0KICAgICAgdGltZXNjYWxlOiB0cnVlDQogICAgICB0cmVtb2xvOiB0cnVlDQogICAgICB2aWJyYXRvOiB0cnVlDQogICAgICBkaXN0b3J0aW9uOiB0cnVlDQogICAgICByb3RhdGlvbjogdHJ1ZQ0KICAgICAgY2hhbm5lbE1peDogdHJ1ZQ0KICAgICAgbG93UGFzczogdHJ1ZQ0KICAgIG5vbkFsbG9jYXRpbmdGcmFtZUJ1ZmZlcjogZmFsc2UgIyBTZXR0aW5nIHRvIHRydWUgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zIG1hZGUgYnkgZWFjaCBwbGF5ZXIgYXQgdGhlIGV4cGVuc2Ugb2YgZnJhbWUgcmVidWlsZGluZyAoZS5nLiBub24taW5zdGFudGFuZW91cyB2b2x1bWUgY2hhbmdlcykNCiAgICBidWZmZXJEdXJhdGlvbk1zOiA0MDAgIyBUaGUgZHVyYXRpb24gb2YgdGhlIE5BUyBidWZmZXIuIEhpZ2hlciB2YWx1ZXMgZmFyZSBiZXR0ZXIgYWdhaW5zdCBsb25nZXIgR0MgcGF1c2VzLiBEdXJhdGlvbiA8PSAwIHRvIGRpc2FibGUgSkRBLU5BUy4gTWluaW11bSBvZiA0MG1zLCBsb3dlciB2YWx1ZXMgbWF5IGludHJvZHVjZSBwYXVzZXMuDQogICAgZnJhbWVCdWZmZXJEdXJhdGlvbk1zOiA1MDAwICMgSG93IG1hbnkgbWlsbGlzZWNvbmRzIG9mIGF1ZGlvIHRvIGtlZXAgYnVmZmVyZWQNCiAgICBvcHVzRW5jb2RpbmdRdWFsaXR5OiAxMCAjIE9wdXMgZW5jb2RlciBxdWFsaXR5LiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDEwLCB3aGVyZSAxMCBpcyBiZXN0IHF1YWxpdHkgYnV0IGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSBvbiB0aGUgQ1BVLg0KICAgIHJlc2FtcGxpbmdRdWFsaXR5OiBMT1cgIyBRdWFsaXR5IG9mIHJlc2FtcGxpbmcgb3BlcmF0aW9ucy4gVmFsaWQgdmFsdWVzIGFyZSBMT1csIE1FRElVTSBhbmQgSElHSCwgd2hlcmUgSElHSCB1c2VzIHRoZSBtb3N0IENQVS4NCiAgICB0cmFja1N0dWNrVGhyZXNob2xkTXM6IDEwMDAwICMgVGhlIHRocmVzaG9sZCBmb3IgaG93IGxvbmcgYSB0cmFjayBjYW4gYmUgc3R1Y2suIEEgdHJhY2sgaXMgc3R1Y2sgaWYgZG9lcyBub3QgcmV0dXJuIGFueSBhdWRpbyBkYXRhLg0KICAgIHVzZVNlZWtHaG9zdGluZzogdHJ1ZSAjIFNlZWsgZ2hvc3RpbmcgaXMgdGhlIGVmZmVjdCB3aGVyZSB3aGlsc3QgYSBzZWVrIGlzIGluIHByb2dyZXNzLCB0aGUgYXVkaW8gYnVmZmVyIGlzIHJlYWQgZnJvbSB1bnRpbCBlbXB0eSwgb3IgdW50aWwgc2VlayBpcyByZWFkeS4NCiAgICB5b3V0dWJlUGxheWxpc3RMb2FkTGltaXQ6IDYgIyBOdW1iZXIgb2YgcGFnZXMgYXQgMTAwIGVhY2gNCiAgICBwbGF5ZXJVcGRhdGVJbnRlcnZhbDogNSAjIEhvdyBmcmVxdWVudGx5IHRvIHNlbmQgcGxheWVyIHVwZGF0ZXMgdG8gY2xpZW50cywgaW4gc2Vjb25kcw0KICAgIHlvdXR1YmVTZWFyY2hFbmFibGVkOiB0cnVlDQogICAgc291bmRjbG91ZFNlYXJjaEVuYWJsZWQ6IHRydWUNCiAgICBnYy13YXJuaW5nczogdHJ1ZQ0KICAgICNyYXRlbGltaXQ6DQogICAgICAjaXBCbG9ja3M6IFsiMS4wLjAuMC84IiwgIi4uLiJdICMgbGlzdCBvZiBpcCBibG9ja3MNCiAgICAgICNleGNsdWRlZElwczogWyIuLi4iLCAiLi4uIl0gIyBpcHMgd2hpY2ggc2hvdWxkIGJlIGV4cGxpY2l0IGV4Y2x1ZGVkIGZyb20gdXNhZ2UgYnkgbGF2YWxpbmsNCiAgICAgICNzdHJhdGVneTogIlJvdGF0ZU9uQmFuIiAjIFJvdGF0ZU9uQmFuIHwgTG9hZEJhbGFuY2UgfCBOYW5vU3dpdGNoIHwgUm90YXRpbmdOYW5vU3dpdGNoDQogICAgICAjc2VhcmNoVHJpZ2dlcnNGYWlsOiB0cnVlICMgV2hldGhlciBhIHNlYXJjaCA0Mjkgc2hvdWxkIHRyaWdnZXIgbWFya2luZyB0aGUgaXAgYXMgZmFpbGluZw0KICAgICAgI3JldHJ5TGltaXQ6IC0xICMgLTEgPSB1c2UgZGVmYXVsdCBsYXZhcGxheWVyIHZhbHVlIHwgMCA9IGluZmluaXR5IHwgPjAgPSByZXRyeSB3aWxsIGhhcHBlbiB0aGlzIG51bWJlcnMgdGltZXMNCiAgICAjeW91dHViZUNvbmZpZzogIyBSZXF1aXJlZCBmb3IgYXZvaWRpbmcgYWxsIGFnZSByZXN0cmljdGlvbnMgYnkgWW91VHViZSwgc29tZSByZXN0cmljdGVkIHZpZGVvcyBzdGlsbCBjYW4gYmUgcGxheWVkIHdpdGhvdXQuDQogICAgICAjZW1haWw6ICIiICMgRW1haWwgb2YgR29vZ2xlIGFjY291bnQNCiAgICAgICNwYXNzd29yZDogIiIgIyBQYXNzd29yZCBvZiBHb29nbGUgYWNjb3VudA0KICAgICNodHRwQ29uZmlnOiAjIFVzZWZ1bCBmb3IgYmxvY2tpbmcgYmFkLWFjdG9ycyBmcm9tIGlwLWdyYWJiaW5nIHlvdXIgbXVzaWMgbm9kZSBhbmQgYXR0YWNraW5nIGl0LCB0aGlzIHdheSBvbmx5IHRoZSBodHRwIHByb3h5IHdpbGwgYmUgYXR0YWNrZWQNCiAgICAgICNwcm94eUhvc3Q6ICJsb2NhbGhvc3QiICMgSG9zdG5hbWUgb2YgdGhlIHByb3h5LCAoaXAgb3IgZG9tYWluKQ0KICAgICAgI3Byb3h5UG9ydDogMzEyOCAjIFByb3h5IHBvcnQsIDMxMjggaXMgdGhlIGRlZmF1bHQgZm9yIHNxdWlkUHJveHkNCiAgICAgICNwcm94eVVzZXI6ICIiICMgT3B0aW9uYWwgdXNlciBmb3IgYmFzaWMgYXV0aGVudGljYXRpb24gZmllbGRzLCBsZWF2ZSBibGFuayBpZiB5b3UgZG9uJ3QgdXNlIGJhc2ljIGF1dGgNCiAgICAgICNwcm94eVBhc3N3b3JkOiAiIiAjIFBhc3N3b3JkIGZvciBiYXNpYyBhdXRoZW50aWNhdGlvbg0KDQptZXRyaWNzOg0KICBwcm9tZXRoZXVzOg0KICAgIGVuYWJsZWQ6IGZhbHNlDQogICAgZW5kcG9pbnQ6IC9tZXRyaWNzDQoNCnNlbnRyeToNCiAgZHNuOiAiIg0KICBlbnZpcm9ubWVudDogIiINCiMgIHRhZ3M6DQojICAgIHNvbWVfa2V5OiBzb21lX3ZhbHVlDQojICAgIGFub3RoZXJfa2V5OiBhbm90aGVyX3ZhbHVlDQoNCmxvZ2dpbmc6DQogIGZpbGU6DQogICAgcGF0aDogLi9sb2dzLw0KDQogIGxldmVsOg0KICAgIHJvb3Q6IElORk8NCiAgICBsYXZhbGluazogSU5GTw0KDQogIHJlcXVlc3Q6DQogICAgZW5hYmxlZDogdHJ1ZQ0KICAgIGluY2x1ZGVDbGllbnRJbmZvOiB0cnVlDQogICAgaW5jbHVkZUhlYWRlcnM6IGZhbHNlDQogICAgaW5jbHVkZVF1ZXJ5U3RyaW5nOiB0cnVlDQogICAgaW5jbHVkZVBheWxvYWQ6IHRydWUNCiAgICBtYXhQYXlsb2FkTGVuZ3RoOiAxMDAwMA0KDQoNCiAgbG9nYmFjazoNCiAgICByb2xsaW5ncG9saWN5Og0KICAgICAgbWF4LWZpbGUtc2l6ZTogMUdCDQogICAgICBtYXgtaGlzdG9yeTogMzA=" |
| 69 | + ) |
| 70 | + f.write(config) |
| 71 | + |
| 72 | + |
| 73 | +async def download_lavalink(): |
| 74 | + """Download Lavalink.jar from the official repo.""" |
| 75 | + LAVALINK_BIN.parent.mkdir(parents=True, exist_ok=True) |
| 76 | + async with aiohttp.ClientSession() as session, session.get( |
| 77 | + LAVALINK_URL, allow_redirects=True |
| 78 | + ) as resp: |
| 79 | + with open(LAVALINK_BIN, "wb") as f: |
| 80 | + f.write(await resp.read()) |
| 81 | + await default_config() # Create a default configuration file |
| 82 | + |
| 83 | + |
| 84 | +async def main(loop: asyncio.AbstractEventLoop): |
| 85 | + """Main function to start the Lavalink server.""" |
| 86 | + global task |
| 87 | + |
| 88 | + if not check_file(): |
| 89 | + logging.warning("Lavalink.jar not found. Downloading...") |
| 90 | + await download_lavalink() |
| 91 | + task = loop.create_task(start()) |
0 commit comments