4 Commits

Author SHA1 Message Date
b2a865818f Merge pull request '1.1.0' (#1) from Dev into master
Reviewed-on: #1
2026-06-28 12:28:51 +00:00
afd0f434db Update menu entries and fixes some profile picture problems.
Added help pages too.
2026-06-28 14:07:20 +02:00
bb0658b0e5 Added NSFW compatibility 2026-06-27 18:57:26 +02:00
2222d88b1d Fix migration problems 2026-06-24 12:39:01 +02:00
67 changed files with 1286 additions and 15 deletions

View File

@@ -21,6 +21,7 @@ class Setup extends AbstractSetup
{
$this->schemaManager()->alterTable('xf_user', function (\XF\Db\Schema\Alter $table) {
$table->addColumn('rhpz_entry_count', 'int')->setDefault(0);
$table->addColumn('nsfw_content', 'int')->setDefault(0);
});
}
@@ -56,10 +57,17 @@ class Setup extends AbstractSetup
});
}
public function upgrade1010070Step1(): void
{
$this->schemaManager()->alterTable('xf_user', function (\XF\Db\Schema\Alter $table) {
$table->addColumn('nsfw_content', 'int')->setDefault(0);
});
}
public function uninstallStep1(): void
{
$this->schemaManager()->alterTable('xf_user', function($table) {
$table->dropColumns(['rhpz_entry_count']);
$table->dropColumns(['rhpz_entry_count', 'nsfw_content']);
});
}

View File

@@ -12,6 +12,7 @@ class User extends XFCP_User
$structure = parent::getStructure($structure);
$structure->columns['rhpz_entry_count'] = [ 'type' => self::UINT, 'default' => 0 ];
$structure->columns['nsfw_content'] = [ 'type' => self::BOOL, 'default' => 0 ];
return $structure;
}

View File

@@ -3,6 +3,7 @@
namespace RomhackPlaza\Master\XF\Pub\Controller;
use RomhackPlaza\Master\Service\DeleteAccount\CodeService;
use XF\Entity\User;
class AccountController extends XFCP_AccountController
{
@@ -22,4 +23,18 @@ class AccountController extends XFCP_AccountController
return $this->addAccountWrapperParams($view, 'delete_account');
}
protected function preferencesSaveProcess(User $visitor)
{
$form = parent::preferencesSaveProcess($visitor);
$input = $this->filter([
'user' => [
'nsfw_content' => 'bool',
]
]);
$form->basicEntitySave($visitor, $input['user'] );
return $form;
}
}

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<activity_summary_definitions/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<admin_navigation/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<admin_permission/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<advertising_positions/>

2
_data/api_scopes.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<api_scopes/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<bb_code_media_sites/>

2
_data/bb_codes.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<bb_codes/>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<class_extensions>
<extension from_class="XF\Admin\Controller\UserController" to_class="RomhackPlaza\Master\XF\Admin\Controller\UserController" execute_order="10" active="1"/>
<extension from_class="XF\Entity\ApprovalQueue" to_class="RomhackPlaza\Master\XF\Entity\ApprovalQueue" execute_order="10" active="1"/>
<extension from_class="XF\Entity\Forum" to_class="RomhackPlaza\Master\XF\Entity\Forum" execute_order="10" active="1"/>
<extension from_class="XF\Entity\User" to_class="RomhackPlaza\Master\XF\Entity\User" execute_order="10" active="1"/>
<extension from_class="XF\Pub\Controller\AccountController" to_class="RomhackPlaza\Master\XF\Pub\Controller\AccountController" execute_order="10" active="1"/>
<extension from_class="XF\Pub\Controller\MiscController" to_class="RomhackPlaza\Master\XF\Pub\Controller\MiscController" execute_order="10" active="1"/>
<extension from_class="XF\Service\Report\CreatorService" to_class="RomhackPlaza\Master\XF\Service\Report\CreatorService" execute_order="10" active="1"/>
</class_extensions>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<code_event_listeners>
<listener event_id="app_pub_render_page" execute_order="10" callback_class="RomhackPlaza\Master\Listener" callback_method="checkStyleVariation" active="1"/>
<listener event_id="criteria_user" execute_order="10" callback_class="RomhackPlaza\Master\Listener" callback_method="criteriaUser" active="1"/>
<listener event_id="import_importer_classes" execute_order="15" callback_class="RomhackPlaza\Master\Listener" callback_method="importImporterClasses" active="1"/>
</code_event_listeners>

2
_data/code_events.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<code_events/>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<content_type_fields>
<field content_type="club" field_name="approval_queue_handler_class">RomhackPlaza\Master\ApprovalQueue\Club</field>
<field content_type="club" field_name="entity">RomhackPlaza\Master\Entity\Club</field>
<field content_type="rhpz_entry_featurerequest" field_name="approval_queue_handler_class">RomhackPlaza\Master\ApprovalQueue\EntryFeaturedRequest</field>
<field content_type="rhpz_entry_featurerequest" field_name="entity">RomhackPlaza\Master\Entity\EntryFeaturedRequest</field>
<field content_type="romhackplaza_entry" field_name="entity">RomhackPlaza\Master\Entity\Entry</field>
<field content_type="romhackplaza_entry" field_name="report_handler_class">RomhackPlaza\Master\Report\Entry</field>
<field content_type="romhackplaza_news" field_name="entity">RomhackPlaza\Master\Entity\News</field>
<field content_type="romhackplaza_news" field_name="report_handler_class">RomhackPlaza\Master\Report\News</field>
</content_type_fields>

2
_data/cron.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<cron/>

2
_data/help_pages.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<help_pages/>

2
_data/member_stats.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<member_stats/>

22
_data/navigation.xml Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation>
<navigation_entry navigation_id="about" parent_navigation_id="pages" display_order="200" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/pages\/about","display_condition":"","extra_attributes":{"icon":"info"}}]]></navigation_entry>
<navigation_entry navigation_id="clubs" parent_navigation_id="community" display_order="200" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{{ link('clubs') }}","display_condition":"","extra_attributes":{"icon":"balloon"}}]]></navigation_entry>
<navigation_entry navigation_id="community" display_order="300" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"","display_condition":"","extra_attributes":[]}]]></navigation_entry>
<navigation_entry navigation_id="contact_us" parent_navigation_id="pages" display_order="300" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{{ link('misc\/contact') }}","display_condition":"","extra_attributes":{"icon":"at-sign"}}]]></navigation_entry>
<navigation_entry navigation_id="database" parent_navigation_id="website" display_order="200" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/database","display_condition":"","extra_attributes":{"icon":"database"}}]]></navigation_entry>
<navigation_entry navigation_id="discord" parent_navigation_id="community" display_order="300" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/discord","display_condition":"","extra_attributes":{"icon":"messages-square"}}]]></navigation_entry>
<navigation_entry navigation_id="drafts" parent_navigation_id="website" display_order="400" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/my-drafts","display_condition":"{$xf.visitor.user_id}","extra_attributes":{"icon":"scissors"}}]]></navigation_entry>
<navigation_entry navigation_id="forum" parent_navigation_id="community" display_order="100" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.boardUrl}","display_condition":"","extra_attributes":{"icon":"message-circle"}}]]></navigation_entry>
<navigation_entry navigation_id="home" parent_navigation_id="website" display_order="100" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}","display_condition":"","extra_attributes":{"icon":"home"}}]]></navigation_entry>
<navigation_entry navigation_id="learn_romhacking" parent_navigation_id="pages" display_order="100" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/pages\/learn","display_condition":"","extra_attributes":{"icon":"graduation-cap"}}]]></navigation_entry>
<navigation_entry navigation_id="legal_pages" parent_navigation_id="pages" display_order="400" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/pages\/legal-pages","display_condition":"","extra_attributes":{"icon":"scale"}}]]></navigation_entry>
<navigation_entry navigation_id="members" parent_navigation_id="community" display_order="400" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{{ link('members') }}","display_condition":"","extra_attributes":{"icon":"users"}}]]></navigation_entry>
<navigation_entry navigation_id="news" parent_navigation_id="website" display_order="250" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/news","display_condition":"","extra_attributes":{"icon":"newspaper"}}]]></navigation_entry>
<navigation_entry navigation_id="pages" display_order="500" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"","display_condition":"","extra_attributes":[]}]]></navigation_entry>
<navigation_entry navigation_id="rom_hasher" parent_navigation_id="tools" display_order="200" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/hash","display_condition":"","extra_attributes":{"icon":"hash"}}]]></navigation_entry>
<navigation_entry navigation_id="rom_patcher" parent_navigation_id="tools" display_order="100" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/patch","display_condition":"","extra_attributes":{"icon":"stamp"}}]]></navigation_entry>
<navigation_entry navigation_id="submissions_queue" parent_navigation_id="website" display_order="300" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"{$xf.options.homePageUrl}\/queue","display_condition":"","extra_attributes":{"icon":"gavel"}}]]></navigation_entry>
<navigation_entry navigation_id="tools" display_order="400" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"","display_condition":"","extra_attributes":[]}]]></navigation_entry>
<navigation_entry navigation_id="website" display_order="200" navigation_type_id="basic" enabled="1"><![CDATA[{"link":"","display_condition":"","extra_attributes":[]}]]></navigation_entry>
</navigation>

4
_data/option_groups.xml Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<option_groups>
<group group_id="romhackplaza" icon="fa-umbrella-beach" display_order="500" debug_only="0"/>
</option_groups>

15
_data/options.xml Normal file
View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<options>
<option option_id="rhpz_club_node_id" edit_format="spinbox" data_type="unsigned_integer" advanced="0">
<default_value>0</default_value>
<relation group_id="romhackplaza" display_order="1"/>
</option>
<option option_id="rhpz_delete_account_master_key" edit_format="textbox" data_type="string" advanced="0">
<default_value></default_value>
<relation group_id="romhackplaza" display_order="1"/>
</option>
<option option_id="rhpz_enable_migration" edit_format="onoff" data_type="boolean" advanced="1">
<default_value>0</default_value>
<relation group_id="romhackplaza" display_order="500"/>
</option>
</options>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<permission_interface_groups>
<interface_group interface_group_id="romhackplaza" display_order="500" is_moderator="0"/>
</permission_interface_groups>

14
_data/permissions.xml Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<permission permission_group_id="romhackplaza" permission_id="canEditMyEntries" permission_type="flag" interface_group_id="romhackplaza" display_order="4"/>
<permission permission_group_id="romhackplaza" permission_id="canEditOthersEntries" permission_type="flag" interface_group_id="romhackplaza" display_order="5"/>
<permission permission_group_id="romhackplaza" permission_id="canModerateEntries" permission_type="flag" interface_group_id="romhackplaza" display_order="6"/>
<permission permission_group_id="romhackplaza" permission_id="canSeeHiddenEntries" permission_type="flag" interface_group_id="romhackplaza" display_order="9"/>
<permission permission_group_id="romhackplaza" permission_id="canSeeLockedEntries" permission_type="flag" interface_group_id="romhackplaza" display_order="10"/>
<permission permission_group_id="romhackplaza" permission_id="canSeeOthersDrafts" permission_type="flag" interface_group_id="romhackplaza" display_order="7"/>
<permission permission_group_id="romhackplaza" permission_id="canSeeRejectedEntries" permission_type="flag" interface_group_id="romhackplaza" display_order="8"/>
<permission permission_group_id="romhackplaza" permission_id="canSubmitEntry" permission_type="flag" interface_group_id="romhackplaza" display_order="2"/>
<permission permission_group_id="romhackplaza" permission_id="canSubmitEntryInPublished" permission_type="flag" interface_group_id="romhackplaza" display_order="11"/>
<permission permission_group_id="romhackplaza" permission_id="canSubmitTempFile" permission_type="flag" interface_group_id="romhackplaza" display_order="3"/>
<permission permission_group_id="romhackplaza" permission_id="view" permission_type="flag" interface_group_id="romhackplaza" display_order="1"/>
</permissions>

49
_data/phrases.xml Normal file
View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<phrases>
<phrase title="delete_account" version_id="1000000" version_string="1.0.0"><![CDATA[Delete account]]></phrase>
<phrase title="delete_account_code" version_id="1000000" version_string="1.0.0"><![CDATA[Delete account code]]></phrase>
<phrase title="delete_account_codes" version_id="1000000" version_string="1.0.0"><![CDATA[Delete account codes]]></phrase>
<phrase title="delete_all_data_code" version_id="1000000" version_string="1.0.0"><![CDATA[Delete all data code]]></phrase>
<phrase title="enable_nsfw_entries" version_id="1010070" version_string="1.1.0"><![CDATA[Enable NSFW Entries]]></phrase>
<phrase title="entries" version_id="1000000" version_string="1.0.0"><![CDATA[Entries]]></phrase>
<phrase title="entries_options" version_id="1010070" version_string="1.1.0"><![CDATA[Entries options]]></phrase>
<phrase title="nav.about" version_id="1000000" version_string="1.0.0"><![CDATA[About]]></phrase>
<phrase title="nav.clubs" version_id="1000000" version_string="1.0.0"><![CDATA[Clubs]]></phrase>
<phrase title="nav.community" version_id="1000000" version_string="1.0.0"><![CDATA[Community]]></phrase>
<phrase title="nav.contact_us" version_id="1000000" version_string="1.0.0"><![CDATA[Contact Us]]></phrase>
<phrase title="nav.database" version_id="1000000" version_string="1.0.0"><![CDATA[Database]]></phrase>
<phrase title="nav.discord" version_id="1000000" version_string="1.0.0"><![CDATA[Discord]]></phrase>
<phrase title="nav.drafts" version_id="1000000" version_string="1.0.0"><![CDATA[My drafts]]></phrase>
<phrase title="nav.forum" version_id="1000000" version_string="1.0.0"><![CDATA[Forum]]></phrase>
<phrase title="nav.home" version_id="1000000" version_string="1.0.0"><![CDATA[Home]]></phrase>
<phrase title="nav.learn_romhacking" version_id="1000000" version_string="1.0.0"><![CDATA[Learn Romhacking]]></phrase>
<phrase title="nav.legal_pages" version_id="1000000" version_string="1.0.0"><![CDATA[Legal Pages]]></phrase>
<phrase title="nav.members" version_id="1000000" version_string="1.0.0"><![CDATA[Members]]></phrase>
<phrase title="nav.news" version_id="1000000" version_string="1.0.0"><![CDATA[News]]></phrase>
<phrase title="nav.pages" version_id="1000000" version_string="1.0.0"><![CDATA[Pages]]></phrase>
<phrase title="nav.rom_hasher" version_id="1000000" version_string="1.0.0"><![CDATA[ROM Hasher]]></phrase>
<phrase title="nav.rom_patcher" version_id="1000000" version_string="1.0.0"><![CDATA[ROM Patcher]]></phrase>
<phrase title="nav.submissions_queue" version_id="1000000" version_string="1.0.0"><![CDATA[Submissions queue]]></phrase>
<phrase title="nav.tools" version_id="1000000" version_string="1.0.0"><![CDATA[Tools]]></phrase>
<phrase title="nav.website" version_id="1000000" version_string="1.0.0"><![CDATA[Website]]></phrase>
<phrase title="option.rhpz_club_node_id" version_id="1000000" version_string="1.0.0"><![CDATA[Club Parent Node ID]]></phrase>
<phrase title="option.rhpz_delete_account_master_key" version_id="1000000" version_string="1.0.0"><![CDATA[Delete account Master key]]></phrase>
<phrase title="option.rhpz_enable_migration" version_id="1000000" version_string="1.0.0"><![CDATA[Enable Migration functions]]></phrase>
<phrase title="option_explain.rhpz_club_node_id" version_id="1000000" version_string="1.0.0"><![CDATA[]]></phrase>
<phrase title="option_explain.rhpz_delete_account_master_key" version_id="1000000" version_string="1.0.0"><![CDATA[]]></phrase>
<phrase title="option_explain.rhpz_enable_migration" version_id="1000000" version_string="1.0.0"><![CDATA[Enable migration endpoints and other things.]]></phrase>
<phrase title="option_group.romhackplaza" version_id="1000000" version_string="1.0.0"><![CDATA[RomhackPlaza Options]]></phrase>
<phrase title="option_group_description.romhackplaza" version_id="1000000" version_string="1.0.0"><![CDATA[These options are specific to Romhack Plaza]]></phrase>
<phrase title="permission.romhackplaza_canEditMyEntries" version_id="1000000" version_string="1.0.0"><![CDATA[Can Edit My Entries]]></phrase>
<phrase title="permission.romhackplaza_canEditOthersEntries" version_id="1000000" version_string="1.0.0"><![CDATA[Can Edit Others Entries]]></phrase>
<phrase title="permission.romhackplaza_canModerateEntries" version_id="1000000" version_string="1.0.0"><![CDATA[Can Moderate Entries]]></phrase>
<phrase title="permission.romhackplaza_canSeeHiddenEntries" version_id="1000000" version_string="1.0.0"><![CDATA[Can See Hidden Entries]]></phrase>
<phrase title="permission.romhackplaza_canSeeLockedEntries" version_id="1000000" version_string="1.0.0"><![CDATA[Can See Locked Entries]]></phrase>
<phrase title="permission.romhackplaza_canSeeOthersDrafts" version_id="1000000" version_string="1.0.0"><![CDATA[Can See Others Drafts]]></phrase>
<phrase title="permission.romhackplaza_canSeeRejectedEntries" version_id="1000000" version_string="1.0.0"><![CDATA[Can See Rejected Entries]]></phrase>
<phrase title="permission.romhackplaza_canSubmitEntry" version_id="1000000" version_string="1.0.0"><![CDATA[Can Submit Entry]]></phrase>
<phrase title="permission.romhackplaza_canSubmitEntryInPublished" version_id="1000000" version_string="1.0.0"><![CDATA[Can Submit Entry in Published]]></phrase>
<phrase title="permission.romhackplaza_canSubmitTempFile" version_id="1000000" version_string="1.0.0"><![CDATA[Can Submit Temporary File]]></phrase>
<phrase title="permission.romhackplaza_view" version_id="1000000" version_string="1.0.0"><![CDATA[View entries]]></phrase>
<phrase title="permission_interface.romhackplaza" version_id="1000000" version_string="1.0.0"><![CDATA[Romhack Plaza permissions]]></phrase>
</phrases>

9
_data/routes.xml Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<routes>
<route route_type="api" route_prefix="migrate" controller="RomhackPlaza\Master:Migrate"/>
<route route_type="api" route_prefix="romhackplaza_entry" controller="RomhackPlaza\Master:Entry"/>
<route route_type="api" route_prefix="threads" sub_name="undelete" format=":int&lt;thread_id&gt;/undelete" controller="RomhackPlaza\Master:Thread"/>
<route route_type="public" route_prefix="clubs" format=":int&lt;club_id&gt;/" controller="RomhackPlaza\Master:Club"/>
<route route_type="public" route_prefix="romhackplaza_entry" format=":int&lt;id&gt;" controller="RomhackPlaza\Master:Entry"/>
<route route_type="public" route_prefix="romhackplaza_news" format=":int&lt;id&gt;" controller="RomhackPlaza\Master:News"/>
</routes>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<style_properties/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<style_property_groups/>

