Compare commits
	
		
			3 Commits 
		
	
	
		
			ae5d183172
			...
			947b454faf
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
								 | 
						947b454faf | |
| 
							
							
								
								 | 
						95bb6fd88c | |
| 
							
							
								
								 | 
						86905c8167 | 
| 
						 | 
					@ -25,7 +25,7 @@ def rewriter(file_name):
 | 
				
			||||||
@rewriter('eula.txt')
 | 
					@rewriter('eula.txt')
 | 
				
			||||||
def confirm_eula(line : str, line_no : int, data):
 | 
					def confirm_eula(line : str, line_no : int, data):
 | 
				
			||||||
    """Confirm the Minecraft EULA"""
 | 
					    """Confirm the Minecraft EULA"""
 | 
				
			||||||
    if os.getenv('EULA') is None or os.getenv('EULA').lower() != 'true':
 | 
					    if not config.EULA:
 | 
				
			||||||
        return line
 | 
					        return line
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        return line.replace('eula=false', 'eula=true')
 | 
					        return line.replace('eula=false', 'eula=true')
 | 
				
			||||||
| 
						 | 
					@ -36,9 +36,13 @@ def fill_in_server_settings(line : str, line_no : int, data):
 | 
				
			||||||
    if line.strip().startswith('#'):
 | 
					    if line.strip().startswith('#'):
 | 
				
			||||||
        return line
 | 
					        return line
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    value = line.split('=')[0]
 | 
					    key = line.split('=')[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if value in config.SERVER_SETTINGS:
 | 
					    server_settings = config.at(['minecraft']) or {}
 | 
				
			||||||
        return value + '=' + str(config.SERVER_SETTINGS[value]) + '\n'
 | 
					
 | 
				
			||||||
    else:
 | 
					    try:
 | 
				
			||||||
 | 
					        value = server_settings[key]
 | 
				
			||||||
 | 
					    except IndexError:
 | 
				
			||||||
        return line
 | 
					        return line
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        return key + '=' + str(value) + '\n'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										41
									
								
								config.py
								
								
								
								
							
							
						
						
									
										41
									
								
								config.py
								
								
								
								
							| 
						 | 
					@ -1,9 +1,41 @@
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					import yaml
 | 
				
			||||||
 | 
					from typing import Any, List, Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					with open('config.yaml', 'r') as open_file:
 | 
				
			||||||
 | 
					    SETTINGS = yaml.load(open_file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def at(keys : List[str]) -> Optional[Any]:
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					        Potentially get a value. If it doesn't exist, return None.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    return at_value(keys, SETTINGS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def at_value(keys : List[str], value : Any) -> Optional[Any]:
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        head, tail = keys[0], keys[1:]
 | 
				
			||||||
 | 
					    except IndexError:
 | 
				
			||||||
 | 
					        return value
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            new_value = value[head]
 | 
				
			||||||
 | 
					        except TypeError:
 | 
				
			||||||
 | 
					            return None
 | 
				
			||||||
 | 
					        except KeyError:
 | 
				
			||||||
 | 
					            return None
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            return at_value(tail, new_value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# EULA
 | 
				
			||||||
 | 
					EULA = at(['minecraft', 'eula']) or False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Minecraft bridge credentials
 | 
					# Minecraft bridge credentials
 | 
				
			||||||
MATRIX_HOMESERVER = os.getenv('MATRIX_HOMESERVER')  or "https://homeserv.er"
 | 
					MATRIX_HOMESERVER = at(['matrix', 'homeserver']) or "https://matrix.example.org/"
 | 
				
			||||||
MATRIX_USERNAME   = os.getenv('MATRIX_USERNAME')    or "@bridge_username:homeserv.er"
 | 
					MATRIX_USERNAME   = at(['matrix', 'username'])   or "@alice:example.org"
 | 
				
			||||||
MATRIX_PASSWORD   = os.getenv('MATRIX_PASSWORD')    or "bridge_password"
 | 
					MATRIX_PASSWORD   = at(['matrix', 'password'])   or "bridge_password"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Matrix bridge room
 | 
				
			||||||
 | 
					MATRIX_ROOM = at(['matrix', 'room_id']) or "!channel_id:example.org"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SERVER_IP = os.getenv('SERVER_ADDRESS') or 'unknown ip'
 | 
					SERVER_IP = os.getenv('SERVER_ADDRESS') or 'unknown ip'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,9 +48,6 @@ MC_ADMINS = [
 | 
				
			||||||
if os.getenv('MATRIX_ADMINS') is not None:
 | 
					if os.getenv('MATRIX_ADMINS') is not None:
 | 
				
			||||||
    MC_ADMINS = os.getenv('MATRIX_ADMINS').split(',')
 | 
					    MC_ADMINS = os.getenv('MATRIX_ADMINS').split(',')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Matrix channel that the bot should talk to
 | 
					 | 
				
			||||||
MC_CHANNEL = os.getenv('MC_CHANNEL') or "!channel_id:homeserv.er"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
make_bool = lambda os_value, default_value : default_value if not os_value else (
 | 
					make_bool = lambda os_value, default_value : default_value if not os_value else (
 | 
				
			||||||
    False if os_value.lower() == 'false' else True
 | 
					    False if os_value.lower() == 'false' else True
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,175 @@
 | 
				
			||||||
 | 
					# Matrix bridge configurations
 | 
				
			||||||
 | 
					matrix:
 | 
				
			||||||
 | 
					  # Homeserver URL
 | 
				
			||||||
 | 
					  homeserver: https://matrix.example.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Bridge login credentials
 | 
				
			||||||
 | 
					  username: "@alice:example.org"
 | 
				
			||||||
 | 
					  password: bridge_password
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Matrix room
 | 
				
			||||||
 | 
					  room_id: "!channel_id:example.org"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # IP address or domain where users can join the server
 | 
				
			||||||
 | 
					  server_address: unknown ip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # List of Matrix users that can send commands to the bridge.
 | 
				
			||||||
 | 
					  # When a message starts with a slash, (/) the bridge will interpret it as a
 | 
				
			||||||
 | 
					  # Minecraft command and will put that as a command into the console.
 | 
				
			||||||
 | 
					  mc-admins:
 | 
				
			||||||
 | 
					    - "@bram:matrix.directory"
 | 
				
			||||||
 | 
					    # - "@alice:example.org"
 | 
				
			||||||
 | 
					    # - 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # When users have bridged from other platforms, you can indicate accordingly.
 | 
				
			||||||
 | 
					  alternative_platforms:
 | 
				
			||||||
 | 
					    Discord:
 | 
				
			||||||
 | 
					      match: "@_?discord_\d+:.+"
 | 
				
			||||||
 | 
					      text: D
 | 
				
			||||||
 | 
					      color: aqua
 | 
				
			||||||
 | 
					    WhatsApp:
 | 
				
			||||||
 | 
					      match: "@whatsapp_\d+:.+"
 | 
				
			||||||
 | 
					      text: W
 | 
				
			||||||
 | 
					      color: green
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Settings that directly affect running the Minecraft server.
 | 
				
			||||||
 | 
					minecraft:
 | 
				
			||||||
 | 
					  # Confirm the Minecraft EULA. Defaults to false.
 | 
				
			||||||
 | 
					  # eula: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # --------------------
 | 
				
			||||||
 | 
					  # MINECRAFT SERVER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Exposed port. Defaults to 25565
 | 
				
			||||||
 | 
					  server-port: 25565
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Maximum amount of players welcome on the server at a time.
 | 
				
			||||||
 | 
					  # Defaults to 20.
 | 
				
			||||||
 | 
					  # max-players: 7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Whether to enable command blocks. Defaults to false.
 | 
				
			||||||
 | 
					  # enable-command-block: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Controls how close entities need to be before being sent to clients.
 | 
				
			||||||
 | 
					  # Higher values means they'll be rendered from farther away,
 | 
				
			||||||
 | 
					  # potentially causing more lag.
 | 
				
			||||||
 | 
					  # Value must be between 10 and 1000
 | 
				
			||||||
 | 
					  # entity-broadcast-range-percentage: 150
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Server description
 | 
				
			||||||
 | 
					  # This is the message that is displayed in the server list of the client, 
 | 
				
			||||||
 | 
					  # below the name. It supports color formatting!
 | 
				
			||||||
 | 
					  # Defaults to a Minecraft server.
 | 
				
			||||||
 | 
					  # motd: A Minecraft server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # --------------------
 | 
				
			||||||
 | 
					  # SECURITY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Whether the server appears "online" to clients. Defaults to true.
 | 
				
			||||||
 | 
					  # When set to false, the server appears offline but users can still join.
 | 
				
			||||||
 | 
					  # enable-status: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # If the whitelist is reloaded and/or enabled, any online player not on
 | 
				
			||||||
 | 
					  # the whitelist, gets kicked immediately. Defaults to false.
 | 
				
			||||||
 | 
					  # enforce-whitelist: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Hide online players. This effectively hides who's online when looking
 | 
				
			||||||
 | 
					  # at the server's online status. Defaults to false.
 | 
				
			||||||
 | 
					  # hide-online-players: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Server checks connecting players against Minecraft account database.
 | 
				
			||||||
 | 
					  # Set this to false only if the player's server is not connected to the
 | 
				
			||||||
 | 
					  # Internet. Hackers with fake accounts can connect if this is set to false!
 | 
				
			||||||
 | 
					  # If minecraft.net is down or inaccessible, no players can connect if this
 | 
				
			||||||
 | 
					  # is set to true. Setting this variable to off purposely is called "cracking"
 | 
				
			||||||
 | 
					  # a server, and servers that are present with online mode off are called
 | 
				
			||||||
 | 
					  # "cracked" servers, allowing players with unlicensed copies of Minecraft
 | 
				
			||||||
 | 
					  # to join.
 | 
				
			||||||
 | 
					  # Defaults to true.
 | 
				
			||||||
 | 
					  # online-mode: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Sets whether the server sends snoop data regularly
 | 
				
			||||||
 | 
					  # to http://snoop.minecraft.net.
 | 
				
			||||||
 | 
					  # Defaults to true.
 | 
				
			||||||
 | 
					  snooper-enabled: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Enables a whitelist on the server. Defaults to false.
 | 
				
			||||||
 | 
					  # white-list: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # --------------------
 | 
				
			||||||
 | 
					  # ANTI ABUSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Allow users to use flight on the server. Defaults to false.
 | 
				
			||||||
 | 
					  # When set to false, players in the air for at least 5 seconds get kicked
 | 
				
			||||||
 | 
					  # allow-flight: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Allow only players with a confirmed Mojang account to join the server.
 | 
				
			||||||
 | 
					  # When set to false, users might have a cracked Minecraft account when joining.
 | 
				
			||||||
 | 
					  # enforce-secure-profile: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # If non-zero, players are kicked from the server if they are idle for
 | 
				
			||||||
 | 
					  # more than that many minutes.
 | 
				
			||||||
 | 
					  # Defaults to zero.
 | 
				
			||||||
 | 
					  # player-idle-timeout: 15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Enable PvP on the server. Defaults to true.
 | 
				
			||||||
 | 
					  # pvp: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # --------------------
 | 
				
			||||||
 | 
					  # WORLD SETTINGS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Whether nether portals work. Defaults to true.
 | 
				
			||||||
 | 
					  # allow-nether: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Force players into the "default" gamemode when they (re)join the server.
 | 
				
			||||||
 | 
					  # Defaults to false.
 | 
				
			||||||
 | 
					  # force-gamemode: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Whether structures (such as villages) can be generated. Defaults to true.
 | 
				
			||||||
 | 
					  # generate-structures: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Sets a world seed for the player's world, as in singleplayer.
 | 
				
			||||||
 | 
					  # If omitted, the world generates with a random seed.
 | 
				
			||||||
 | 
					  # level-seed: ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Sets the maximum distance from players that living entities may be located
 | 
				
			||||||
 | 
					  # in order to be updated by the server, measured in chunks in each direction
 | 
				
			||||||
 | 
					  # of the player (radius, not diameter).
 | 
				
			||||||
 | 
					  # Options: 3 - 32. Defaults to 10, which is recommended.
 | 
				
			||||||
 | 
					  # simulation-distance: 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Whether animals can spawn. Defaults to true.
 | 
				
			||||||
 | 
					  # spawn-animals: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Whether monsters can spawn. Defaults to true.
 | 
				
			||||||
 | 
					  # spawn-monsters: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Whether villagers can spawn. Defaults to true.
 | 
				
			||||||
 | 
					  # spawn-npcs: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Determines the side length of the square spawn protection area as 2x+1.
 | 
				
			||||||
 | 
					  # Setting this to 0 disables the spawn protection. A value of 1 protects
 | 
				
			||||||
 | 
					  # a 3×3 square centered on the spawn point. 2 protects 5×5, 3 protects 7×7,
 | 
				
			||||||
 | 
					  # etc. If there are no ops set on the server, the spawn protection is
 | 
				
			||||||
 | 
					  # disabled automatically as well. 
 | 
				
			||||||
 | 
					  # Defaults to 16.
 | 
				
			||||||
 | 
					  # spawn-protection: 9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # --------------------
 | 
				
			||||||
 | 
					  # GAMEPLAY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Set the difficulty of the server. Defaults to easy.
 | 
				
			||||||
 | 
					  # Options: peaceful, easy, medium, hard
 | 
				
			||||||
 | 
					  difficulty: easy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Default gamemode. Defaults to survival.
 | 
				
			||||||
 | 
					  # Options: survival, creative, adventure, spectator
 | 
				
			||||||
 | 
					  gamemode: survival
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Enable hardcore mode. Defaults to false.
 | 
				
			||||||
 | 
					  # If set to true, server difficulty is ignored and set to hard,
 | 
				
			||||||
 | 
					  # and players are set to spectator mode when they die.
 | 
				
			||||||
 | 
					  # hardcore: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Maximum view distance. Defaults to 10.
 | 
				
			||||||
 | 
					  # view-distance: 15
 | 
				
			||||||
							
								
								
									
										2
									
								
								main.py
								
								
								
								
							
							
						
						
									
										2
									
								
								main.py
								
								
								
								
							| 
						 | 
					@ -13,7 +13,7 @@ STARTUP_TIME = time.time()
 | 
				
			||||||
client = AsyncClient(config.MATRIX_HOMESERVER, config.MATRIX_USERNAME)
 | 
					client = AsyncClient(config.MATRIX_HOMESERVER, config.MATRIX_USERNAME)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async def message_callback(room: MatrixRoom, event: RoomMessageText) -> None:
 | 
					async def message_callback(room: MatrixRoom, event: RoomMessageText) -> None:
 | 
				
			||||||
    if room.machine_name != config.MC_CHANNEL:
 | 
					    if room.machine_name != config.MATRIX_ROOM:
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
    if event.sender == client.user_id:
 | 
					    if event.sender == client.user_id:
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,27 +1,25 @@
 | 
				
			||||||
aiofiles==0.6.0
 | 
					aiofiles==23.2.1
 | 
				
			||||||
aiohttp==3.7.4.post0
 | 
					aiohttp==3.8.5
 | 
				
			||||||
aiohttp-socks==0.6.0
 | 
					aiohttp-socks==0.7.1
 | 
				
			||||||
appdirs==1.4.4
 | 
					aiosignal==1.3.1
 | 
				
			||||||
async-timeout==3.0.1
 | 
					async-timeout==4.0.3
 | 
				
			||||||
attrs==21.2.0
 | 
					attrs==23.1.0
 | 
				
			||||||
chardet==4.0.0
 | 
					charset-normalizer==3.3.0
 | 
				
			||||||
distlib==0.3.2
 | 
					frozenlist==1.4.0
 | 
				
			||||||
filelock==3.0.12
 | 
					future==0.18.3
 | 
				
			||||||
future==0.18.2
 | 
					h11==0.14.0
 | 
				
			||||||
h11==0.12.0
 | 
					h2==4.1.0
 | 
				
			||||||
h2==4.0.0
 | 
					 | 
				
			||||||
hpack==4.0.0
 | 
					hpack==4.0.0
 | 
				
			||||||
hyperframe==6.0.1
 | 
					hyperframe==6.0.1
 | 
				
			||||||
idna==3.2
 | 
					idna==3.4
 | 
				
			||||||
jsonschema==3.2.0
 | 
					jsonschema==4.19.1
 | 
				
			||||||
Logbook==1.5.3
 | 
					jsonschema-specifications==2023.7.1
 | 
				
			||||||
matrix-nio==0.18.3
 | 
					matrix-nio==0.21.2
 | 
				
			||||||
multidict==5.1.0
 | 
					multidict==6.0.4
 | 
				
			||||||
pycryptodome==3.10.1
 | 
					pycryptodome==3.19.0
 | 
				
			||||||
pyrsistent==0.17.3
 | 
					python-socks==2.4.3
 | 
				
			||||||
python-socks==1.2.4
 | 
					PyYAML==6.0.1
 | 
				
			||||||
six==1.16.0
 | 
					referencing==0.30.2
 | 
				
			||||||
typing-extensions==3.10.0.0
 | 
					rpds-py==0.10.3
 | 
				
			||||||
unpaddedbase64==2.1.0
 | 
					unpaddedbase64==2.1.0
 | 
				
			||||||
virtualenv==20.4.7
 | 
					yarl==1.9.2
 | 
				
			||||||
yarl==1.6.3
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue