diff --git a/actions/minetest b/actions/minetest index de855b09f..ba31daf28 100755 --- a/actions/minetest +++ b/actions/minetest @@ -71,28 +71,24 @@ def subcommand_configure(arguments): def set_max_players(max_players): """Sets the number of max players""" - aug.set(AUG_PATH + '/max_users', max_players) aug.save() def enable_pvp(choice): """Enables pvp""" - aug.set(AUG_PATH + '/enable_pvp', choice) aug.save() def set_creative_mode(choice): """Enables or disables creative mode""" - aug.set(AUG_PATH + '/creative_mode', choice) aug.save() def enable_damage(choice): """Enables damage""" - aug.set(AUG_PATH + '/enable_damage', choice) aug.save() diff --git a/plinth/modules/minetest/__init__.py b/plinth/modules/minetest/__init__.py index d2e8f4b75..110c994a4 100644 --- a/plinth/modules/minetest/__init__.py +++ b/plinth/modules/minetest/__init__.py @@ -19,6 +19,8 @@ Plinth module for minetest. """ +import augeas + from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ @@ -28,7 +30,6 @@ from plinth import cfg from plinth import frontpage from plinth import service as service_module from plinth.utils import format_lazy -from plinth.views import ServiceView version = 2 @@ -57,6 +58,18 @@ description = [ 'is needed.'), box_name=_(cfg.box_name)), ] +CONFIG_FILE = '/etc/minetest/minetest.conf' +AUG_PATH = '/files' + CONFIG_FILE + '/.anon' + +def load_augeas(): + """Initialize Augeas.""" + aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + + augeas.Augeas.NO_MODL_AUTOLOAD) + aug.set('/augeas/load/Php/lens', 'Php.lns') + aug.set('/augeas/load/Php/incl[last() + 1]', CONFIG_FILE) + aug.load() + return aug + def init(): """Initialize the module.""" @@ -107,13 +120,6 @@ def disable(): frontpage.remove_shortcut('minetest') -class MinetestServiceView(ServiceView): - service_id = managed_services[0] - diagnostics_module_name = "minetest" - description = description - show_status_block = True - - def diagnose(): """Run diagnostics and return the results.""" results = [] @@ -121,3 +127,40 @@ def diagnose(): results.append(action_utils.diagnose_port_listening(30000, 'udp4')) return results + + +def get_max_players_value(): + """Return the current Max Players value.""" + aug = load_augeas() + value = aug.get(AUG_PATH + '/max_users') + if value: + return int(value) + + +def get_creative_mode_value(): + """Return the current Creative mode value.""" + aug = load_augeas() + value = aug.get(AUG_PATH + '/creative_mode') + if value == "true": + return True + else: + return False + + +def get_enable_pvp_value(): + """Return the current Enable pvp value.""" + aug = load_augeas() + value = aug.get(AUG_PATH + '/enable_pvp') + if value == "true": + return True + else: + return False + +def get_enable_damage_value(): + """Return the current Enable damage value.""" + aug = load_augeas() + value = aug.get(AUG_PATH + '/enable_damage') + if value == "true": + return True + else: + return False diff --git a/plinth/modules/minetest/forms.py b/plinth/modules/minetest/forms.py new file mode 100644 index 000000000..864be021c --- /dev/null +++ b/plinth/modules/minetest/forms.py @@ -0,0 +1,50 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for miinetest module. +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ + +from plinth.forms import ServiceForm + +class MinetestForm(ServiceForm): + """Minetest configuration form""" + max_players = forms.IntegerField( + label=_('Maximum number of players'), + required=True, + help_text=_('You can change the maximum number of players playing \ + minetest at a single instance of time')) + + creative_mode = forms.BooleanField( + label=_('Enable creative mode'), + required=False, + help_text=_('Creative Mode changes the rules of the game to make it\ + more suitable for creative gameplay, rather than challenging\ + “survival” gameplay.')) + + enable_pvp = forms.BooleanField( + label=_('Enable pvp'), + required=False, + help_text=_('Enabling Player Vs Player will cause players to damage \ + other players')) + + enable_damage = forms.BooleanField( + label=_('Enable damage'), + required=False) diff --git a/plinth/modules/minetest/urls.py b/plinth/modules/minetest/urls.py index 2ffa4dc44..dd9f94aa2 100644 --- a/plinth/modules/minetest/urls.py +++ b/plinth/modules/minetest/urls.py @@ -21,7 +21,7 @@ URLs for the minetest module. from django.conf.urls import url -from plinth.modules.minetest import MinetestServiceView +from plinth.modules.minetest.views import MinetestServiceView urlpatterns = [ diff --git a/plinth/modules/minetest/views.py b/plinth/modules/minetest/views.py new file mode 100644 index 000000000..9f05b36e4 --- /dev/null +++ b/plinth/modules/minetest/views.py @@ -0,0 +1,102 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Views for minetest module. +""" + +from django.contrib import messages +from django.utils.translation import ugettext_lazy as _ + +from plinth import actions +from plinth.views import ServiceView +from plinth import action_utils + + +from . import description, managed_services, get_max_players_value,\ + get_enable_pvp_value, get_creative_mode_value,\ + get_enable_damage_value +from .forms import MinetestForm + + +class MinetestServiceView(ServiceView): # pylint: disable=too-many-ancestors + """A specialized view for configuring minetest.""" + service_id = managed_services[0] + diagnostics_module_name = "minetest" + description = description + show_status_block = True + form_class = MinetestForm + + def get_initial(self): + """Return the values to fill in the form.""" + initial = super().get_initial() + + initial['max_players'] = get_max_players_value() + initial['creative_mode'] = get_creative_mode_value() + initial['enable_pvp'] = get_enable_pvp_value() + initial['enable_damage'] = get_enable_damage_value() + return initial + + def form_valid(self, form): + """Change the configurations of Minetest service.""" + data = form.cleaned_data + + if get_max_players_value() != data['max_players'] and data['max_players'] != None: + actions.superuser_run( + 'minetest', + ['configure', '--max_players', str(data['max_players'])]) + messages.success(self.request, + _('Maximum players configuration updated')) + + if data['creative_mode'] is True: + value = "true" + else: + value = "false" + + if get_creative_mode_value() != data['creative_mode']: + actions.superuser_run( + 'minetest', + ['configure', '--creative_mode', value]) + messages.success(self.request, + _('Creative mode configuration updated')) + + if data['enable_pvp'] is True: + value = "true" + else: + value = "false" + + if get_enable_pvp_value() != data['enable_pvp']: + actions.superuser_run( + 'minetest', + ['configure', '--enable_pvp', value]) + messages.success(self.request, + _('PvP configuration updated')) + + if data['enable_damage'] is True: + value = "true" + else: + value = "false" + + if get_enable_damage_value() != data['enable_damage']: + actions.superuser_run( + 'minetest', + ['configure', '--enable_damage', value]) + messages.success(self.request, + _('Damage configuration updated')) + + + return super().form_valid(form)