View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="utf-8"?>
<template_modifications>
<modification type="public" template="account_preferences" modification_key="rhpz_account_preferences_nsfw_content" description="Add NSFW Content field to the settings" execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[<xf:macro id="helper_account::email_options_row" arg-showConversationOption="{{ true }}" />]]></find>
<replace><![CDATA[<xf:checkboxrow label="{{ phrase('entries_options') }}">
<xf:option value="true" name="user[nsfw_content]" checked="{{ $xf.visitor.nsfw_content == 1 ? true : false }}"
label="{{ phrase('enable_nsfw_entries') }}">
</xf:option>
</xf:checkboxrow>
$0]]></replace>
</modification>
<modification type="public" template="account_wrapper" modification_key="rhpz_account_wrapper_delete_account" description="Add Delete account page URL to account details" execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[<!--[XF:settings_links:bottom]-->]]></find>
<replace><![CDATA[<a class="blockLink {{ $pageSelected == 'delete_account' ? 'is-selected' : '' }}" href="{{ link('account/delete-account') }}">
{{ phrase('delete_account') }}
</a>
$0]]></replace>
</modification>
<modification type="public" template="category_view" modification_key="rhpz_category_view_clubs_submit_button" description="Add Club Submit button" execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[ <xf:button href="{{ link('categories/mark-read', $category, {'date': $xf.time}) }}"
class="button--link" overlay="true">]]></find>
<replace><![CDATA[<xf:if is="$xf.options.rhpz_club_node_id == $category.node_id">
<xf:button href="{{ link('clubs/submit') }}"
class="button--link">
Request a club
</xf:button>
</xf:if>
$0]]></replace>
</modification>
<modification type="public" template="forum_overview_wrapper" modification_key="rhpz_forum_overview_wrapper_search_button" description="Add Search button" execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[ <xf:button href="{{ $xf.options.forumsDefaultPage == 'new_posts' ? link('forums/new-posts') : link('whats-new/posts') }}" icon="bolt">
{{ phrase('new_posts') }}
</xf:button>]]></find>
<replace><![CDATA[ $0
<xf:button href="{{ link('search') }}" icon="magnifying-glass">
{{ phrase('search') }}
</xf:button>]]></replace>
</modification>
<modification type="public" template="forum_view" modification_key="rhpz_above_thread_list_clubs" description="Add the club banner above the threads list." execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[<xf:extension id="above_thread_list"></xf:extension>]]></find>
<replace><![CDATA[$0
<xf:if is="$forum.Node.parent_node_id == $xf.options.rhpz_club_node_id">
<div class="club-banner-container">
<xf:if is="$forum.Club.banner_date">
<img src="{$forum.Club.getBannerUrl()}" alt="Banner {$forum.title}" class="club-banner" />
</xf:if>
</div>
</xf:if>]]></replace>
</modification>
<modification type="public" template="forum_view" modification_key="rhpz_above_thread_list_clubs_buttons" description="Add Owner edit/delete buttons." execution_order="5" enabled="1" action="str_replace">
<find><![CDATA[<xf:extension id="above_thread_list"></xf:extension>]]></find>
<replace><![CDATA[$0
<xf:if is="$forum.Club && $forum.Club.user_id == $xf.visitor.user_id">
<div class="block-outer-opposite u-marginBottom">
<div class="buttonGroup">
<a href="{{ link('clubs/edit', $forum.Club) }}" class="button button--link" icon="edit">Edit</a>
<a href="{{ link('clubs/delete', $forum.Club) }}" class="button button--link" icon="delete" overlay="true">Delete</a>
</div>
</div>
</xf:if>]]></replace>
</modification>
<modification type="admin" template="helper_criteria" modification_key="rhpz_helper_criteria_entry_count" execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[<!--[XF:user:content_bottom]-->]]></find>
<replace><![CDATA[<xf:option name="user_criteria[rhpz_entry_count][rule]" value="rhpz_entry_count" selected="{$criteria.rhpz_entry_count}" label="Number of entries:">
<xf:numberbox name="user_criteria[rhpz_entry_count][data][entries]" value="{$criteria.rhpz_entry_count.entries}" size="5" min="0" step="1" />
</xf:option>]]></replace>
</modification>
<modification type="public" template="member_macros" modification_key="rhpz_member_macros_member_stat_pairs_entry_count" description="Add RHPZ Entry count on member profile page" execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[<!--[XF:stat_pairs:above_reactions]-->]]></find>
<replace><![CDATA[<dl class="pairs pairs--rows pairs--rows--centered">
<dt>{{ phrase('entries') }}</dt>
<dd>
{$user.rhpz_entry_count|number}
</dd>
</dl>]]></replace>
</modification>
<modification type="public" template="member_view" modification_key="rhpz_member_view_add_entry_tab" description="Add entry tab on members page" execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[<!--[XF:tabs:after_recent_content]-->]]></find>
<replace><![CDATA[<a href="{{ $xf.options.homePageUrl }}/database?userId={$user.user_id}"
class="tabs-tab"
id="entries">{{ phrase('entries') }}</a>
$0]]></replace>
</modification>
<modification type="public" template="member_view" modification_key="rhpz_member_view_add_entry_tabpanel" description="Add Entry tab panel" execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[<!--[XF:tab_panes:after_recent_content]-->]]></find>
<replace><![CDATA[<li role="tabpanel" aria-labelledby="entries">
<a href="{{$xf.options.homePageUrl}}/database?userId={$user.user_id}" class="button">Go to this page</a>
</li>
$0]]></replace>
</modification>
<modification type="admin" template="user_edit" modification_key="rhpz_user_edit_delete_account_codes_tab" description="Add Tab for listing delete account codes in User edit" execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[<!--[XF:tabs:end]-->]]></find>
<replace><![CDATA[<xf:if is="$user.user_id">
<a class="tabs-tab" role="tab" tabindex="0"
id="user-delete-account-codes"
aria-controls="user-delete-account-codes"
href="{{ link('users/edit', $user) }}#delete-account-codes">{{ phrase('delete_account_codes') }}</a>
</xf:if>
$0]]></replace>
</modification>
<modification type="admin" template="user_edit" modification_key="rhpz_user_edit_delete_account_codes_tab_panes" description="Add Tab panes in User edit page for account deletion codes." execution_order="10" enabled="1" action="str_replace">
<find><![CDATA[<!--[XF:tab_panes:end]-->]]></find>
<replace><![CDATA[
<xf:if is="$user.user_id">
<li data-href="{{ link('users/delete-account-codes', $user, {'tabbed':1}) }}" role="tabpanel" aria-labelledby="user-delete-account-codes">
<div class="block-body block-row">{{ phrase('loading...') }}</div>
</li>
</xf:if>
$0]]></replace>
</modification>
</template_modifications>

666
_data/templates.xml Normal file
View File

@@ -0,0 +1,666 @@
<?xml version="1.0" encoding="utf-8"?>
<templates>
<template type="admin" title="helper_criteria" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:macro id="user_tabs" arg-container="" arg-userTabTitle="" arg-active="">
<xf:set var="$tabs">
<a class="tabs-tab{{ $active == 'user' ? ' is-active' : '' }}"
role="tab" tabindex="0" aria-controls="{{ unique_id('criteriaUser') }}">
{{ $userTabTitle ? $userTabTitle : phrase('user_criteria') }}</a>
<a class="tabs-tab{{ $active == 'user_field' ? ' is-active' : '' }}"
role="tab" tabindex="0" aria-controls="{{ unique_id('criteriaUserField') }}">
{{ phrase('custom_userfield_criteria') }}</a>
</xf:set>
<xf:if is="$container">
<div class="tabs" role="tablist">
{$tabs|raw}
</div>
<xf:else />
{$tabs|raw}
</xf:if>
</xf:macro>
<xf:macro id="page_tabs" arg-container="" arg-active="">
<xf:set var="$tabs">
<a class="tabs-tab{{ $active == 'page' ? ' is-active' : '' }}"
role="tab" tabindex="0" aria-controls="{{ unique_id('criteriaPage') }}">{{ phrase('page_criteria') }}</a>
</xf:set>
<xf:if is="$container">
<div class="tabs" role="tablist">
{$tabs|raw}
</div>
<xf:else />
{$tabs|raw}
</xf:if>
</xf:macro>
<xf:macro id="user_panes" arg-container="" arg-active="" arg-criteria="!" arg-data="!">
<xf:set var="$app" value="{$xf.app}" />
<xf:set var="$visitor" value="{$xf.visitor}" />
<xf:set var="$em" value="{$app.em}" />
<xf:set var="$panes">
<li class="{{ $active == 'user' ? ' is-active' : '' }}" role="tabpanel" id="{{ unique_id('criteriaUser') }}">
<!--[XF:user:top]-->
<xf:checkboxrow label="{{ phrase('privileges_and_status') }}">
<!--[XF:user:status_top]-->
<xf:option name="user_criteria[is_guest][rule]" value="is_guest" selected="{$criteria.is_guest}"
label="{{ phrase('user_is_guest') }}" />
<xf:option name="user_criteria[is_logged_in][rule]" value="is_logged_in" selected="{$criteria.is_logged_in}"
label="{{ phrase('user_is_logged_in') }}" />
<xf:option name="user_criteria[is_moderator][rule]" value="is_moderator" selected="{$criteria.is_moderator}"
label="{{ phrase('user_is_moderator') }}" />
<xf:option name="user_criteria[is_admin][rule]" value="is_admin" selected="{$criteria.is_admin}"
label="{{ phrase('user_is_administrator') }}" />
<xf:option name="user_criteria[is_banned][rule]" value="is_banned" selected="{$criteria.is_banned}"
label="{{ phrase('user_is_banned') }}"/>
<xf:option name="user_criteria[birthday][rule]" value="birthday" selected="{$criteria.birthday}"
label="{{ phrase('user_birthday_is_today') }}"/>
<xf:option name="user_criteria[user_state][rule]" value="user_state" selected="{$criteria.user_state}"
label="{{ phrase('user_state_is:') }}">
<xf:dependent>
<xf:select name="user_criteria[user_state][data][state]" value="{$criteria.user_state.state}">
<xf:option value="valid">{{ phrase('valid') }}</xf:option>
<xf:option value="email_confirm">{{ phrase('awaiting_email_confirmation') }}</xf:option>
<xf:option value="email_confirm_edit">{{ phrase('awaiting_email_confirmation_from_edit') }}</xf:option>
<xf:option value="email_bounce">{{ phrase('email_invalid_bounced') }}</xf:option>
<xf:option value="moderated">{{ phrase('awaiting_approval') }}</xf:option>
<xf:option value="rejected">{{ phrase('rejected') }}</xf:option>
<xf:option value="disabled">{{ phrase('disabled') }}</xf:option>
</xf:select>
</xf:dependent>
</xf:option>
<!--[XF:user:status_bottom]-->
</xf:checkboxrow>
<hr class="formRowSep" />
<!--[XF:user:after_status]-->
<xf:checkboxrow label="{{ phrase('connected_accounts') }}">
<xf:option name="user_criteria[connected_accounts][rule]" value="connected_accounts" selected="{$criteria.connected_accounts}"
label="{{ phrase('user_is_associated_with_any_of_selected_connected_account_providers:') }}">
<xf:select name="user_criteria[connected_accounts][data][provider_ids]" size="4" multiple="true" value="{$criteria.connected_accounts.provider_ids}">
<xf:options source="$data.connectedAccProviders" />
</xf:select>
</xf:option>
</xf:checkboxrow>
<hr class="formRowSep" />
<!--[XF:user:after_connected]-->
<xf:checkboxrow label="{{ phrase('user_groups') }}">
<xf:option name="user_criteria[user_groups][rule]" value="user_groups" selected="{$criteria.user_groups}"
label="{{ phrase('user_is_member_of_any_of_selected_user_groups:') }}">
<xf:select name="user_criteria[user_groups][data][user_group_ids]" size="4" multiple="true" value="{$criteria.user_groups.user_group_ids}">
<xf:foreach loop="$data.userGroups" key="$userGroupId" value="$userGroupTitle">
<xf:option value="{$userGroupId}">{$userGroupTitle}</xf:option>
</xf:foreach>
</xf:select>
</xf:option>
<xf:option name="user_criteria[not_user_groups][rule]" value="not_user_groups" selected="{$criteria.not_user_groups}"
label="{{ phrase('user_is_not_member_of_any_of_selected_user_groups:') }}">
<xf:select name="user_criteria[not_user_groups][data][user_group_ids]" size="4" multiple="true" value="{$criteria.not_user_groups.user_group_ids}">
<xf:foreach loop="$data.userGroups" key="$userGroupId" value="$userGroupTitle">
<xf:option value="{$userGroupId}">{$userGroupTitle}</xf:option>
</xf:foreach>
</xf:select>
</xf:option>
</xf:checkboxrow>
<hr class="formRowSep" />
<!--[XF:user:after_groups]-->
<xf:checkboxrow label="{{ phrase('content_and_achievements') }}">
<!--[XF:user:content_top]-->
<xf:option name="user_criteria[messages_posted][rule]" value="messages_posted" selected="{$criteria.messages_posted}"
label="{{ phrase('user_has_posted_at_least_x_messages:') }}">
<xf:numberbox name="user_criteria[messages_posted][data][messages]" value="{$criteria.messages_posted.messages}"
size="5" min="0" step="1" />
</xf:option>
<xf:option name="user_criteria[messages_maximum][rule]" value="messages_maximum" selected="{$criteria.messages_maximum}"
label="{{ phrase('user_has_posted_no_more_than_x_messages:') }}">
<xf:numberbox name="user_criteria[messages_maximum][data][messages]" value="{$criteria.messages_maximum.messages}"
size="5" min="0" step="1" />
</xf:option>
<!--[XF:user:content_after_messages]-->
<xf:option name="user_criteria[questions_solved_min][rule]" value="questions_solved_min" selected="{$criteria.questions_solved_min}"
label="{{ phrase('user_has_solved_at_least_x_questions:') }}">
<xf:numberbox name="user_criteria[questions_solved_min][data][solved]" value="{$criteria.questions_solved_min.solved}"
size="5" min="0" step="1" />
</xf:option>
<xf:option name="user_criteria[questions_solved_max][rule]" value="questions_solved_max" selected="{$criteria.questions_solved_max}"
label="{{ phrase('user_has_solved_no_more_than_x_questions:') }}">
<xf:numberbox name="user_criteria[questions_solved_max][data][solved]" value="{$criteria.questions_solved_max.solved}"
size="5" min="0" step="1" />
</xf:option>
<!--[XF:user:content_after_questions]-->
<xf:option name="user_criteria[reaction_score][rule]" value="reaction_score" selected="{$criteria.reaction_score}"
label="{{ phrase('user_has_received_a_reaction_sore_of_at_least_x:') }}">
<xf:numberbox name="user_criteria[reaction_score][data][reactions]" value="{$criteria.reaction_score.reactions}"
size="5" min="0" step="1" />
</xf:option>
<xf:option name="user_criteria[reaction_ratio][rule]" value="reaction_ratio" selected="{$criteria.reaction_ratio}"
label="{{ phrase('user_reaction_message_ratio_is_at_least:') }}">
<xf:numberbox name="user_criteria[reaction_ratio][data][ratio]" value="{$criteria.reaction_ratio.ratio}"
size="5" min="0" step="0.25" />
<xf:afterhint>{{ phrase('reaction_message_ratio_explanation') }}</xf:afterhint>
</xf:option>
<!--[XF:user:content_after_reactions]-->
<xf:option name="user_criteria[trophy_points][rule]" value="trophy_points" selected="{$criteria.trophy_points}"
label="{{ phrase('user_has_at_least_x_trophy_points:') }}">
<xf:numberbox name="user_criteria[trophy_points][data][points]" value="{$criteria.trophy_points.points}"
size="5" min="0" step="1" />
</xf:option>
<!--[XF:user:content_after_trophies]-->
<xf:option name="user_criteria[registered_days][rule]" value="registered_days" selected="{$criteria.registered_days}"
label="{{ phrase('user_has_been_registered_for_at_least_x_days:') }}">
<xf:numberbox name="user_criteria[registered_days][data][days]" value="{$criteria.registered_days.days}"
size="5" min="0" step="1" />
</xf:option>
<xf:option name="user_criteria[inactive_days][rule]" value="inactive_days" selected="{$criteria.inactive_days}"
label="{{ phrase('user_has_not_visited_for_at_least_x_days:') }}">
<xf:numberbox name="user_criteria[inactive_days][data][days]" value="{$criteria.inactive_days.days}"
size="5" min="0" step="1" />
</xf:option>
<!--[XF:user:content_bottom]-->
</xf:checkboxrow>
<hr class="formRowSep" />
<!--[XF:user:after_content]-->
<xf:checkboxrow label="{{ phrase('user_profile_and_options') }}">
<!--[XF:user:profile_top]-->
<xf:option name="user_criteria[language][rule]" value="language" selected="{$criteria.language}"
label="{{ phrase('user_is_browsing_with_following_language:') }}">
<xf:select name="user_criteria[language][data][language_id]" value="{$criteria.language.language_id}">
<xf:foreach loop="$data.languageTree.getFlattened(0)" value="$treeEntry">
<xf:option value="{$treeEntry.record.language_id}">{{ repeat('--', $treeEntry.depth) }} {$treeEntry.record.title}</xf:option>
</xf:foreach>
</xf:select>
</xf:option>
<xf:optgroup label="{{ phrase('avatar:') }}">
<xf:option name="user_criteria[has_avatar][rule]" value="has_avatar" selected="{$criteria.has_avatar}"
label="{{ phrase('user_has_avatar') }}" />
<xf:option name="user_criteria[no_avatar][rule]" value="no_avatar" selected="{$criteria.no_avatar}"
label="{{ phrase('user_has_no_avatar') }}" />
</xf:optgroup>
<xf:optgroup label="{{ phrase('high_resolution_avatar:') }}">
<xf:option name="user_criteria[has_highdpi_avatar][rule]" value="has_highdpi_avatar" selected="{$criteria.has_highdpi_avatar}"
label="{{ phrase('user_has_highdpi_avatar') }}" />
<xf:option name="user_criteria[no_highdpi_avatar][rule]" value="no_highdpi_avatar" selected="{$criteria.no_highdpi_avatar}"
label="{{ phrase('user_has_no_highdpi_avatar') }}" />
</xf:optgroup>
<xf:optgroup label="{{ phrase('two_step_verification:') }}">
<xf:option name="user_criteria[with_tfa][rule]" value="with_tfa" selected="{$criteria.with_tfa}"
label="{{ phrase('user_has_enabled_two_step_verification') }}" />
<xf:option name="user_criteria[without_tfa][rule]" value="without_tfa" selected="{$criteria.without_tfa}"
label="{{ phrase('user_has_not_enabled_two_step_verification') }}"/>
</xf:optgroup>
<xf:optgroup label="{{ phrase('activity_summary_email:') }}">
<xf:option name="user_criteria[activity_summary_enabled][rule]" value="activity_summary_enabled" selected="{$criteria.activity_summary_enabled}"
label="{{ phrase('user_has_activity_summary_emails_enabled') }}" />
<xf:option name="user_criteria[activity_summary_disabled][rule]" value="activity_summary_disabled" selected="{$criteria.activity_summary_disabled}"
label="{{ phrase('user_has_activity_summary_emails_disabled') }}"/>
</xf:optgroup>
<!--[XF:user:profile_bottom]-->
</xf:checkboxrow>
<hr class="formRowSep" />
<!--[XF:user:after_profile]-->
<xf:checkboxrow label="{{ phrase('user_segmentation') }}">
<!--[XF:user:segmentation_top]-->
<xf:option name="user_criteria[user_id][rule]" value="user_id" selected="{$criteria.user_id}"
label="{{ phrase('user_id_matches_expression:') }}">
<xf:textbox
name="user_criteria[user_id][data][expression]"
value="{$criteria.user_id.expression}"
placeholder="2n+1"
/>
<xf:afterhint>{{ phrase('user_id_match_criteria_explain') }}</xf:afterhint>
</xf:option>
<!--[XF:user:segmentation_bottom]-->
</xf:checkboxrow>
<hr class="formRowSep" />
<!--[XF:user:after_segmentation]-->
<xf:checkboxrow label="{{ phrase('specific_users') }}">
<!--[XF:user:specific_top]-->
<xf:option name="user_criteria[username][rule]" value="username" selected="{$criteria.username}"
label="{{ phrase('username_is:') }}">
<xf:textbox name="user_criteria[username][data][names]" value="{$criteria.username.names}" ac="true" />
<xf:afterhint>{{ phrase('username_criteria_explain') }}</xf:afterhint>
</xf:option>
<xf:option name="user_criteria[username_search][rule]" value="username_search" selected="{$criteria.username_search}"
label="{{ phrase('username_contains:') }}">
<xf:textbox name="user_criteria[username_search][data][needles]" value="{$criteria.username_search.needles}" />
<xf:afterhint>{{ phrase('username_search_criteria_explain') }}</xf:afterhint>
</xf:option>
<xf:option name="user_criteria[email_search][rule]" value="email_search" selected="{$criteria.email_search}"
label="{{ phrase('email_address_contains:') }}">
<xf:textbox name="user_criteria[email_search][data][needles]" value="{$criteria.email_search.needles}" />
<xf:afterhint>{{ phrase('email_search_criteria_explain') }}</xf:afterhint>
</xf:option>
<!--[XF:user:specific_bottom]-->
</xf:checkboxrow>
<!--[XF:user:bottom]-->
</li>
<li class="{{ $active == 'user_field' ? 'is-active' : '' }}" role="tabpanel" id="{{ unique_id('criteriaUserField') }}">
<xf:if contentcheck="true">
<xf:contentcheck>
<xf:foreach loop="$xf.app.em.getRepository('XF:UserField').getDisplayGroups()" key="$fieldGroup" value="$groupPhrase">
<xf:set var="$customFields" value="{$app.getCustomFields('users', $fieldGroup)}" />
<xf:if contentcheck="true">
<h2 class="block-formSectionHeader"><span class="block-formSectionHeader-aligner">{$groupPhrase}</span></h2>
<xf:contentcheck>
<xf:foreach loop="$customFields" key="$fieldId" value="$fieldDefinition">
<xf:set var="$fieldName" value="user_field_{$fieldId}" />
<xf:set var="$choices" value="{$fieldDefinition.field_choices}" />
<xf:checkboxrow label="{$fieldDefinition.title}">
<xf:option name="user_criteria[{$fieldName}][rule]" value="{$fieldName}" selected="{$criteria.{$fieldName}}"
label="{{ $choices ? phrase('criteria_userfield_choice_among') : phrase('criteria_userfield_contains_text:') }}">
<xf:dependent>
<xf:if is="!{$choices}">
<xf:textbox name="user_criteria[{$fieldName}][data][text]" value="{$criteria.{$fieldName}.text}" />
<xf:elseif is="{{ count($choices) }} > 6" />
<xf:select name="user_criteria[{$fieldName}][data][choices]" value="{$criteria.{$fieldName}.choices}" multiple="multiple" size="5">
<xf:options source="{$choices}" />
</xf:select>
<xf:else />
<xf:checkbox name="user_criteria[{$fieldName}][data][choices]" value="{$criteria.{$fieldName}.choices}" listclass="listColumns">
<xf:options source="{$choices}" />
</xf:checkbox>
</xf:if>
</xf:dependent>
</xf:option>
</xf:checkboxrow>
</xf:foreach>
</xf:contentcheck>
</xf:if>
</xf:foreach>
</xf:contentcheck>
<xf:else />
{{ phrase('no_custom_fields_have_been_created_yet') }}
</xf:if>
</li>
</xf:set>
<xf:if is="$container">
<ul class="tabPanes">
{$panes|raw}
</ul>
<xf:else />
{$panes|raw}
</xf:if>
</xf:macro>
<xf:macro id="page_panes" arg-container="" arg-active="" arg-criteria="!" arg-data="!">
<xf:set var="$em" value="{$xf.app.em}" />
<xf:set var="$visitor" value="{$xf.visitor}" />
<xf:set var="$panes">
<li class="{{ $active == 'page' ? ' is-active' : '' }}" role="tabpanel" id="{{ unique_id('criteriaPage') }}">
<!--[XF:page:after_from_search]-->
<xf:checkboxrow>
<xf:option name="page_criteria[after][rule]" value="after" selected="{$criteria.after}"
label="{{ phrase('criteria_date_time_is_after:') }}">
<xf:dependent>
<div class="inputGroup">
<xf:dateinput name="page_criteria[after][data][ymd]" value="{$criteria.after.ymd}" />
<span class="inputGroup-text">
{{ phrase('criteria_time:') }}
</span>
<span class="inputGroup" dir="ltr">
<xf:select name="page_criteria[after][data][hh]" value="{$criteria.after.hh}" class="input--inline input--autoSize">
<xf:foreach loop="$data.hours" value="$hour">
<xf:option value="{$hour}" label="{$hour}" />
</xf:foreach>
</xf:select>
<span class="inputGroup-text">:</span>
<xf:select name="page_criteria[after][data][mm]" value="{$criteria.after.mm}" class="input--inline input--autoSize">
<xf:foreach loop="$data.minutes" value="$minute">
<xf:option value="{$minute}" label="{$minute}" />
</xf:foreach>
</xf:select>
</span>
</div>
<dfn class="inputChoices-explain inputChoices-explain--after">{{ phrase('criteria_leave_date_empty') }}</dfn>
</xf:dependent>
<xf:radio name="page_criteria[after][data][user_tz]" value="{{ $criteria.after.user_tz ? $criteria.after.user_tz : 0 }}">
<xf:option value="1" label="{{ phrase('criteria_in_visitor_timezone') }}" />
<xf:option value="0" label="{{ phrase('criteria_in_selected_timezone:') }}">
<xf:select name="page_criteria[after][data][timezone]" value="{{ $criteria.after.timezone ? $criteria.after.timezone : $visitor.timezone }}">
<xf:options source="{$data.timeZones}" />
</xf:select>
</xf:option>
</xf:radio>
</xf:option>
</xf:checkboxrow>
<hr class="formRowSep" />
<!--[XF:page:after_time_after]-->
<xf:checkboxrow>
<xf:option name="page_criteria[before][rule]" value="before" selected="{$criteria.before}"
label="{{ phrase('criteria_date_time_is_before:') }}">
<xf:dependent>
<div class="inputGroup">
<xf:dateinput name="page_criteria[before][data][ymd]" value="{$criteria.before.ymd}" />
<span class="inputGroup-text">
{{ phrase('criteria_time:') }}
</span>
<span class="inputGroup" dir="ltr">
<xf:select name="page_criteria[before][data][hh]" value="{$criteria.before.hh}" class="input--inline input--autoSize">
<xf:foreach loop="$data.hours" value="$hour">
<xf:option value="{$hour}" label="{$hour}" />
</xf:foreach>
</xf:select>
<span class="inputGroup-text">:</span>
<xf:select name="page_criteria[before][data][mm]" value="{$criteria.before.mm}" class="input--inline input--autoSize">
<xf:foreach loop="$data.minutes" value="$minute">
<xf:option value="{$minute}" label="{$minute}" />
</xf:foreach>
</xf:select>
</span>
</div>
<dfn class="inputChoices-explain inputChoices-explain--before">{{ phrase('criteria_leave_date_empty') }}</dfn>
</xf:dependent>
<xf:radio name="page_criteria[before][data][user_tz]" value="{{ $criteria.before.user_tz ? $criteria.before.user_tz : 0 }}">
<xf:option value="1" label="{{ phrase('criteria_in_visitor_timezone') }}" />
<xf:option value="0" label="{{ phrase('criteria_in_selected_timezone:') }}">
<xf:select name="page_criteria[before][data][timezone]" value="{{ $criteria.before.timezone ? $criteria.before.timezone : $visitor.timezone }}">
<xf:options source="{$data.timeZones}" />
</xf:select>
</xf:option>
</xf:radio>
</xf:option>
</xf:checkboxrow>
<hr class="formRowSep" />
<!--[XF:page:after_time_before]-->
<xf:checkboxrow label="{{ phrase('nodes') }}">
<xf:option name="page_criteria[nodes][rule]" value="nodes" selected="{$criteria.nodes}"
label="{{ phrase('page_is_within_nodes:') }}">
<xf:select name="page_criteria[nodes][data][node_ids]" multiple="true" value="{$criteria.nodes.node_ids}">
<xf:foreach loop="$data.nodes" value="$option">
<xf:option value="{$option.value}" label="{$option.label}" />
</xf:foreach>
</xf:select>
<xf:checkbox>
<xf:option name="page_criteria[nodes][data][node_only]" value="1" selected="{$criteria.nodes.node_only}"
label="{{ phrase('only_display_within_selected_nodes_no_children') }}" />
</xf:checkbox>
</xf:option>
</xf:checkboxrow>
<hr class="formRowSep" />
<!--[XF:page:after_nodes]-->
<xf:checkboxrow label="{{ phrase('page_information') }}">
<xf:option name="page_criteria[style][rule]" value="style" selected="{$criteria.style}"
label="{{ phrase('user_is_browsing_with_following_style:') }}">
<xf:select name="page_criteria[style][data][style_id]" value="{$criteria.style.style_id}">
<xf:foreach loop="$data.styleTree.getFlattened(0)" value="$treeEntry">
<xf:option value="{$treeEntry.record.style_id}">{{ repeat('--', $treeEntry.depth) }} {$treeEntry.record.title}</xf:option>
</xf:foreach>
</xf:select>
</xf:option>
<xf:option name="page_criteria[tab][rule]" value="tab" selected="{$criteria.tab}"
label="{{ phrase('selected_navigation_tab_id_is:') }}">
<xf:textbox name="page_criteria[tab][data][id]" value="{$criteria.tab.id}"dir="ltr" />
<xf:afterhint>{{ phrase('selected_tab_criteria_explain') }}</xf:afterhint>
</xf:option>
<xf:option name="page_criteria[controller][rule]" value="controller" selected="{$criteria.controller}"
label="{{ phrase('controller_and_action_is:') }}">
<xf:macro id="helper_callback_fields::callback_fields"
arg-className="page_criteria[controller][data][name]"
arg-methodName="page_criteria[controller][data][action]"
arg-classValue="{$criteria.controller.name}"
arg-methodValue="{$criteria.controller.action}" />
<xf:afterhint>{{ phrase('controller_and_action_criteria_explain') }}</xf:afterhint>
</xf:option>
<xf:option name="page_criteria[view][rule]" value="view" selected="{$criteria.view}"
label="{{ phrase('view_class_is:') }}">
<xf:textbox name="page_criteria[view][data][name]" value="{$criteria.view.name}" dir="ltr" />
<xf:afterhint>{{ phrase('view_class_criteria_explain') }}</xf:afterhint>
</xf:option>
<xf:option name="page_criteria[template][rule]" value="template" selected="{$criteria.template}"
label="{{ phrase('content_template_is:') }}">
<xf:textbox name="page_criteria[template][data][name]" value="{$criteria.template.name}" dir="ltr" />
<xf:afterhint>{{ phrase('content_template_criteria_explain') }}</xf:afterhint>
</xf:option>
</xf:checkboxrow>
<!--[XF:page:after_page_info]-->
</li>
</xf:set>
<xf:if is="$container">
<ul class="tabPanes">
{$panes|raw}
</ul>
<xf:else />
{$panes|raw}
</xf:if>
</xf:macro>]]></template>
<template type="admin" title="user_delete_account_codes" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:title>{$user.username}</xf:title>
<div class="block">
<div class="block-container">
<h3 class="block-minorHeader">{{ phrase('delete_account_code') }}</h3>
<div class="block-body">
<div class="block-row">{$deleteAccountCode}</div>
</div>
<h3 class="block-minorHeader">{{ phrase('delete_all_data_code') }}</h3>
<div class="block-body">
<div class="block-row">{$deleteAllDataCode}</div>
</div>
</div>
</div>]]></template>
<template type="public" title="approval_item_club_request" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:macro id="approval_queue_macros::item_message_type"
arg-content="{$content}"
arg-user="{$content.User}"
arg-messageHtml="{$content.description}"
arg-contentDate="{$content.club_creation_date}"
arg-typePhraseHtml="Club Request"
arg-headerPhrase="{$content.title}"
arg-spamDetails="{$spamDetails}"
arg-unapprovedItem="{$unapprovedItem}"
arg-handler="{$handler}"
/>]]></template>
<template type="public" title="approval_item_entry_featured_request" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:macro id="approval_queue_macros::item_message_type"
arg-content="{$content}"
arg-user="{$content.User}"
arg-messageHtml="{$content.entry_title}"
arg-contentDate="{$content.featured_request_date}"
arg-typePhraseHtml="Featured Request"
arg-headerPhrase="{$content.entry_title}"
arg-spamDetails="{$spamDetails}"
arg-unapprovedItem="{$unapprovedItem}"
arg-handler="{$handler}"
/>]]></template>
<template type="public" title="club_delete_confirm" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:title>Delete club : {$club.title}</xf:title>
<xf:form action="{{ link('clubs/delete', $club) }}" class="block">
<div class="block-container">
<div class="block-body">
<xf:inforow rowtype="confirm">
Are you sure you want to delete this club ? <strong>{$club.title}</strong> ?<br />
<span class="u-muted">Deleting this will also delete all threads and posts.</span>
</xf:inforow>
</div>
<xf:submitrow rowtype="simple" icon="delete" submit="Delete" />
</div>
</xf:form>]]></template>
<template type="public" title="club_edit_form" version_id="1000000" version_string="1.0.0"><![CDATA[<div class="block">
<xf:form action="{{ link('clubs/save', $club ) }}" upload="true" ajax="true" class="block-container">
<div class="block-body">
<xf:textboxrow name="title" value="{$club.title}" label="Title" required="true" maxlength="100" />
<xf:textarearow name="description" value="{$club.description}" label="Description" required="true" rows="4" />
<xf:if is="$club.banner_date">
<xf:formrow label="Current Banner">
<img src="{$club.getBannerUrl()}" style="max-width: 300px; border-radius: 4px;" />
</xf:formrow>
</xf:if>
<xf:uploadrow name="upload_banner" accept=".jpg,.jpeg,.png" label="Banner" />
</div>
<xf:submitrow icon="save" submit="Submit Changes" />
</xf:form>
</div>
<xf:if is="$club.club_id && $club.node_id">
<div class="block u-marginTop">
<div class="block-container">
<h2 class="block-header">Club Moderators ({$subModCount}/5)</h2>
<div class="block-body">
<xf:if is="$moderators is not empty">
<div class="dataList">
<xf:foreach loop="$moderators" value="$mod">
<div class="dataList-row">
<div class="dataList-cell dataList-cell--main">
<strong>{$mod.User.username}</strong>
<xf:if is="$mod.user_id == $club.user_id">
<span class="label label--accent u-marginLeft">Owner</span>
</xf:if>
</div>
<div class="dataList-cell dataList-cell--action">
<xf:if is="$mod.user_id != $club.user_id">
<xf:form action="{{ link('clubs/remove-moderator', $club) }}" ajax="true" class="u-inline">
<input type="hidden" name="user_id" value="{$mod.user_id}" />
<xf:button type="submit" class="button--small button--warn" icon="delete">Remove</xf:button>
</xf:form>
<xf:else />
<span class="u-muted">-</span>
</xf:if>
</div>
</div>
</xf:foreach>
</div>
<xf:else />
<div class="block-row">No moderators for this club.</div>
</xf:if>
</div>
</div>
</div>
<div class="block u-marginTop">
<xf:if is="$subModCount < 5">
<xf:form action="{{ link('clubs/add-moderator', $club) }}" ajax="true" class="block-container">
<h2 class="block-header">Add a moderator</h2>
<div class="block-body">
<xf:textboxrow name="username" label="Username" class="namePredictor" required="true" />
</div>
<xf:submitrow icon="add" submit="Promote Moderator" />
</xf:form>
<xf:else />
<div class="block-container">
<div class="block-row block-row--warning">
<strong>Limit reached:</strong> You have reached the maximum number of 5 moderators for your club. You must remove one before you can add a new one.
</div>
</div>
</xf:if>
</div>
</xf:if>]]></template>
<template type="public" title="club_request_form" version_id="1000000" version_string="1.0.0"><![CDATA[<xf:title>Submit Club Request</xf:title>
<xf:form action="{{ link('clubs/save') }}" ajax="true" class="block">
<div class="block-container">
<div class="block-body">
<xf:textboxrow name="title" label="Title" required="required" />
<xf:textarearow name="description" label="Description" rows="4" required="required" />
<xf:uploadrow name="upload_banner" accept=".jpg,.jpeg,.jpe,.png" label="Banner" />
</div>
<xf:submitrow submit="Submit" icon="save" />
</div>
</xf:form>]]></template>
<template type="public" title="report_content_romhackplaza_entry" version_id="1000000" version_string="1.0.0"><![CDATA[<div class="block-row block-row--separated">
{{ phrase('content:') }}
{$report.content_info.description}
</div>]]></template>
<template type="public" title="report_content_romhackplaza_news" version_id="1000000" version_string="1.0.0"><![CDATA[<div class="block-row block-row--separated">
{{ phrase('content:') }}
{$report.content_info.description}
</div>]]></template>
</templates>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<widget_definitions/>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<widget_positions/>

View File

@@ -0,0 +1,17 @@
{
"about.json": {
"hash": "d2d00802b4114e28d0a69fba02973a3d"
},
"delete_my_data.json": {
"hash": "f1eb8202bf076a34bc774c055cb9e7eb"
},
"dmca.json": {
"hash": "e6dcff244e3981ecbc31e042315d191a"
},
"how_to_become_verified.json": {
"hash": "4fa48e94d5179225b49d4d0e19daa8e9"
},
"takedown.json": {
"hash": "13a1dc2ff2041b03aac5a66cc21de7c4"
}
}

View File

@@ -0,0 +1,8 @@
{
"page_name": "about",
"display_order": 10,
"callback_class": "",
"callback_method": "",
"advanced_mode": false,
"active": true
}

View File

@@ -0,0 +1,8 @@
{
"page_name": "delete-my-data",
"display_order": 10,
"callback_class": "",
"callback_method": "",
"advanced_mode": false,
"active": true
}

View File

@@ -0,0 +1,8 @@
{
"page_name": "dmca",
"display_order": 50,
"callback_class": "",
"callback_method": "",
"advanced_mode": false,
"active": true
}

View File

@@ -0,0 +1,8 @@
{
"page_name": "how-to-become-verified",
"display_order": 20,
"callback_class": "",
"callback_method": "",
"advanced_mode": false,
"active": true
}

View File

@@ -0,0 +1,8 @@
{
"page_name": "takedown",
"display_order": 40,
"callback_class": "",
"callback_method": "",
"advanced_mode": false,
"active": true
}

View File

@@ -1,6 +1,6 @@
{
"about.json": {
"hash": "362cdca71eb4d21d7b9290ffc8f0df57"
"hash": "6af7d9983ab28cb4b2975a1cd0059f9f"
},
"clubs.json": {
"hash": "e7ddced6269072f7db774f09424d671c"
@@ -15,7 +15,7 @@
"hash": "604cabbdf4fb4fd941dc6123eb119165"
},
"discord.json": {
"hash": "37b3a139a26e30bd558de47b9e364d41"
"hash": "225fd5b2a01edb9d28b142293207943a"
},
"drafts.json": {
"hash": "bea14e944290aeb07659374fa487d61c"
@@ -27,10 +27,10 @@
"hash": "4f55ee2e4a49e82c18e9beab428ab0ee"
},
"learn_romhacking.json": {
"hash": "3da66fadac2c1aa805e639d727e36223"
"hash": "2a2086e4b84a08f921d1795aca7f3913"
},
"legal_pages.json": {
"hash": "34ae35915e620f1f0b5d88dcd25a5b59"
"hash": "cd77592a612aa262580b1ad4eb0490dd"
},
"members.json": {
"hash": "cad1568d161bea1a7dd1f286b8788e2d"
@@ -50,6 +50,9 @@
"submissions_queue.json": {
"hash": "071c745afd8f28cf9505702496f72a18"
},
"support_us.json": {
"hash": "bc0c8ad00084960abc5325c31849c543"
},
"tools.json": {
"hash": "3d56ca10d6cf3ff772e9ce92d200f2f8"
},

View File

@@ -3,7 +3,7 @@
"display_order": 200,
"navigation_type_id": "basic",
"type_config": {
"link": "{$xf.options.homePageUrl}/pages/about",
"link": "{{ link('help/about') }}",
"display_condition": "",
"extra_attributes": {
"icon": "info"

View File

@@ -3,7 +3,7 @@
"display_order": 300,
"navigation_type_id": "basic",
"type_config": {
"link": "{$xf.options.homePageUrl}/discord",
"link": "https://discord.gg/5CKzeWmZZU",
"display_condition": "",
"extra_attributes": {
"icon": "messages-square"

View File

@@ -3,7 +3,7 @@
"display_order": 100,
"navigation_type_id": "basic",
"type_config": {
"link": "{$xf.options.homePageUrl}/pages/learn",
"link": "{{ link('help/learn-romhacking') }}",
"display_condition": "",
"extra_attributes": {
"icon": "graduation-cap"

View File

@@ -3,7 +3,7 @@
"display_order": 400,
"navigation_type_id": "basic",
"type_config": {
"link": "{$xf.options.homePageUrl}/pages/legal-pages",
"link": "{{ link('help') }}",
"display_condition": "",
"extra_attributes": {
"icon": "scale"

View File

@@ -0,0 +1,15 @@
{
"parent_navigation_id": "pages",
"display_order": 10,
"navigation_type_id": "basic",
"type_config": {
"link": "https://ko-fi.com/romhackplaza",
"display_condition": "",
"extra_attributes": {
"icon": "coffee",
"color": "var(--rhpz-orange)",
"target": "_blank"
}
},
"enabled": true
}

View File

@@ -23,12 +23,90 @@
"version_string": "1.0.0",
"hash": "15d96c48f857b975c051d7c98b13a385"
},
"enable_nsfw_entries.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "5fe4c9ee5afb3f3b3125508f27c245b6"
},
"entries.txt": {
"global_cache": false,
"version_id": 1000000,
"version_string": "1.0.0",
"hash": "bc14b0a9c516310fc195a778937cc0a0"
},
"entries_options.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "7c72b58cc8011ac1c23376fffb33f0da"
},
"help_page_desc.about.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "077a75f92ac9d8ed4a1bdf3a40c0f133"
},
"help_page_desc.delete_my_data.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "c4a426cddbc0d1e2a3703cd202dde965"
},
"help_page_desc.dmca.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "12054ccd3a006f4414c6c8afd7c20363"
},
"help_page_desc.how_to_become_verified.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "d1f446e631cffd83b484bb0566f35a35"
},
"help_page_desc.takedown.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "b010e0f884fe0cbc48dd20c19e026756"
},
"help_page_title.about.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "8f7f4c1ce7a4f933663d10543562b096"
},
"help_page_title.delete_my_data.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "17fe5faff39a2cd491cdb4a13fb1e7fc"
},
"help_page_title.dmca.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "628ff040a9e9ff3e28dc122c5a38f8f9"
},
"help_page_title.how_to_become_verified.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "5e92642ef830c360b71f586ad6a915e3"
},
"help_page_title.takedown.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "509f327055d6c047a2a080a90332260c"
},
"logout.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "0323de4f66a1700e2173e9bcdce02715"
},
"nav.about.txt": {
"global_cache": false,
"version_id": 1000000,
@@ -91,9 +169,9 @@
},
"nav.legal_pages.txt": {
"global_cache": false,
"version_id": 1000000,
"version_string": "1.0.0",
"hash": "3c409b33c2ad79df7ed112714d2092be"
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "d2b780c86b3f8e3da8af5ca3891d80c5"
},
"nav.members.txt": {
"global_cache": false,
@@ -131,6 +209,12 @@
"version_string": "1.0.0",
"hash": "15fe7b6033b3abae4d4096e7a5d21bff"
},
"nav.support_us.txt": {
"global_cache": false,
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "68af1e9d9402fee977042693b6644fe4"
},
"nav.tools.txt": {
"global_cache": false,
"version_id": 1000000,

View File

@@ -0,0 +1 @@
Enable NSFW Entries

View File

@@ -0,0 +1 @@
Entries options

View File

@@ -0,0 +1 @@
This page contains a description of our website and its philosophy

View File

@@ -0,0 +1 @@
If you want to delete some data, please read this

View File

@@ -0,0 +1 @@
Everything you need to know about the DMCA on this site.

View File

@@ -0,0 +1 @@
Steps to follow to become a Verified Member

View File

@@ -0,0 +1 @@
Everything you must know if you want write a takedown request

View File

@@ -0,0 +1 @@
About

View File

@@ -0,0 +1 @@
Delete my data

View File

@@ -0,0 +1 @@
Digital Millennium Copyright Act (DMCA) Notice

View File

@@ -0,0 +1 @@
How to become "Verified"

View File

@@ -0,0 +1 @@
Content Takedown Request

View File

@@ -0,0 +1 @@
Logout

View File

@@ -1 +1 @@
Legal Pages
Help & Legal Pages

View File

@@ -0,0 +1 @@
Support us

View File

@@ -14,6 +14,9 @@
"public/rhpz_above_thread_list_clubs_buttons.json": {
"hash": "c783001e00f7a63389c9ae988012f5fe"
},
"public/rhpz_account_preferences_nsfw_content.json": {
"hash": "9feae814b9fa8f40a08e1b50e2d410c5"
},
"public/rhpz_account_wrapper_delete_account.json": {
"hash": "6594c0474a9b3e737a10dbd9c531521e"
},

View File

@@ -0,0 +1,9 @@
{
"template": "account_preferences",
"description": "Add NSFW Content field to the settings",
"execution_order": 10,
"enabled": true,
"action": "str_replace",
"find": "<xf:macro id=\"helper_account::email_options_row\" arg-showConversationOption=\"{{ true }}\" />",
"replace": "<xf:checkboxrow label=\"{{ phrase('entries_options') }}\">\n\t<xf:option value=\"true\" name=\"user[nsfw_content]\" checked=\"{{ $xf.visitor.nsfw_content == 1 ? true : false }}\"\n\t\t\t label=\"{{ phrase('enable_nsfw_entries') }}\">\n\t</xf:option>\n</xf:checkboxrow>\n$0"
}

View File

@@ -9,6 +9,31 @@
"version_string": "1.0.0",
"hash": "cf9c69eb1bfa0821778f60e9866626a4"
},
"public/_help_page_about.html": {
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "f8d5c77616c449f0797c9a8096d7b352"
},
"public/_help_page_delete_my_data.html": {
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "32f1a682e5729cc6e8da2c41037e604a"
},
"public/_help_page_dmca.html": {
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "2297a9fffc0824831c5799b5df438f99"
},
"public/_help_page_how_to_become_verified.html": {
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "11d6e1c5f5547919336b1d7db6cb78c6"
},
"public/_help_page_takedown.html": {
"version_id": 1010070,
"version_string": "1.1.0",
"hash": "7af5316b4485b73d8d2de2eabb706f4c"
},
"public/approval_item_club_request.html": {
"version_id": 1000000,
"version_string": "1.0.0",

View File

@@ -0,0 +1,19 @@
<div class="block">
<div class="block-container">
<strong>Site Purpose and Content Overview</strong>
This website is dedicated to the preservation, modification, and enhancement of classic retro games. It provides a platform for discussing and sharing modifications known as "romhacks," which are custom alterations made to game ROMs. Our focus is solely on the creative and non-commercial aspects of game modification and does not involve the distribution or use of copyrighted ROM files.
<strong>Clarification on ROMs and Hacking</strong>
<ul>
<li><strong>Legal Compliance:</strong> The site does not host or distribute any original copyrighted ROM files. All content shared here pertains exclusively to modifications of games for which users already own the original ROMs. It is intended for educational, archival, and enhancement purposes only.</li>
<li><strong>Non-Malicious Intent:</strong> The term "hacking" used on this site refers to the modification of game data and is not related to any form of malicious hacking or illegal activity. The modifications (romhacks) discussed and shared are created to enhance or alter the gameplay experience of retro games in a non-infringing manner.</li>
<li><strong>User Responsibility:</strong> Visitors are encouraged to ensure that any game ROMs they use are legally obtained and that their use complies with applicable copyright laws. The site does not provide or endorse illegal downloads of copyrighted material.</li>
</ul>
<strong>Contact Information</strong>
For any concerns or clarifications regarding the content of this site, please contact us directly. We are committed to complying with all legal requirements and ensuring that our platform remains a positive and creative space for retro gaming enthusiasts.
</div>
</div>

View File

@@ -0,0 +1,15 @@
<strong>"The right to erasure"</strong> (Articles 17 &amp; 19 of the GDPR) state you have the right to have your data erased, without undue delay by the data controller, if you withdraw your consent to the processing.
In here we explain in detail how to remove your data partially or completely from this site.
<h4>1. How to remove comments, threads:</h4>
Go to the post you want to delete and click on the delete button. If you want to delete a thread, delete the first post. If you can't delete a thread or a post, you can also send a report by clicking on the report button.
<img class="alignnone size-full wp-image-2461" src="{{ asset('romhackplaza','delete_comment.png') }}" alt="" />
<h4>2. How to remove entries:</h4>
To remove entries you have to edit your entry and revert its Status to "draft". A draft means it's unpublished and only you can see it. You can also delete permanently an entry with the delete button.
<img class="alignnone size-full wp-image-2462" src="{{ asset('romhackplaza','delete_entry.png') }}" alt="" />
<h4>3. How to remove the entire account:</h4>
Removing the account will remove all the comments, but it will not remove the entries. They will be anonymized and assigned to a "Deleted User", if you want to delete your entries follow the step above "How to remove entries".
<p style="text-align: center;"><strong><a style="color: red;" href="{{ link('account/delete-account') }}">To delete your account go here</a></strong></p>

View File

@@ -0,0 +1,23 @@
<h4>Introduction</h4>
Romhacks.org (hereafter referred to as "we", "us", or "our") respects the intellectual property rights of others and expects its users to do the same. We are committed to complying with the DMCA and other applicable laws. We adopt a policy of terminating, in appropriate circumstances, users who are repeat infringers. We may also, at our sole discretion, limit access to the Site and/or terminate the accounts of any users who infringe any intellectual property rights of others, whether or not there is any repeat infringement.
<h4>Copyright Infringement Notification</h4>
If you believe that your work has been copied in a way that constitutes copyright infringement, please <strong>submit your notification through our <a href="/contact-us/">contact form</a></strong>, ensuring to indicate "DMCA" in the subject line. The notification should include the following information:
<ol>
<li>A physical or electronic signature of a person authorized to act on behalf of the owner of an exclusive right that is allegedly infringed.</li>
<li>Identification of the copyrighted work claimed to have been infringed, or, if multiple copyrighted works at a single online site are covered by a single notification, a representative list of such works at that site.</li>
<li>Identification of the material that is claimed to be infringing or to be the subject of infringing activity and that is to be removed or access to which is to be disabled, and information reasonably sufficient to permit us to locate the material.</li>
<li>Information reasonably sufficient to permit us to contact the complaining party, such as an address, telephone number, and, if available, an electronic mail address at which the complaining party may be contacted.</li>
<li>A statement that the complaining party has a good faith belief that use of the material in the manner complained of is not authorized by the copyright owner, its agent, or the law.</li>
<li>A statement that the information in the notification is accurate, and under penalty of perjury, that the complaining party is authorized to act on behalf of the owner of an exclusive right that is allegedly infringed.</li>
</ol>
<h4>Counter-Notification Procedures</h4>
If you believe that your material has been removed by mistake or misidentification, please submit a counter-notification <strong>through our <a href="{{ link('misc/contact') }}">contact form</a></strong> with "DMCA" in the subject line. The counter-notification should contain the following information:
<ol>
<li>Your physical or electronic signature.</li>
<li>Identification of the material that has been removed or to which access has been disabled and the location at which the material appeared before it was removed or access to it was disabled.</li>
<li>A statement under penalty of perjury that you have a good faith belief that the material was removed or disabled as a result of mistake or misidentification of the material to be removed or disabled.</li>
<li>Your name, address, and telephone number, and a statement that you consent to the jurisdiction of the federal court for [judicial district where your address is located], and that you will accept service of process from the person who provided notification of the alleged infringement.</li>
</ol>
If a counter-notice is received by us, we may send a copy of the counter-notice to the original complaining party informing that person that it may replace the removed material or cease disabling it in 10 business days. Unless the copyright owner files an action seeking a court order against the content provider, member, or user, the removed material may be replaced or access to it restored in 10 to 20 business days or more after receipt of the counter-notice, at our discretion.
<h4>Modifications to Policy</h4>
We reserve the right to modify the provisions of this DMCA notice and our copyright policy at any time. Such modifications will be effective immediately upon posting on the site.

View File

@@ -0,0 +1,7 @@
You don't need to do anything special, simply submit something.
While checking your submission we'll research your user name and entry.
If you are the creator of your own entry you'll be immediately verified after the first submission.
That means your next submission will go straight to the site, no queues.
Same for editing your existing entries data, updating the files, etc.
If you are not the creator of the hack you can also submit things. Since we already had trouble with vandalism, you automatically receive “Verified” status after 10 approved contributions.

View File

@@ -0,0 +1,22 @@
At Romhacks.org, we deeply respect the creative work of individuals and their rights over their creations. We understand that sometimes content may be shared on our platform that you, as the creator, would prefer to have removed. To make this process as smooth and friendly as possible, we offer an easy way to submit a takedown request.
<h4>How to Submit a Takedown Request</h4>
If you find that your content has been shared on Romhacks.org and you would like it to be removed, please follow these simple steps:
<ol>
<li><strong>Visit Our Contact Page</strong>: Go to <a href="{{ link('misc/contact') }}" target="_new" rel="noopener">our contact page</a>.</li>
<li><strong>Complete the Form</strong>: Fill out the necessary details in the form. In the subject dropdown menu, please select "<strong>Takedown</strong>" to ensure your request is processed correctly.</li>
<li><strong>Use a Verifiable Email</strong>: Provide an email address where we can reach you. If we can't communicate with you and can't confirm who you are we will not go through with the removal.</li>
<li><strong>Details of the Content</strong>: Include a link where the content appears here on romhacks.org. And any information to help us determine you created the hack.</li>
</ol>
<h4>Verification Process</h4>
To prevent malicious or unjustified takedown requests, <strong>we will conduct a verification process</strong> to confirm that you are indeed the creator or rightful owner of the content in question. This may include:
<ul>
<li>Asking for additional proof of ownership or creation.</li>
<li>Verifying the details provided in the request against the content.</li>
<li>Contacting the author via social media profiles and <strong>asking him directly</strong>.</li>
</ul>
<h4>Our Commitment</h4>
We aim to process takedown requests promptly and efficiently, respecting both the rights of content creators and the integrity of our platform. We appreciate your cooperation and understanding in this process.
<h4>Questions or Concerns?</h4>
If you have any questions or need further assistance regarding the takedown process, please feel free to reach out to us through the same contact form or via Discord.
We are here to help!

View File

@@ -2,8 +2,8 @@
"legacy_addon_id": "",
"title": "RomhackPlaza Master Addon",
"description": "",
"version_id": 1000000,
"version_string": "1.0.0",
"version_id": 1010070,
"version_string": "1.1.0",
"dev": "",
"dev_url": "",
"faq_url": "",