Procházet zdrojové kódy

Merge branch 'dev' of DragonFrame-Plugins/MinecraftPayment into master

master
dragonskills99 před 5 roky
rodič
revize
e9ce476c03
34 změnil soubory, kde provedl 1042 přidání a 959 odebrání
  1. 47
    34
      Plugin.php
  2. 363
    350
      classes/MinecraftPayAPI.class.php
  3. 35
    37
      classes/RCon.class.php
  4. 3
    1
      imgs/cash.svg
  5. 3
    1
      imgs/credit-card.svg
  6. 3
    1
      imgs/key.svg
  7. 3
    1
      imgs/lock.svg
  8. 7
    1
      imgs/minecraft.svg
  9. 4
    1
      imgs/refresh.svg
  10. 3
    1
      imgs/unlock.svg
  11. 1
    1
      mithril/components/Account.class.ts
  12. 1
    1
      mithril/components/Account.template.html
  13. 5
    5
      mithril/components/AccountList.class.ts
  14. 18
    18
      mithril/components/AccountList.template.html
  15. 25
    25
      mithril/components/AlterAccount.class.ts
  16. 29
    29
      mithril/components/AlterAccount.template.html
  17. 11
    11
      mithril/components/GrantUser.class.ts
  18. 25
    24
      mithril/components/GrantUser.template.html
  19. 49
    48
      mithril/components/MinecraftUsers.class.ts
  20. 24
    20
      mithril/components/MinecraftUsers.template.html
  21. 28
    27
      mithril/components/Settings.class.ts
  22. 55
    53
      mithril/components/Settings.template.html
  23. 14
    14
      mithril/components/SettingsList.class.ts
  24. 33
    30
      mithril/components/SettingsList.template.html
  25. 14
    14
      mithril/components/UsersList.class.ts
  26. 32
    29
      mithril/components/UsersList.template.html
  27. 23
    23
      mithril/lang/de.json
  28. 77
    77
      mithril/services/MinecraftPayService.ts
  29. 4
    2
      orm_schemas/MinecraftMonthPaid.class.php
  30. 36
    22
      orm_schemas/MinecraftServer.class.php
  31. 23
    21
      orm_schemas/MinecraftServerSubscription.class.php
  32. 27
    23
      orm_schemas/MinecraftUser.class.php
  33. 16
    13
      orm_schemas/MinecraftUserAccount.class.php
  34. 1
    1
      templates/Account.Template.php

+ 47
- 34
Plugin.php Zobrazit soubor

@@ -1,24 +1,31 @@
<?php
class MinecraftPaymentPlugin extends Plugin {
public static function get_plugin_name(): string {

class MinecraftPaymentPlugin extends Plugin
{
public static function get_plugin_name(): string
{
return 'Minecraft-Payment';
}

public function __construct( $_DB ) {
public function __construct( $_DB )
{
$this->require_class( 'RCon' );
}

public function has_page(): bool {
return true;
}
public function has_page(): bool
{
return true;
}

public function get_page_path() {
return [
'/minecraft-pay/settle' => 'settle_view'
];
public function get_page_path()
{
return [
'/minecraft-pay/settle' => 'settle_view'
];
}
public function pre_load_plugin(): void {

public function pre_load_plugin()
{
$this->register_component_short( 'SettingsList' );
$this->add_route( '/minecraft-pay/settings', 'SettingsList' );
$this->register_component_short( 'Settings' );
@@ -33,13 +40,14 @@ class MinecraftPaymentPlugin extends Plugin {
$this->add_route( '/minecraft-pay/balance', 'AccountList' );
$this->register_component_short( 'GrantUser' );
$this->add_route( '/minecraft-pay/grant', 'GrantUser' );
$this->require_class( 'MinecraftPayAPI' );
API::REGISTER_CLASS( new MinecraftPayAPI(), 3, 'minecraft-pay/' );
}

private function settle( $m, $y ) {
$mp = MinecraftMonthPaid::GetByUnique( 0, $m ,$y );
private function settle( $m, $y )
{
$mp = MinecraftMonthPaid::GetByUnique( 0, $m, $y );
if ( $mp ) {
echo __( [ 'de' => 'Bereits abgerechnet', 'en' => 'Already settled' ] );
return;
@@ -55,7 +63,7 @@ class MinecraftPaymentPlugin extends Plugin {
$sid = $server->ID;

$subscribers = MinecraftServerSubscription::GetAll( "ConcerningServerID = $sid AND SubscriptionDate BETWEEN '$f' AND '$l'" );
$subsCount = count( $subscribers );
$pot = $subsCount * $server->GetPerMonthPrice();
$potPart = ceil( ( $pot / $subsCount ) * 100 ) / 100;
@@ -63,7 +71,7 @@ class MinecraftPaymentPlugin extends Plugin {
$potPart *= -1;
if ( $pot > $server->GetMaxPerMonthPrice() ) $pot = $server->GetMaxPerMonthPrice();
$sum += $pot;
/* $dayssum = 0;

$subs = [];
@@ -81,9 +89,9 @@ class MinecraftPaymentPlugin extends Plugin {
$price = $pot * ( $dayssum / $subscription[ 0 ] )
}*/

foreach( $subscribers as $subscriber ) {
foreach ( $subscribers as $subscriber ) {
$u = $subscriber->GetUnlockedUser()->GetOwner();
$ac = new MinecraftUserAccount();
$ac->SetMod( $potPart );
$ac->SetDebtor( $u );
@@ -103,39 +111,44 @@ class MinecraftPaymentPlugin extends Plugin {
}
}

public function settle_view( string $url ) {
public function settle_view( string $url )
{
// ORDER BY Year DESC, Month DESC LIMIT 1

$nwst = MinecraftMonthPaid::GetAll( "1 ORDER BY Year DESC, Month DESC LIMIT 1" )[ 0 ];
if ( !$nwst ) {
$nwst = new MinecraftMonthPaid();
$nwst->SetMonth( date( 'm' ) );
$nwst->SetYear( date( 'Y' ) );
if ( !$nwst ) {
$nwst = new MinecraftMonthPaid();
$nwst->SetMonth( date( 'm' ) );
$nwst->SetYear( date( 'Y' ) );
}

$m = array_key_exists( 'month', $_GET ) ? $_GET[ 'month' ] + 1 : date( 'm' );
$y = array_key_exists( 'year', $_GET ) ? $_GET[ 'year' ] : date( 'Y' );
if ( $m == '0' ) { $m = '12'; $y--; }
if ( $m == '0' ) {
$m = '12';
$y--;
}

$start = ( new DateTime( $nwst->GetYear() . '-' . $nwst->GetMonth() . '-' . '01' ) )->modify( 'first day of next month' );
$end = ( new DateTime( date( "$y-$m-01" ) ) )->modify( 'first day of this month' );
$start = ( new DateTime( $nwst->GetYear() . '-' . $nwst->GetMonth() . '-' . '01' ) )->modify( 'first day of next month' );
$end = ( new DateTime( date( "$y-$m-01" ) ) )->modify( 'first day of this month' );
$interval = DateInterval::createFromDateString( '1 month' );
$period = new DatePeriod( $start, $interval, $end );
$period = new DatePeriod( $start, $interval, $end );

$settled = false;
foreach ($period as $dt) {
foreach ( $period as $dt ) {
$settled = true;
echo 'Settling ' . $dt->format("Y-m") . ': ';
echo 'Settling ' . $dt->format( "Y-m" ) . ': ';
$this->settle( $dt->format( 'm' ), $dt->format( 'Y' ) );
echo "<br>\n";
}

if( !$settled ) {
if ( !$settled ) {
echo 'Nothing to settle';
}
}

public function load_plugin(): void {
public function load_plugin()
{
if ( is_null( Permission::GetByUnique( 0, 'Minecraft-Pay-Settings' ) ) ) {
$p = Permission::FromArray( [], [] );
$p->SetName( 'Minecraft-Pay-Settings' );
@@ -161,7 +174,7 @@ class MinecraftPaymentPlugin extends Plugin {
}

$sub = new MenuEntry( [ 'de' => 'Minecraft Benutzer', 'en' => 'Minecraft Users' ], HOME_URL . 'minecraft-pay/users' );
$sub->addImageFromResource( 'users.svg', UserManager_Plugin::get_plugin_name() );
$sub->addImageFromResource( 'users.svg', UserManager_Plugin::get_plugin_name() );
$me->addSubEntry( $sub );

if ( Permission::PERMITTED( 'Minecraft-Pay-Settings' ) ) {
@@ -178,7 +191,7 @@ class MinecraftPaymentPlugin extends Plugin {
$sub = new MenuEntry( [ 'de' => 'Recht gew&auml;hren', 'en' => 'Grant right' ], HOME_URL . 'minecraft-pay/grant' );
$sub->addImageFromResource( 'key.svg', MinecraftPaymentPlugin::get_plugin_name() );
$me->addSubEntry( $sub );
};
}

SideMenu::addMainMenuEntry( $me );
}

+ 363
- 350
classes/MinecraftPayAPI.class.php Zobrazit soubor

@@ -1,351 +1,364 @@
<?php
class MinecraftPayAPI {
/**
* @API-Callback
* @Path servers
*
* @Request-Method GET
*
* @return MinecraftServer[]
*/
public function GetAllServers() {
return MinecraftServer::GetAll()->toArray();
}
/**
* @API-Callback
* @Path servers/:id
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method PATCH
*
* @Parameterized
*
* @param MinecraftServer $server server to edit
*
* @paramget id path id required int
* @paramget server post server required MinecraftServer
*
* @return APIResult< MinecraftServer >
*/
public static function UpdateServer( int $id, MinecraftServer $server ) {
$o = MinecraftServer::GetByID( $id );
if ( $o == null ) {
$results[] = new APIResult( 'Missing ID', false, $server );
}
if ( $server->GetName() != null ) $o->SetName( $server->GetName() );
if ( $server->GetDomain() != null ) $o->SetDomain( $server->GetDomain() );
if ( $server->GetPort() != null ) $o->SetPort( $server->GetPort() );
if ( $server->GetPassword() != null ) $o->SetPassword( $server->GetPassword() );
if ( $server->GetServerPath() != null ) $o->SetServerPath( $server->GetServerPath() );
if ( $server->GetPerMonthPrice() != null ) $o->SetPerMonthPrice( $server->GetPerMonthPrice() );
if ( $server->GetMaxPerMonthPrice() != null ) $o->SetMaxPerMonthPrice( $server->GetMaxPerMonthPrice() );
$r = $o->Save();
return new APIResult( $r ? 'Saved successfully' : 'Saving failed', $r, $r ? $o : MinecraftServer::GetByID( $id ) );
}
/**
* @API-Callback
* @Path servers/:id
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method DELETE
*
* @Parameterized
*
* @paramget id path id required int
*
* @return APIResult< MinecraftServer >
*/
public static function DeleteServer( int $id ) {
if ( !is_numeric( $id ) ) return new APIResult( 'Invalid ID', false, null );
$server = MinecraftServer::GetByID( $id );
$result = null;
if ( !$server ) {
$result = new APIResult( 'Server does not exist', false, null );
} else if ( $server->DELETE() ) {
$result = new APIResult( 'Deleted server successfully', true, null );
} else {
$result = new APIResult( 'Deleting server failed', false, $server );
}
return $result;
}
/**
* @API-Callback
* @Path servers
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method POST
*
* @Parameterized
*
* @param MinecraftServer $server to add
*
* @paramget server post server required MinecraftServer
*
* @return APIResult< MinecraftServer >
*/
public static function AddServer( MinecraftServer $server ) {
$o = new MinecraftServer();
$o->SetName( $server->GetName() );
$s = $o->Save();
return new APIResult( $s ? 'Created server successfully' : 'The server could not be created', $s, $s ? $o : null );
}
/**
* @API-Callback
* @Path users
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @return MinecraftUser[]
*/
public function GetAllUsers() {
return MinecraftUser::GetAll( [ 'OwnerID' => API::$User->GetID() ] )->toArray();
}
/**
* @API-Callback
* @Path users/:id/subscription-states
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @Parameterized
*
* @paramget id path id required int
*
* @return Map< int, boolean >
*/
public function GetAllSubscriptionStates( int $id ) {
$user = MinecraftUser::GetByID( $id );
$data = [];
foreach( MinecraftServer::GetAll() as $server ) {
$data[] = [ $server->GetID() , $server->IsUnlocked( $user ) ];
}
return $data;
}
/**
* @API-Callback
* @Path users/:id/subscribe-server/:serverId
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @Parameterized
*
* @paramget id path id required int
* @paramget serverId path serverId required int
*
* @return APIResult< boolean >
*/
public function SubscribeServer( int $id, int $serverId ) {
$u = MinecraftUser::GetByID( $id );
$s = MinecraftServer::GetByID( $serverId );
$result = new APIResult( '', false, false );
if ( is_null( $s ) ) {
$result->Message( 'Unknown server' );
}
else if ( is_null( $u ) ) {
$result->Message( 'Unknown user' );
}
else {
if ( $s->Unlock( $u ) ) {
if ( !$u->HasSubscripted( $s ) ) {
$ms = new MinecraftServerSubscription();
$ms->SetConcerningServer( $s );
$ms->SetUnlockedUser( $u );
$result->Success( $ms->Save() );
$result->Message( $result->Success() ? 'Unlock successful' : 'Unlock failed' )->Obj( $result->Success() );
if ( !$result->Success() ) $s->Lock( $u );
} else {
$result->Message( 'Unlock successful' )->Success( true )->Obj( true );
}
} else {
$result->Message( 'Unlock failed' )->Success( false );
}
}
return $result;
}
// /**
// * @API-Callback
// * @Path users/:id
// * @Require-Login
// * @Require-Permission Minecraft-Possess-User
// *
// * @Request-Method PATCH
// *
// * @Parameterized
// *
// * @param MinecraftUser $user user to edit
// *
// * @paramget id path id required int
// * @paramget user post user required MinecraftUser
// *
// * @return APIResult< MinecraftUser >
// */
// public static function UpdateUser( int $id, MinecraftUser $user ) {
// $o = MinecraftUser::GetByID( $id );
// if ( $o == null ) {
// $results[] = new APIResult( 'Missing ID', false, $user );
// }
// if ( $user->GetUsername() != null ) $o->SetUsername( $user->GetUsername() );
// if ( API::$User->GetID() != $user->GetOwner()->GetID() ) {
// return new APIResult( 'This minecraft user does not belong to you', false, null );
// }
// $r = $o->Save();
// return new APIResult( $r ? 'Saved successfully' : 'Saving failed', $r, $r ? $o : MinecraftUser::GetByID( $id ) );
// }
/**
* @API-Callback
* @Path users/:id
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method DELETE
*
* @Parameterized
*
* @paramget id path id required int
*
* @return APIResult< MinecraftUser >
*/
public static function DeleteUser( int $id ) {
if ( !is_numeric( $id ) ) return new APIResult( 'Invalid ID', false, null );
$user = MinecraftUser::GetByID( $id );
$result = null;
if ( !$user ) {
$result = new APIResult( 'User does not exist', false, null );
} else if ( $user->DELETE() ) {
$result = new APIResult( 'Deleted user successfully', true, null );
} else {
$result = new APIResult( 'Deleting user failed', false, $user );
}
return $result;
}
/**
* @API-Callback
* @Path users
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method POST
*
* @Parameterized
*
* @param MinecraftUser $user to add
*
* @paramget user post user required MinecraftUser
*
* @return APIResult< MinecraftUser >
*/
public static function AddUser( MinecraftUser $user ) {
$o = new MinecraftUser();
$o->SetUsername( $user->GetUsername() );
$o->SetOwner( API::$User );
$s = $o->Save();
return new APIResult( $s ? 'Created user successfully' : 'The user could not be created', $s, $s ? $o : null );
}
/**
* @API-Callback
* @Path charges
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @return MinecraftUserAccount[]
*/
public function GetAllCharges() {
return MinecraftUserAccount::GetAll( [ 'DebtorID' => API::$User->GetID() ] )->toArray();
}
/**
* @API-Callback
* @Path users/:id/grant-user-right
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method POST
*
* @Parameterized
*
* @paramget id path id required int
*
* @return APIResult< boolean >
*/
public function GrantUserRight( int $id ) {
$u = User::GetByID( $id );
$r = new APIResult( '', false, false );
$s = false;
if ( !is_null( $u ) ) {
$p = Permission::SEARCH( 'Minecraft-Possess-User' );
$s = $p->grant_user( $u->GetID(), true );
$r->Message( 'Right granted successfully' )->Success( true )->Obj( true );
}
else $r->Message( 'Could not find user' );
return $r;
}
/**
* @API-Callback
* @Path users/:id/acredit
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method POST
*
* @Parameterized
*
* @paramget id path id required int
* @paramget credit post credit required MinecraftUserAccount
*
* @return APIResult< MinecraftUserAccount >
*/
public function Acredit( int $id, MinecraftUserAccount $credit ) {
$r = new APIResult( '', false, null );
$ac = new MinecraftUserAccount();
$u = User::GetByID( $id );
if ( is_null( $u ) ) {
$r->Message( 'Missing user' );
} else {
$ac->SetMod( $credit->GetMod() );
$ac->SetComment( $credit->GetComment() );
$ac->SetDebtor( $u );
$r->Success( !!$ac->Save() );
$r->Message( $r->Success() ? 'Credit successful' : 'Credit failed' );
if ( $r->Success() ) $r->Obj( $ac );
}
return $r;
}
<?php

class MinecraftPayAPI
{
/**
* @API-Callback
* @Path servers
*
* @Request-Method GET
*
* @return MinecraftServer[]
*/
public function GetAllServers()
{
return MinecraftServer::GetAll()->toArray();
}

/**
* @API-Callback
* @Path servers/:id
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method PATCH
*
* @Parameterized
*
* @param MinecraftServer $server server to edit
*
* @paramget id path id required int
* @paramget server post server required MinecraftServer
*
* @return APIResult< MinecraftServer >
*/
public static function UpdateServer( int $id, MinecraftServer $server )
{
$o = MinecraftServer::GetByID( $id );
if ( $o == null ) {
$results[] = new APIResult( 'Missing ID', false, $server );
}

if ( $server->GetName() != null ) $o->SetName( $server->GetName() );
if ( $server->GetDomain() != null ) $o->SetDomain( $server->GetDomain() );
if ( $server->GetPort() != null ) $o->SetPort( $server->GetPort() );
if ( $server->GetPassword() != null ) $o->SetPassword( $server->GetPassword() );
if ( $server->GetServerPath() != null ) $o->SetServerPath( $server->GetServerPath() );
if ( $server->GetPerMonthPrice() != null ) $o->SetPerMonthPrice( $server->GetPerMonthPrice() );
if ( $server->GetMaxPerMonthPrice() != null ) $o->SetMaxPerMonthPrice( $server->GetMaxPerMonthPrice() );

$r = $o->Save();
return new APIResult( $r ? 'Saved successfully' : 'Saving failed', $r, $r ? $o : MinecraftServer::GetByID( $id ) );
}

/**
* @API-Callback
* @Path servers/:id
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method DELETE
*
* @Parameterized
*
* @paramget id path id required int
*
* @return APIResult< MinecraftServer >
*/
public static function DeleteServer( int $id )
{
if ( !is_numeric( $id ) ) return new APIResult( 'Invalid ID', false, null );
$server = MinecraftServer::GetByID( $id );
$result = null;
if ( !$server ) {
$result = new APIResult( 'Server does not exist', false, null );
} else if ( $server->DELETE() ) {
$result = new APIResult( 'Deleted server successfully', true, null );
} else {
$result = new APIResult( 'Deleting server failed', false, $server );
}
return $result;
}

/**
* @API-Callback
* @Path servers
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method POST
*
* @Parameterized
*
* @param MinecraftServer $server to add
*
* @paramget server post server required MinecraftServer
*
* @return APIResult< MinecraftServer >
*/
public static function AddServer( MinecraftServer $server )
{
$o = new MinecraftServer();

$o->SetName( $server->GetName() );

$s = $o->Save();

return new APIResult( $s ? 'Created server successfully' : 'The server could not be created', $s, $s ? $o : null );
}

/**
* @API-Callback
* @Path users
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @return MinecraftUser[]
*/
public function GetAllUsers()
{
return MinecraftUser::GetAll( [ 'OwnerID' => API::$User->GetID() ] )->toArray();
}

/**
* @API-Callback
* @Path users/:id/subscription-states
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @Parameterized
*
* @paramget id path id required int
*
* @return Map< int, boolean >
* @noinspection PhpDocSignatureInspection
* @noinspection PhpUndefinedClassInspection
*/
public function GetAllSubscriptionStates( int $id )
{
$user = MinecraftUser::GetByID( $id );
$data = [];
foreach ( MinecraftServer::GetAll() as $server ) {
$data[] = [ $server->GetID(), $server->IsUnlocked( $user ) ];
}
return $data;
}

/**
* @API-Callback
* @Path users/:id/subscribe-server/:serverId
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @Parameterized
*
* @paramget id path id required int
* @paramget serverId path serverId required int
*
* @return APIResult< boolean >
*/
public function SubscribeServer( int $id, int $serverId )
{
$u = MinecraftUser::GetByID( $id );
$s = MinecraftServer::GetByID( $serverId );
$result = new APIResult( '', false, false );

if ( is_null( $s ) ) {
$result->Message( 'Unknown server' );
} else if ( is_null( $u ) ) {
$result->Message( 'Unknown user' );
} else {
if ( $s->Unlock( $u ) ) {
if ( !$u->HasSubscripted( $s ) ) {
$ms = new MinecraftServerSubscription();
$ms->SetConcerningServer( $s );
$ms->SetUnlockedUser( $u );
$result->Success( $ms->Save() );
$result->Message( $result->Success() ? 'Unlock successful' : 'Unlock failed' )->Obj( $result->Success() );
if ( !$result->Success() ) $s->Lock( $u );
} else {
$result->Message( 'Unlock successful' )->Success( true )->Obj( true );
}
} else {
$result->Message( 'Unlock failed' )->Success( false );
}
}

return $result;
}

// /**
// * @API-Callback
// * @Path users/:id
// * @Require-Login
// * @Require-Permission Minecraft-Possess-User
// *
// * @Request-Method PATCH
// *
// * @Parameterized
// *
// * @param MinecraftUser $user user to edit
// *
// * @paramget id path id required int
// * @paramget user post user required MinecraftUser
// *
// * @return APIResult< MinecraftUser >
// */
// public static function UpdateUser( int $id, MinecraftUser $user ) {
// $o = MinecraftUser::GetByID( $id );
// if ( $o == null ) {
// $results[] = new APIResult( 'Missing ID', false, $user );
// }

// if ( $user->GetUsername() != null ) $o->SetUsername( $user->GetUsername() );
// if ( API::$User->GetID() != $user->GetOwner()->GetID() ) {
// return new APIResult( 'This minecraft user does not belong to you', false, null );
// }

// $r = $o->Save();
// return new APIResult( $r ? 'Saved successfully' : 'Saving failed', $r, $r ? $o : MinecraftUser::GetByID( $id ) );
// }

/**
* @API-Callback
* @Path users/:id
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method DELETE
*
* @Parameterized
*
* @paramget id path id required int
*
* @return APIResult< MinecraftUser >
*/
public static function DeleteUser( int $id )
{
if ( !is_numeric( $id ) ) return new APIResult( 'Invalid ID', false, null );
$user = MinecraftUser::GetByID( $id );
$result = null;
if ( !$user ) {
$result = new APIResult( 'User does not exist', false, null );
} else if ( $user->DELETE() ) {
$result = new APIResult( 'Deleted user successfully', true, null );
} else {
$result = new APIResult( 'Deleting user failed', false, $user );
}
return $result;
}

/**
* @API-Callback
* @Path users
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method POST
*
* @Parameterized
*
* @param MinecraftUser $user to add
*
* @paramget user post user required MinecraftUser
*
* @return APIResult< MinecraftUser >
*/
public static function AddUser( MinecraftUser $user )
{
$o = new MinecraftUser();

$o->SetUsername( $user->GetUsername() );
$o->SetOwner( API::$User );

$s = $o->Save();

return new APIResult( $s ? 'Created user successfully' : 'The user could not be created', $s, $s ? $o : null );
}

/**
* @API-Callback
* @Path charges
* @Require-Login
* @Require-Permission Minecraft-Possess-User
*
* @Request-Method GET
*
* @return MinecraftUserAccount[]
*/
public function GetAllCharges()
{
return MinecraftUserAccount::GetAll( [ 'DebtorID' => API::$User->GetID() ] )->toArray();
}

/**
* @API-Callback
* @Path users/:id/grant-user-right
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method POST
*
* @Parameterized
*
* @paramget id path id required int
*
* @return APIResult< boolean >
*/
public function GrantUserRight( int $id )
{
$u = User::GetByID( $id );
$r = new APIResult( '', false, false );

$s = false;
if ( !is_null( $u ) ) {
$p = Permission::SEARCH( 'Minecraft-Possess-User' );
$s = $p->grant_user( $u->GetID(), true );

$r->Message( 'Right granted successfully' )->Success( true )->Obj( true );
} else $r->Message( 'Could not find user' );

return $r;
}

/**
* @API-Callback
* @Path users/:id/acredit
* @Require-Login
* @Require-Permission Minecraft-Pay-Settings
*
* @Request-Method POST
*
* @Parameterized
*
* @paramget id path id required int
* @paramget credit post credit required MinecraftUserAccount
*
* @return APIResult< MinecraftUserAccount >
*/
public function Acredit( int $id, MinecraftUserAccount $credit )
{
$r = new APIResult( '', false, null );
$ac = new MinecraftUserAccount();
$u = User::GetByID( $id );
if ( is_null( $u ) ) {
$r->Message( 'Missing user' );
} else {
$ac->SetMod( $credit->GetMod() );
$ac->SetComment( $credit->GetComment() );
$ac->SetDebtor( $u );

$r->Success( ! !$ac->Save() );
$r->Message( $r->Success() ? 'Credit successful' : 'Credit failed' );
if ( $r->Success() ) $r->Obj( $ac );
}

return $r;
}
}

+ 35
- 37
classes/RCon.class.php Zobrazit soubor

@@ -6,8 +6,8 @@
* PHP Version 7
*
* @copyright 2013-2017 Chris Churchwell
* @author thedudeguy
* @link https://github.com/thedudeguy/PHP-Minecraft-Rcon
* @author thedudeguy
* @link https://github.com/thedudeguy/PHP-Minecraft-Rcon
*/

class Rcon
@@ -33,12 +33,12 @@ class Rcon
/**
* Create a new instance of the Rcon class.
*
* @param string $host
* @param string $host
* @param integer $port
* @param string $password
* @param string $password
* @param integer $timeout
*/
public function __construct($host, $port, $password, $timeout)
public function __construct( $host, $port, $password, $timeout )
{
$this->host = $host;
$this->port = $port;
@@ -63,15 +63,15 @@ class Rcon
*/
public function connect()
{
$this->socket = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);
$this->socket = fsockopen( $this->host, $this->port, $errno, $errstr, $this->timeout );

if (!$this->socket) {
if ( !$this->socket ) {
$this->lastResponse = $errstr;
return false;
}

//set timeout
stream_set_timeout($this->socket, 3, 0);
stream_set_timeout( $this->socket, 3, 0 );

// check authorization
return $this->authorize();
@@ -84,8 +84,8 @@ class Rcon
*/
public function disconnect()
{
if ($this->socket) {
fclose($this->socket);
if ( $this->socket ) {
fclose( $this->socket );
}
$this->authorized = false;
}
@@ -107,22 +107,22 @@ class Rcon
*
* @return boolean|mixed
*/
public function sendCommand($command)
public function sendCommand( $command )
{
if (!$this->isConnected()) {
return false;
if ( !$this->isConnected() ) {
return false;
}

// send command packet
$this->writePacket(self::PACKET_COMMAND, self::SERVERDATA_EXECCOMMAND, $command);
$this->writePacket( self::PACKET_COMMAND, self::SERVERDATA_EXECCOMMAND, $command );

// get response
$response_packet = $this->readPacket();
if ($response_packet['id'] == self::PACKET_COMMAND) {
if ($response_packet['type'] == self::SERVERDATA_RESPONSE_VALUE) {
$this->lastResponse = $response_packet['body'];
if ( $response_packet[ 'id' ] == self::PACKET_COMMAND ) {
if ( $response_packet[ 'type' ] == self::SERVERDATA_RESPONSE_VALUE ) {
$this->lastResponse = $response_packet[ 'body' ];

return $response_packet['body'];
return $response_packet[ 'body' ];
}
}

@@ -136,11 +136,11 @@ class Rcon
*/
private function authorize()
{
$this->writePacket(self::PACKET_AUTHORIZE, self::SERVERDATA_AUTH, $this->password);
$this->writePacket( self::PACKET_AUTHORIZE, self::SERVERDATA_AUTH, $this->password );
$response_packet = $this->readPacket();

if ($response_packet['type'] == self::SERVERDATA_AUTH_RESPONSE) {
if ($response_packet['id'] == self::PACKET_AUTHORIZE) {
if ( $response_packet[ 'type' ] == self::SERVERDATA_AUTH_RESPONSE ) {
if ( $response_packet[ 'id' ] == self::PACKET_AUTHORIZE ) {
$this->authorized = true;

return true;
@@ -154,13 +154,13 @@ class Rcon
/**
* Writes a packet to the socket stream.
*
* @param $packetId
* @param $packetType
* @param $packetId
* @param $packetType
* @param string $packetBody
*
* @return void
*/
private function writePacket($packetId, $packetType, $packetBody)
private function writePacket( $packetId, $packetType, $packetBody )
{
/*
Size 32-bit little-endian Signed Integer Varies, see below.
@@ -171,18 +171,18 @@ class Rcon
*/

//create packet
$packet = pack('VV', $packetId, $packetType);
$packet = $packet.$packetBody."\x00";
$packet = $packet."\x00";
$packet = pack( 'VV', $packetId, $packetType );
$packet = $packet . $packetBody . "\x00";
$packet = $packet . "\x00";

// get packet size.
$packet_size = strlen($packet);
$packet_size = strlen( $packet );

// attach size to packet.
$packet = pack('V', $packet_size).$packet;
$packet = pack( 'V', $packet_size ) . $packet;

// write packet.
fwrite($this->socket, $packet, strlen($packet));
fwrite( $this->socket, $packet, strlen( $packet ) );
}

/**
@@ -193,9 +193,9 @@ class Rcon
private function readPacket()
{
//get packet size.
$size_data = fread($this->socket, 4);
$size_pack = unpack('V1size', $size_data);
$size = $size_pack['size'];
$size_data = fread( $this->socket, 4 );
$size_pack = unpack( 'V1size', $size_data );
$size = $size_pack[ 'size' ];

// if size is > 4096, the response will be in multiple packets.
// this needs to be address. get more info about multi-packet responses
@@ -203,9 +203,7 @@ class Rcon
// https://developer.valvesoftware.com/wiki/Source_RCON_Protocol
// currently, this script does not support multi-packet responses.

$packet_data = fread($this->socket, $size);
$packet_pack = unpack('V1id/V1type/a*body', $packet_data);

return $packet_pack;
$packet_data = fread( $this->socket, $size );
return unpack( 'V1id/V1type/a*body', $packet_data );
}
}

+ 3
- 1
imgs/cash.svg Zobrazit soubor

@@ -1 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M32 96v256h448V96H32zm160.5 224h-80.4c0-26.6-21.5-48.1-48.1-48.1V192c35.3 0 64-28.7 64-64h64.5c-19.9 23.5-32.5 57.8-32.5 96s12.6 72.5 32.5 96zM448 271.9c-26 0-48 21.5-48 48.1h-80.5c19.9-23.5 32.5-57.8 32.5-96s-12.6-72.5-32.5-96H384c0 35.3 28.7 64 64 64v79.9zM32 384h448v32H32z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M32 96v256h448V96H32zm160.5 224h-80.4c0-26.6-21.5-48.1-48.1-48.1V192c35.3 0 64-28.7 64-64h64.5c-19.9 23.5-32.5 57.8-32.5 96s12.6 72.5 32.5 96zM448 271.9c-26 0-48 21.5-48 48.1h-80.5c19.9-23.5 32.5-57.8 32.5-96s-12.6-72.5-32.5-96H384c0 35.3 28.7 64 64 64v79.9zM32 384h448v32H32z"/>
</svg>

+ 3
- 1
imgs/credit-card.svg Zobrazit soubor

@@ -1 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M435.2 80H76.8c-24.9 0-44.6 19.6-44.6 44L32 388c0 24.4 19.9 44 44.8 44h358.4c24.9 0 44.8-19.6 44.8-44V124c0-24.4-19.9-44-44.8-44zm0 308H76.8V256h358.4v132zm0-220H76.8v-44h358.4v44z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M435.2 80H76.8c-24.9 0-44.6 19.6-44.6 44L32 388c0 24.4 19.9 44 44.8 44h358.4c24.9 0 44.8-19.6 44.8-44V124c0-24.4-19.9-44-44.8-44zm0 308H76.8V256h358.4v132zm0-220H76.8v-44h358.4v44z"/>
</svg>

+ 3
- 1
imgs/key.svg Zobrazit soubor

@@ -1 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M249.2 224c-14.2-40.2-55.1-72-100.2-72-57.2 0-101 46.8-101 104s45.8 104 103 104c45.1 0 84.1-31.8 98.2-72H352v64h69.1v-64H464v-64H249.2zm-97.6 66.5c-19 0-34.5-15.5-34.5-34.5s15.5-34.5 34.5-34.5 34.5 15.5 34.5 34.5-15.5 34.5-34.5 34.5z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M249.2 224c-14.2-40.2-55.1-72-100.2-72-57.2 0-101 46.8-101 104s45.8 104 103 104c45.1 0 84.1-31.8 98.2-72H352v64h69.1v-64H464v-64H249.2zm-97.6 66.5c-19 0-34.5-15.5-34.5-34.5s15.5-34.5 34.5-34.5 34.5 15.5 34.5 34.5-15.5 34.5-34.5 34.5z"/>
</svg>

+ 3
- 1
imgs/lock.svg Zobrazit soubor

@@ -1 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M376 186h-20v-40c0-55-45-100-100-100S156 91 156 146v40h-20c-22.002 0-40 17.998-40 40v200c0 22.002 17.998 40 40 40h240c22.002 0 40-17.998 40-40V226c0-22.002-17.998-40-40-40zM256 368c-22.002 0-40-17.998-40-40s17.998-40 40-40 40 17.998 40 40-17.998 40-40 40zm62.002-182H193.998v-40c0-34.004 28.003-62.002 62.002-62.002 34.004 0 62.002 27.998 62.002 62.002v40z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M376 186h-20v-40c0-55-45-100-100-100S156 91 156 146v40h-20c-22.002 0-40 17.998-40 40v200c0 22.002 17.998 40 40 40h240c22.002 0 40-17.998 40-40V226c0-22.002-17.998-40-40-40zM256 368c-22.002 0-40-17.998-40-40s17.998-40 40-40 40 17.998 40 40-17.998 40-40 40zm62.002-182H193.998v-40c0-34.004 28.003-62.002 62.002-62.002 34.004 0 62.002 27.998 62.002 62.002v40z"/>
</svg>

+ 7
- 1
imgs/minecraft.svg Zobrazit soubor

@@ -1 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="480" height="480" viewBox="0 0 48 48"><path fill="#8BC34A" d="M11 7L21 7 20 11 23 11 21 16 25 16 27 11 30 11 31 7 41 7 35 33 3 33z"/><path fill="#263238" d="M40.754,6H40h-9h-0.74l-1.182,5H27.5h-1.299l-0.509,1.854L20.785,6H20h-7.266H11h-0.359h-0.01L2,33l8.908,9h0.229h2.004h7.982l1.523-6.172L23.698,37h2.62l4.104,5H30.6h1.784h8.538L46,17L40.754,6z M31.333,8h8.133l-1.808,8h-3.754l1.086-4.402c0.029-0.146-0.009-0.299-0.104-0.415C34.792,11.067,34.649,11,34.5,11h-3.908L31.333,8z M27.5,11.916V12h6.39l-1.012,4h-6.581l1.087-3.66L27.5,11.916z M18.887,11h-7.715l0.938-3h7.688L18.887,11z M12.334,33.042H4.369L4.328,33H4.297l3.125-10h1.915L7.52,29.362c-0.043,0.151-0.014,0.313,0.081,0.438C7.695,29.927,7.843,30,8,30h5.217L12.334,33.042z M9.52,26h4.858l-0.871,3H8.663L9.52,26z M25.094,33l2.628-11h-2.094h-1.121l-1.352,5H17.4l1.354-5h-3.215l-0.871,3H9.806l0.675-2.362c0.043-0.151,0.014-0.313-0.081-0.438C10.305,22.073,10.157,22,10,22H7.734l3.125-10h7.725H19h2.292l-1.354,5H25h1h11.432l-3.615,16H25.094z"/><path fill="#8D6E63" d="M18.841 40L12.334 33 4.328 33 11.182 40zM38.801 40L33.816 33 25.094 33 30.764 40zM23.036 33L23 33 24.117 28.324 23.084 27 17.484 27 24.071 35.001 24.678 35.001z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="480" height="480" viewBox="0 0 48 48">
<path fill="#8BC34A" d="M11 7L21 7 20 11 23 11 21 16 25 16 27 11 30 11 31 7 41 7 35 33 3 33z"/>
<path fill="#263238"
d="M40.754,6H40h-9h-0.74l-1.182,5H27.5h-1.299l-0.509,1.854L20.785,6H20h-7.266H11h-0.359h-0.01L2,33l8.908,9h0.229h2.004h7.982l1.523-6.172L23.698,37h2.62l4.104,5H30.6h1.784h8.538L46,17L40.754,6z M31.333,8h8.133l-1.808,8h-3.754l1.086-4.402c0.029-0.146-0.009-0.299-0.104-0.415C34.792,11.067,34.649,11,34.5,11h-3.908L31.333,8z M27.5,11.916V12h6.39l-1.012,4h-6.581l1.087-3.66L27.5,11.916z M18.887,11h-7.715l0.938-3h7.688L18.887,11z M12.334,33.042H4.369L4.328,33H4.297l3.125-10h1.915L7.52,29.362c-0.043,0.151-0.014,0.313,0.081,0.438C7.695,29.927,7.843,30,8,30h5.217L12.334,33.042z M9.52,26h4.858l-0.871,3H8.663L9.52,26z M25.094,33l2.628-11h-2.094h-1.121l-1.352,5H17.4l1.354-5h-3.215l-0.871,3H9.806l0.675-2.362c0.043-0.151,0.014-0.313-0.081-0.438C10.305,22.073,10.157,22,10,22H7.734l3.125-10h7.725H19h2.292l-1.354,5H25h1h11.432l-3.615,16H25.094z"/>
<path fill="#8D6E63"
d="M18.841 40L12.334 33 4.328 33 11.182 40zM38.801 40L33.816 33 25.094 33 30.764 40zM23.036 33L23 33 24.117 28.324 23.084 27 17.484 27 24.071 35.001 24.678 35.001z"/>
</svg>

+ 4
- 1
imgs/refresh.svg Zobrazit soubor

@@ -1 +1,4 @@
<svg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'><title>ionicons-v5-b</title><path d='M256,48C141.31,48,48,141.32,48,256c0,114.86,93.14,208,208,208,114.69,0,208-93.31,208-208C464,141.13,370.87,48,256,48Zm94,219a94,94,0,1,1-94-94h4.21l-24-24L256,129.2,315.8,189,256,248.8,236.2,229l27.92-27.92C261.72,201,259,201,256,201a66,66,0,1,0,66,66V253h28Z'/></svg>
<svg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'>
<title>ionicons-v5-b</title>
<path d='M256,48C141.31,48,48,141.32,48,256c0,114.86,93.14,208,208,208,114.69,0,208-93.31,208-208C464,141.13,370.87,48,256,48Zm94,219a94,94,0,1,1-94-94h4.21l-24-24L256,129.2,315.8,189,256,248.8,236.2,229l27.92-27.92C261.72,201,259,201,256,201a66,66,0,1,0,66,66V253h28Z'/>
</svg>

+ 3
- 1
imgs/unlock.svg Zobrazit soubor

@@ -1 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M376 186h-20v-40c0-55-45-100-100-100S156 91 156 146h37.998c0-34.004 28.003-62.002 62.002-62.002 34.004 0 62.002 27.998 62.002 62.002H318v40H136c-22.002 0-40 17.998-40 40v200c0 22.002 17.998 40 40 40h240c22.002 0 40-17.998 40-40V226c0-22.002-17.998-40-40-40zM256 368c-22.002 0-40-17.998-40-40s17.998-40 40-40 40 17.998 40 40-17.998 40-40 40z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M376 186h-20v-40c0-55-45-100-100-100S156 91 156 146h37.998c0-34.004 28.003-62.002 62.002-62.002 34.004 0 62.002 27.998 62.002 62.002H318v40H136c-22.002 0-40 17.998-40 40v200c0 22.002 17.998 40 40 40h240c22.002 0 40-17.998 40-40V226c0-22.002-17.998-40-40-40zM256 368c-22.002 0-40-17.998-40-40s17.998-40 40-40 40 17.998 40 40-17.998 40-40 40z"/>
</svg>

+ 1
- 1
mithril/components/Account.class.ts Zobrazit soubor

@@ -1,3 +1,3 @@
class Account {
}

+ 1
- 1
mithril/components/Account.template.html Zobrazit soubor

@@ -1,4 +1,4 @@
<meta log-in />
<meta log-in/>
<div style="width: 100%; text-align: right; border: 1px solid white; border-radius: 1rem; padding: 1rem; margin: 1rem 0; box-sizing: border-box;">
<span>Account: <a dval-innerText="MinecraftUserAccount::ACCOUNT() + ' &euro;'"></a></span>
</div>

+ 5
- 5
mithril/components/AccountList.class.ts Zobrazit soubor

@@ -2,10 +2,10 @@

class AccountList {
private refresh() {
MinecraftPayService.RefreshCharges();
}
MinecraftPayService.RefreshCharges();
}

private getAccount() {
return MinecraftPayService.UserAccounts.map( acc => acc.Mod ).concat( [ 0 ] ).reduce( ( pre, nxt ) => pre + nxt );
}
private getAccount() {
return MinecraftPayService.UserAccounts.map( acc => acc.Mod ).concat( [ 0 ] ).reduce( ( pre, nxt ) => pre + nxt );
}
}

+ 18
- 18
mithril/components/AccountList.template.html Zobrazit soubor

@@ -3,27 +3,27 @@
<span dval-innerText="this.getAccount()"></span>
<span>&nbsp;&euro;</span>
</div>
<hr />
<hr/>
<table class="table table-hover table-striped">
<thead>
<tr class="table-primary">
<th class="align-middle" dval-innerText="__( 'Date' )"></th>
<th class="align-middle" style="width: 100%;" dval-innerText="__( 'Comment' )"></th>
<th class="align-middle" dval-innerText="__( 'Amount' )"></th>
<th>
<a class="btn btn-info p-0">
<img dval-src="Resources.GetImageUrl( 'refresh.svg', 'Minecraft-Payment' )"
style="filter: invert( 1 ); height: 2em;" dval-onclick="() => this.refresh()" />
</a>
</th>
</tr>
<tr class="table-primary">
<th class="align-middle" dval-innerText="__( 'Date' )"></th>
<th class="align-middle" style="width: 100%;" dval-innerText="__( 'Comment' )"></th>
<th class="align-middle" dval-innerText="__( 'Amount' )"></th>
<th>
<a class="btn btn-info p-0">
<img dval-src="Resources.GetImageUrl( 'refresh.svg', 'Minecraft-Payment' )"
style="filter: invert( 1 ); height: 2em;" dval-onclick="() => this.refresh()"/>
</a>
</th>
</tr>
</thead>
<tbody>
<tr m-for="MinecraftPayService.UserAccounts as credit">
<td class="align-middle" dval-innerText="credit.Occurence"></td>
<td class="align-middle" dval-innerText="credit.Comment"></td>
<td colspan="2" class="align-middle" style="text-align: right;"
dval-innerText="credit.Mod + '&nbsp;&euro;'"></td>
</tr>
<tr m-for="MinecraftPayService.UserAccounts as credit">
<td class="align-middle" dval-innerText="credit.Occurence"></td>
<td class="align-middle" dval-innerText="credit.Comment"></td>
<td colspan="2" class="align-middle" style="text-align: right;"
dval-innerText="credit.Mod + '&nbsp;&euro;'"></td>
</tr>
</tbody>
</table>

+ 25
- 25
mithril/components/AlterAccount.class.ts Zobrazit soubor

@@ -1,26 +1,26 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
// MLQRequire: { "Plugin": "User-Manager", "Type": "Service", "Name": "UserData" }
class AlterAccount {
private debtor: number;
private mod: number;
private comment: string;
private acredit() {
MinecraftPayAPI.Acredit(
{
params: {
id: this.debtor
},
post: {
credit: {
Comment: this.comment,
Mod: this.mod
} as MinecraftUserAccount
}
}
).then( r => {
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
// MLQRequire: { "Plugin": "User-Manager", "Type": "Service", "Name": "UserData" }
class AlterAccount {
private debtor: number;
private mod: number;
private comment: string;
private acredit() {
MinecraftPayAPI.Acredit(
{
params: {
id: this.debtor
},
post: {
credit: {
Comment: this.comment,
Mod: this.mod
} as MinecraftUserAccount
}
}
).then( r => {
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
}

+ 29
- 29
mithril/components/AlterAccount.template.html Zobrazit soubor

@@ -1,37 +1,37 @@
<form m-form="this.acredit">
<table class="table table-striped table-hover">
<thead>
<tr class="table-primary">
<th innerText="Minecraft Payment" colspan="2"></th>
</tr>
<tr class="table-primary">
<th innerText="Minecraft Payment" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th class="align-middle" dval-innerText="__( 'User' )"></th>
<td>
<select class="form-control" name="DebtorID" m-value="this.debtor">
<option dval-innerText="__( '-- Please select --' )"></option>
<option m-for="UserData.Users as user" dval-value="user.ID" dval-innerText="user.Username"></option>
</select>
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Amount' )"></th>
<td>
<input class="form-control" type="number" step="0.01" name="Mod" value="0.00" m-value="this.mod" />
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Comment' )"></th>
<td>
<input class="form-control" type="string" name="Comment" m-value="this.comment" />
</td>
</tr>
<tr>
<td colspan="2">
<input class="form-control btn-info" type="submit" name="AddAccountChange" dval-value="__( 'Credit' )" />
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'User' )"></th>
<td>
<select class="form-control" name="DebtorID" m-value="this.debtor">
<option dval-innerText="__( '-- Please select --' )"></option>
<option m-for="UserData.Users as user" dval-value="user.ID" dval-innerText="user.Username"></option>
</select>
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Amount' )"></th>
<td>
<input class="form-control" type="number" step="0.01" name="Mod" value="0.00" m-value="this.mod"/>
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Comment' )"></th>
<td>
<input class="form-control" type="string" name="Comment" m-value="this.comment"/>
</td>
</tr>
<tr>
<td colspan="2">
<input class="form-control btn-info" type="submit" name="AddAccountChange" dval-value="__( 'Credit' )"/>
</td>
</tr>
</tbody>
</table>
</form>

+ 11
- 11
mithril/components/GrantUser.class.ts Zobrazit soubor

@@ -1,12 +1,12 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
// MLQRequire: { "Plugin": "User-Manager", "Type": "Service", "Name": "UserData" }
class GrantUser {
private user: number;
private grant() {
MinecraftPayAPI.GrantUserRight( { params: { id: this.user } } ).then( r => {
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
// MLQRequire: { "Plugin": "User-Manager", "Type": "Service", "Name": "UserData" }
class GrantUser {
private user: number;
private grant() {
MinecraftPayAPI.GrantUserRight( { params: { id: this.user } } ).then( r => {
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
}

+ 25
- 24
mithril/components/GrantUser.template.html Zobrazit soubor

@@ -1,25 +1,26 @@
<form m-form="this.grant">
<table class="table table-hover table-striped">
<thead>
<tr class="table-primary">
<th innerText="Minecraft Payment" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th class="align-middle" dval-innerText="__( 'User' )"></th>
<td>
<select class="form-control" name="ID" m-value="this.user">
<option dval-innerText="__( '-- Please select --' )"></option>
<option m-for="UserData.Users as user" dval-value="user.ID" dval-innerText="user.Username"></option>
</select>
</td>
</tr>
<tr>
<td colspan="2">
<input class="form-control btn-info" type="submit" name="GrantUserRights" dval-value="__( 'Mark as Minecraft Payment User' )" />
</td>
</tr>
</tbody>
</table>
<form m-form="this.grant">
<table class="table table-hover table-striped">
<thead>
<tr class="table-primary">
<th innerText="Minecraft Payment" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th class="align-middle" dval-innerText="__( 'User' )"></th>
<td>
<select class="form-control" name="ID" m-value="this.user">
<option dval-innerText="__( '-- Please select --' )"></option>
<option m-for="UserData.Users as user" dval-value="user.ID" dval-innerText="user.Username"></option>
</select>
</td>
</tr>
<tr>
<td colspan="2">
<input class="form-control btn-info" type="submit" name="GrantUserRights"
dval-value="__( 'Mark as Minecraft Payment User' )"/>
</td>
</tr>
</tbody>
</table>
</form>

+ 49
- 48
mithril/components/MinecraftUsers.class.ts Zobrazit soubor

@@ -1,49 +1,50 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class MinecraftUsers {
private user: MinecraftUser = {} as MinecraftUser;
private subscriptionsStates: Map< number, boolean > = new Map();
public onview( vnode )
{
if ( typeof( MinecraftUser ) !== 'function' ) LoadQueue.Start( () => {} )
else this.loadUser();
}
private loadUser() {
var id: string | number = m.route.param( 'id' );
if ( id.match( /^[0-9]+$/ ) ) id = +id;
else return;
if ( this.user.ID !== id ) {
this.user = $.extend( true, new MinecraftUser(), MinecraftPayService.Users.find( o => o.ID === id ) ) || this.user;
if ( this.user.ID ) {
MinecraftPayAPI.GetAllSubscriptionStates( { params: { id } } ).then( map => {
this.subscriptionsStates = map || this.subscriptionsStates;
} );
}
m.redraw();
}
}
private UnlockServer( serverId: number ) {
if ( !this.subscriptionsStates.get( serverId ) ) {
Modal.YesNo(
'Delete minecraft user', __( 'Do you really want to unlock this server for this minecraft user?' ),
( c, e ) => this.unlockServer( this.user.ID, serverId, c )
).Show();
}
}
private unlockServer( userId: number, serverId: number, confirmed: boolean ): boolean {
if ( confirmed ) {
MinecraftPayAPI.SubscribeServer( { params: { id: userId, serverId } } ).then( r => {
this.subscriptionsStates.set( serverId, r.Obj );
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
return undefined;
}
public constructor() {
}
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }

class MinecraftUsers {
private user: MinecraftUser = {} as MinecraftUser;
private subscriptionsStates: Map<number, boolean> = new Map();

public onview( vnode ) {
if ( typeof ( MinecraftUser ) !== 'function' ) LoadQueue.Start( () => {
} )
else this.loadUser();
}

private loadUser() {
var id: string | number = m.route.param( 'id' );
if ( id.match( /^[0-9]+$/ ) ) id = +id;
else return;

if ( this.user.ID !== id ) {
this.user = $.extend( true, new MinecraftUser(), MinecraftPayService.Users.find( o => o.ID === id ) ) || this.user;
if ( this.user.ID ) {
MinecraftPayAPI.GetAllSubscriptionStates( { params: { id } } ).then( map => {
this.subscriptionsStates = map || this.subscriptionsStates;
} );
}
m.redraw();
}
}

private UnlockServer( serverId: number ) {
if ( !this.subscriptionsStates.get( serverId ) ) {
Modal.YesNo(
'Delete minecraft user', __( 'Do you really want to unlock this server for this minecraft user?' ),
( c, e ) => this.unlockServer( this.user.ID, serverId, c )
).Show();
}
}

private unlockServer( userId: number, serverId: number, confirmed: boolean ): boolean {
if ( confirmed ) {
MinecraftPayAPI.SubscribeServer( { params: { id: userId, serverId } } ).then( r => {
this.subscriptionsStates.set( serverId, r.Obj );
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
return undefined;
}

public constructor() {
}
}

+ 24
- 20
mithril/components/MinecraftUsers.template.html Zobrazit soubor

@@ -1,21 +1,25 @@
<table class="table table-striped table-hover">
<thead>
<tr class="table-primary">
<th dval-innerText="this.user.Username" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr class="table-primary">
<th colspan="2" dval-innerText="__('Server')"></th>
</tr>
<tr m-for="MinecraftPayService.Servers as server">
<td class="align-middle" style="vertical-align: middle; width: 100%" dval-innerText="server.Name"></td>
<td class="align-middle">
<span m-if="this.subscriptionsStates.has( server.ID )" dval-onclick="() => this.UnlockServer( server.ID )" dval-class="'d-flex align-items-center btn ' + ( this.subscriptionsStates.get( server.ID ) ? 'btn-success' : 'btn-danger' )">
<span m-if="!this.subscriptionsStates.get( server.ID )" dval-innerText="__( 'Unlock' ) + '&nbsp;~' + server.PerMonthPrice + '&nbsp;&euro;&nbsp;'"></span>
<img class="float-right" style="height: 1em; filter: invert( 1 ); vertical-align: middle;" dval-src="Resources.GetImageUrl( this.subscriptionsStates.get( server.ID ) ? 'unlock.svg' : 'lock.svg', 'Minecraft-Payment' )" />
</span>
</td>
</tr>
</tbody>
<table class="table table-striped table-hover">
<thead>
<tr class="table-primary">
<th dval-innerText="this.user.Username" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr class="table-primary">
<th colspan="2" dval-innerText="__('Server')"></th>
</tr>
<tr m-for="MinecraftPayService.Servers as server">
<td class="align-middle" style="vertical-align: middle; width: 100%" dval-innerText="server.Name"></td>
<td class="align-middle">
<span m-if="this.subscriptionsStates.has( server.ID )"
dval-onclick="() => this.UnlockServer( server.ID )"
dval-class="'d-flex align-items-center btn ' + ( this.subscriptionsStates.get( server.ID ) ? 'btn-success' : 'btn-danger' )">
<span m-if="!this.subscriptionsStates.get( server.ID )"
dval-innerText="__( 'Unlock' ) + '&nbsp;~' + server.PerMonthPrice + '&nbsp;&euro;&nbsp;'"></span>
<img class="float-right" style="height: 1em; filter: invert( 1 ); vertical-align: middle;"
dval-src="Resources.GetImageUrl( this.subscriptionsStates.get( server.ID ) ? 'unlock.svg' : 'lock.svg', 'Minecraft-Payment' )"/>
</span>
</td>
</tr>
</tbody>
</table>

+ 28
- 27
mithril/components/Settings.class.ts Zobrazit soubor

@@ -1,28 +1,29 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class Settings {
private settings: MinecraftServer = {} as MinecraftServer;
public onview( vnode )
{
if ( typeof( MinecraftServer ) !== 'function' ) LoadQueue.Start( () => {} )
else this.loadServer();
}
private loadServer() {
var id: string | number = m.route.param( 'id' );
if ( id.match( /^[0-9]+$/ ) ) id = parseInt( id );
else return;
if ( this.settings.ID !== id ) {
this.settings = $.extend( true, new MinecraftServer(), MinecraftPayService.Servers.find( o => o.ID === id ) ) || this.settings;
m.redraw();
}
}
public constructor() {
}
private saveServer() {
MinecraftPayService.UpdateServer( this.settings.ID, this.settings );
}
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }

class Settings {
private settings: MinecraftServer = {} as MinecraftServer;

public onview( vnode ) {
if ( typeof ( MinecraftServer ) !== 'function' ) LoadQueue.Start( () => {
} )
else this.loadServer();
}

private loadServer() {
var id: string | number = m.route.param( 'id' );
if ( id.match( /^[0-9]+$/ ) ) id = parseInt( id );
else return;

if ( this.settings.ID !== id ) {
this.settings = $.extend( true, new MinecraftServer(), MinecraftPayService.Servers.find( o => o.ID === id ) ) || this.settings;
m.redraw();
}
}

public constructor() {
}

private saveServer() {
MinecraftPayService.UpdateServer( this.settings.ID, this.settings );
}
}

+ 55
- 53
mithril/components/Settings.template.html Zobrazit soubor

@@ -1,53 +1,55 @@
<form m-form="this.saveServer" m-if="m.route.param( 'id' ).match( /^([0-9]+|me)$/ )">
<table class="table table-striped table-hover">
<thead>
<tr class="table-primary">
<th dval-innerText="'Minecraft Payment Server ' + __( 'Settings' )" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th class="align-middle" dval-innerText="__( 'Domain' )"></th>
<td>
<input class="form-control" type="text" name="Domain" m-value="this.settings.Domain" />
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Port' )"></th>
<td>
<input class="form-control" type="number" name="Port" m-value="this.settings.Port" />
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Password' )"></th>
<td>
<input autocomplete="password" class="form-control" type="password" name="Password" m-value="this.settings.Password" />
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Server-Path' )"></th>
<td>
<input class="form-control" type="text" name="ServerPath" m-value="this.settings.ServerPath" />
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Price/Month' )"></th>
<td>
<input class="form-control" type="number" name="PerMonthPrice" m-value="this.settings.PerMonthPrice" />
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Price/Month (Limit)' )"></th>
<td>
<input class="form-control" type="number" name="MaxPerMonthPrice" m-value="this.settings.MaxPerMonthPrice" />
</td>
</tr>
<tr>
<td colspan="2">
<input class="btn btn-primary w-100" type="submit" name="SaveServerSettings" m-value="__( 'Save' )" />
</td>
</tr>
</tbody>
</table>
</form>
<h3 m-if="!m.route.param( 'id' ).match( /^([0-9]+|me)$/ )" dval-innerText="__( 'Invalid ID given' )"></h3>
<form m-form="this.saveServer" m-if="m.route.param( 'id' ).match( /^([0-9]+|me)$/ )">
<table class="table table-striped table-hover">
<thead>
<tr class="table-primary">
<th dval-innerText="'Minecraft Payment Server ' + __( 'Settings' )" colspan="2"></th>
</tr>
</thead>
<tbody>
<tr>
<th class="align-middle" dval-innerText="__( 'Domain' )"></th>
<td>
<input class="form-control" type="text" name="Domain" m-value="this.settings.Domain"/>
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Port' )"></th>
<td>
<input class="form-control" type="number" name="Port" m-value="this.settings.Port"/>
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Password' )"></th>
<td>
<input autocomplete="password" class="form-control" type="password" name="Password"
m-value="this.settings.Password"/>
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Server-Path' )"></th>
<td>
<input class="form-control" type="text" name="ServerPath" m-value="this.settings.ServerPath"/>
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Price/Month' )"></th>
<td>
<input class="form-control" type="number" name="PerMonthPrice" m-value="this.settings.PerMonthPrice"/>
</td>
</tr>
<tr>
<th class="align-middle" dval-innerText="__( 'Price/Month (Limit)' )"></th>
<td>
<input class="form-control" type="number" name="MaxPerMonthPrice"
m-value="this.settings.MaxPerMonthPrice"/>
</td>
</tr>
<tr>
<td colspan="2">
<input class="btn btn-primary w-100" type="submit" name="SaveServerSettings" m-value="__( 'Save' )"/>
</td>
</tr>
</tbody>
</table>
</form>
<h3 m-if="!m.route.param( 'id' ).match( /^([0-9]+|me)$/ )" dval-innerText="__( 'Invalid ID given' )"></h3>

+ 14
- 14
mithril/components/SettingsList.class.ts Zobrazit soubor

@@ -1,15 +1,15 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class SettingsList {
private serverName: string;
private addServer() {
MinecraftPayService.CreateServer( { Name: this.serverName } as MinecraftServer );
}
private deleteServer( id: number, confirm: boolean, event: any ) {
if ( confirm ) {
MinecraftPayService.DeleteServer( id );
}
}
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class SettingsList {
private serverName: string;
private addServer() {
MinecraftPayService.CreateServer( { Name: this.serverName } as MinecraftServer );
}
private deleteServer( id: number, confirm: boolean, event: any ) {
if ( confirm ) {
MinecraftPayService.DeleteServer( id );
}
}
}

+ 33
- 30
mithril/components/SettingsList.template.html Zobrazit soubor

@@ -1,31 +1,34 @@
<meta log-in permission="Minecraft-Pay-Settings" />
<form m-form="this.addServer">
<table class="table table-hover table-striped">
<tbody>
<tr>
<td><input class="form-control" type="text" name="Name" m-value="this.serverName" /></td>
<td><input class="form-control btn-info" type="submit" name="CreateServer" dval-value="__( 'Create server' )" /></td>
</tr>
</tbody>
</table>
</form>
<hr />
<table class="table table-hover table-striped">
<thead>
<tr class="table-primary">
<th style="width: 100%;">Name</th>
<th colspan="2"></th>
</tr>
</thead>
<tbody>
<tr m-for="MinecraftPayService.Servers as server">
<td class="align-middle" dval-innerText="server.Name"></td>
<td class="align-middle">
<a class="action_href action_delete btn btn-danger" style="cursor: pointer;" dval-onclick="() => Modal.YesNo( 'Delete server', __( 'Do you really want to delete this server?' ), ( c, e ) => this.deleteServer( server.ID, c, e ) ).Show()">&#x1F5D1;</a>
</td>
<td class="align-middle">
<a class="action_href btn btn-outline-primary float-right" dval-m-href="'/minecraft-pay/settings/' + server.ID">&gt;&gt;</a>
</td>
</tr>
</tbody>
<meta log-in permission="Minecraft-Pay-Settings"/>
<form m-form="this.addServer">
<table class="table table-hover table-striped">
<tbody>
<tr>
<td><input class="form-control" type="text" name="Name" m-value="this.serverName"/></td>
<td><input class="form-control btn-info" type="submit" name="CreateServer"
dval-value="__( 'Create server' )"/></td>
</tr>
</tbody>
</table>
</form>
<hr/>
<table class="table table-hover table-striped">
<thead>
<tr class="table-primary">
<th style="width: 100%;">Name</th>
<th colspan="2"></th>
</tr>
</thead>
<tbody>
<tr m-for="MinecraftPayService.Servers as server">
<td class="align-middle" dval-innerText="server.Name"></td>
<td class="align-middle">
<a class="action_href action_delete btn btn-danger" style="cursor: pointer;"
dval-onclick="() => Modal.YesNo( 'Delete server', __( 'Do you really want to delete this server?' ), ( c, e ) => this.deleteServer( server.ID, c, e ) ).Show()">&#x1F5D1;</a>
</td>
<td class="align-middle">
<a class="action_href btn btn-outline-primary float-right"
dval-m-href="'/minecraft-pay/settings/' + server.ID">&gt;&gt;</a>
</td>
</tr>
</tbody>
</table>

+ 14
- 14
mithril/components/UsersList.class.ts Zobrazit soubor

@@ -1,15 +1,15 @@
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class UsersList {
private username: string;
private addUser() {
MinecraftPayService.CreateUser( { Username: this.username } as MinecraftUser );
}
private deleteUser( id: number, confirm: boolean, event: any ) {
if ( confirm ) {
MinecraftPayService.DeleteUser( id );
}
}
// MLQRequire: { "Plugin": "Minecraft-Payment", "Type": "Service", "Name": "MinecraftPayService" }
class UsersList {
private username: string;
private addUser() {
MinecraftPayService.CreateUser( { Username: this.username } as MinecraftUser );
}
private deleteUser( id: number, confirm: boolean, event: any ) {
if ( confirm ) {
MinecraftPayService.DeleteUser( id );
}
}
}

+ 32
- 29
mithril/components/UsersList.template.html Zobrazit soubor

@@ -1,30 +1,33 @@
<form m-form="this.addUser">
<table class="table table-hover table-striped">
<tbody>
<tr>
<td><input class="form-control" type="text" name="Username" dval-placeholder="__( 'Username' )" m-value="this.username" /></td>
<td><input class="form-control btn-info" type="submit" name="CreateMinecraftUser" dval-value="__( 'Add Minecraft User' )" /></td>
</tr>
</tbody>
</table>
</form>
<hr />
<table class="table">
<thead>
<tr class="table-primary">
<th style="width: 100%;">Name</th>
<th colspan="2"></th>
</tr>
</thead>
<tbody>
<tr m-for="MinecraftPayService.Users as user">
<td class="align-middle" dval-innerText="user.Username"></td>
<td class="align-middle">
<a class="action_href action_delete btn btn-danger" style="cursor: pointer;" dval-onclick="() => Modal.YesNo( 'Delete minecraft user', __( 'Do you really want to delete this minecraft user?' ), ( c, e ) => this.deleteUser( user.ID, c, e ) ).Show()">&#x1F5D1;</a>
</td>
<td class="align-middle">
<a class="action_href btn btn-outline-primary float-right" dval-m-href="'/minecraft-pay/users/' + user.ID">&gt;&gt;</a>
</td>
</tr>
</tbody>
<form m-form="this.addUser">
<table class="table table-hover table-striped">
<tbody>
<tr>
<td><input class="form-control" type="text" name="Username" dval-placeholder="__( 'Username' )"
m-value="this.username"/></td>
<td><input class="form-control btn-info" type="submit" name="CreateMinecraftUser"
dval-value="__( 'Add Minecraft User' )"/></td>
</tr>
</tbody>
</table>
</form>
<hr/>
<table class="table">
<thead>
<tr class="table-primary">
<th style="width: 100%;">Name</th>
<th colspan="2"></th>
</tr>
</thead>
<tbody>
<tr m-for="MinecraftPayService.Users as user">
<td class="align-middle" dval-innerText="user.Username"></td>
<td class="align-middle">
<a class="action_href action_delete btn btn-danger" style="cursor: pointer;"
dval-onclick="() => Modal.YesNo( 'Delete minecraft user', __( 'Do you really want to delete this minecraft user?' ), ( c, e ) => this.deleteUser( user.ID, c, e ) ).Show()">&#x1F5D1;</a>
</td>
<td class="align-middle">
<a class="action_href btn btn-outline-primary float-right" dval-m-href="'/minecraft-pay/users/' + user.ID">&gt;&gt;</a>
</td>
</tr>
</tbody>
</table>

+ 23
- 23
mithril/lang/de.json Zobrazit soubor

@@ -1,24 +1,24 @@
{
"Minecraft Users": "Minecraft Benutzer",
"Credit": "Gutschrift",
"Transactions": "Transaktionen",
"Grant right": "Recht gewähren",
"Create server": "Server anlegen",
"Domain": "Domäne",
"Server-Path": "Server-Pfad",
"Price/Month": "Preis/Monat",
"Price/Month (Limit)": "Preis/Monat (Limit)",
"Settings": "Einstellungen",
"Delete server": "Server löschen",
"Do you really want to delete this server?": "Willst du diesen Server wirklich löschen?",
"Yes": "Ja",
"No": "Nein",
"User": "Benutzer",
"Amount": "Menge",
"Comment": "Kommentar",
"Mark as Minecraft Payment User": "Als Minecraft Payment Nutzer markieren",
"Date": "Datum",
"Account": "Konto-Stand",
"-- Please select --": "-- Bitte auswählen --",
"Add Minecraft User": "Minecraft Benutzer hinzufügen"
{
"Minecraft Users": "Minecraft Benutzer",
"Credit": "Gutschrift",
"Transactions": "Transaktionen",
"Grant right": "Recht gewähren",
"Create server": "Server anlegen",
"Domain": "Domäne",
"Server-Path": "Server-Pfad",
"Price/Month": "Preis/Monat",
"Price/Month (Limit)": "Preis/Monat (Limit)",
"Settings": "Einstellungen",
"Delete server": "Server löschen",
"Do you really want to delete this server?": "Willst du diesen Server wirklich löschen?",
"Yes": "Ja",
"No": "Nein",
"User": "Benutzer",
"Amount": "Menge",
"Comment": "Kommentar",
"Mark as Minecraft Payment User": "Als Minecraft Payment Nutzer markieren",
"Date": "Datum",
"Account": "Konto-Stand",
"-- Please select --": "-- Bitte auswählen --",
"Add Minecraft User": "Minecraft Benutzer hinzufügen"
}

+ 77
- 77
mithril/services/MinecraftPayService.ts Zobrazit soubor

@@ -1,78 +1,78 @@
/// <reference path="../../../../assets/plugins/mithril/mithril/generated/APIRequestImports.d.ts" />
// MLQRequire: { "Type": "API", "Name": "MinecraftPayAPI" }
// MLQRequire: { "Plugin": "Mithril", "Type": "Component", "Name": "Toasts" }
class MinecraftPayService {
public static INSTANCE: MinecraftPayService = new MinecraftPayService();
public static Servers: MinecraftServer[] = [];
public static Users: MinecraftUser[] = [];
public static UserAccounts: MinecraftUserAccount[] = [];
private constructor() {
LoadQueue.Start( () => {
MinecraftPayAPI.GetAllServers().then( s => MinecraftPayService.Servers = s || [] );
MinecraftPayAPI.GetAllUsers().then( u => MinecraftPayService.Users = u || [] );
MinecraftPayAPI.GetAllCharges().then( mua => MinecraftPayService.UserAccounts = mua || [] );
} );
}
public static RefreshCharges() {
LoadQueue.Start( () => {
MinecraftPayAPI.GetAllCharges().then( mua => MinecraftPayService.UserAccounts = mua || [] );
} );
}
public static CreateServer( server: MinecraftServer ) {
MinecraftPayAPI.AddServer( { post: { server } } ).then( r => {
if ( r.Success ) {
this.Servers.push( r.Obj );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
public static UpdateServer( id: number, server: MinecraftServer ) {
MinecraftPayAPI.UpdateServer( { post: { server }, params: { id } } ).then( r => {
if ( r.Success ) {
this.Servers[ this.Servers.findIndex( o => o.ID === r.Obj.ID ) ] = r.Obj;
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
public static DeleteServer( id: number ) {
MinecraftPayAPI.DeleteServer( { params: { id } } ).then( r => {
if ( r.Success ) {
this.Servers.splice( this.Servers.findIndex( o => o.ID === id ), 1 );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
public static CreateUser( user: MinecraftUser ) {
MinecraftPayAPI.AddUser( { post: { user } } ).then( r => {
if ( r.Success ) {
this.Users.push( r.Obj );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
// public static UpdateUser( id: number, user: MinecraftUser ) {
// MinecraftPayAPI.UpdateUser( { post: { user }, params: { id } } ).then( r => {
// if ( r.Success ) {
// this.Users[ this.Users.findIndex( o => o.ID === r.Obj.ID ) ] = r.Obj;
// }
// Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
// } );
// }
public static DeleteUser( id: number ) {
MinecraftPayAPI.DeleteUser( { params: { id } } ).then( r => {
if ( r.Success ) {
this.Users.splice( this.Users.findIndex( o => o.ID === id ), 1 );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
/// <reference path="../../../../assets/plugins/mithril/mithril/generated/APIRequestImports.d.ts" />
// MLQRequire: { "Type": "API", "Name": "MinecraftPayAPI" }
// MLQRequire: { "Plugin": "Mithril", "Type": "Component", "Name": "Toasts" }
class MinecraftPayService {
public static INSTANCE: MinecraftPayService = new MinecraftPayService();
public static Servers: MinecraftServer[] = [];
public static Users: MinecraftUser[] = [];
public static UserAccounts: MinecraftUserAccount[] = [];
private constructor() {
LoadQueue.Start( () => {
MinecraftPayAPI.GetAllServers().then( s => MinecraftPayService.Servers = s || [] );
MinecraftPayAPI.GetAllUsers().then( u => MinecraftPayService.Users = u || [] );
MinecraftPayAPI.GetAllCharges().then( mua => MinecraftPayService.UserAccounts = mua || [] );
} );
}
public static RefreshCharges() {
LoadQueue.Start( () => {
MinecraftPayAPI.GetAllCharges().then( mua => MinecraftPayService.UserAccounts = mua || [] );
} );
}
public static CreateServer( server: MinecraftServer ) {
MinecraftPayAPI.AddServer( { post: { server } } ).then( r => {
if ( r.Success ) {
this.Servers.push( r.Obj );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
public static UpdateServer( id: number, server: MinecraftServer ) {
MinecraftPayAPI.UpdateServer( { post: { server }, params: { id } } ).then( r => {
if ( r.Success ) {
this.Servers[ this.Servers.findIndex( o => o.ID === r.Obj.ID ) ] = r.Obj;
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
public static DeleteServer( id: number ) {
MinecraftPayAPI.DeleteServer( { params: { id } } ).then( r => {
if ( r.Success ) {
this.Servers.splice( this.Servers.findIndex( o => o.ID === id ), 1 );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
public static CreateUser( user: MinecraftUser ) {
MinecraftPayAPI.AddUser( { post: { user } } ).then( r => {
if ( r.Success ) {
this.Users.push( r.Obj );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
// public static UpdateUser( id: number, user: MinecraftUser ) {
// MinecraftPayAPI.UpdateUser( { post: { user }, params: { id } } ).then( r => {
// if ( r.Success ) {
// this.Users[ this.Users.findIndex( o => o.ID === r.Obj.ID ) ] = r.Obj;
// }
// Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
// } );
// }
public static DeleteUser( id: number ) {
MinecraftPayAPI.DeleteUser( { params: { id } } ).then( r => {
if ( r.Success ) {
this.Users.splice( this.Users.findIndex( o => o.ID === id ), 1 );
}
Toasts.Messaged( r.Message, Toast.Load( { Type: r.Success ? 'success' : 'danger' } ) );
} );
}
}

+ 4
- 2
orm_schemas/MinecraftMonthPaid.class.php Zobrazit soubor

@@ -1,9 +1,11 @@
<?php

/**
* @Name minecraft_month_paid
* @Name minecraft_month_paid
* @Unique Month, Year
*/
class MinecraftMonthPaid extends Entity {
class MinecraftMonthPaid extends Entity
{
/**
* @DB-Column
* @Name ID

+ 36
- 22
orm_schemas/MinecraftServer.class.php Zobrazit soubor

@@ -1,10 +1,12 @@
<?php

/**
* @Name minecraft_server
* @Name minecraft_server
* @Unique Name
* @Unique Domain, Port
*/
class MinecraftServer extends Entity {
class MinecraftServer extends Entity
{
/**
* @DB-Column
* @Name ID
@@ -57,47 +59,52 @@ class MinecraftServer extends Entity {
* @Type INT(4)
*/
public $MaxPerMonthPrice = null;
/**
* @DB-Relation
* @Field ID
* @FieldName SubscriptionID
* @OneToMany
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var MinecraftServerSubscription[]
*/
/**
* @DB-Relation
* @Field ID
* @FieldName SubscriptionID
* @OneToMany
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var MinecraftServerSubscription[]
*/
public $Subscriptions;

public function IsUnlocked( MinecraftUser $user ): bool {
public function IsUnlocked( MinecraftUser $user ): bool
{
return in_array( strtolower( $user->GetUsername() ), $this->GetWhitelistedNames() );
}

private $RCon = null;

private function GetRCon() {
private function GetRCon()
{
if ( $this->RCon == null ) $this->RCon = new Rcon( $this->GetDomain(), $this->GetPort(), $this->GetPassword(), 1500 );
return $this->RCon;
}

public function Unlock( MinecraftUser $user, bool $keepOpen = false ): bool {
public function Unlock( MinecraftUser $user, bool $keepOpen = false ): bool
{
$rcon = $this->GetRCon();
if ( !$rcon->isConnected() ) $rcon->connect();
$rcon->sendCommand( 'whitelist add ' . $user->GetUsername() );
$res = $rcon->getResponse();
if ( !$keepOpen ) $rcon->disconnect();
if ( !$keepOpen ) $rcon->disconnect();
return $this->IsUnlocked( $user );
}

public function Lock( MinecraftUser $user, bool $keepOpen = false ): bool {
public function Lock( MinecraftUser $user, bool $keepOpen = false ): bool
{
$rcon = $this->GetRCon();
if ( !$rcon->isConnected() ) $rcon->connect();
$rcon->sendCommand( 'whitelist remove ' . $user->GetUsername() );
$res = $rcon->getResponse();
if ( !$keepOpen ) $rcon->disconnect();
if ( !$keepOpen ) $rcon->disconnect();
return !$this->IsUnlocked( $user );
}

public function GetWhitelistedNames( bool $keepOpen = false ) {
public function GetWhitelistedNames( bool $keepOpen = false )
{
// There are 1 whitelisted players: DragonSkills99
$rcon = $this->GetRCon();
if ( !$rcon->isConnected() ) $rcon->connect();
@@ -112,19 +119,26 @@ class MinecraftServer extends Entity {
else return $players;
}

public function ClearWhitelist( int $tries = 3 ) {
public function ClearWhitelist( int $tries = 3 )
{
$rcon = $this->GetRCon();
$players = $this->GetWhitelistedNames( true );
if ( !count( $players ) ) { $rcon->disconnect(); return true; }
if ( !count( $players ) ) {
$rcon->disconnect();
return true;
}

foreach( $players as $player ) {
foreach ( $players as $player ) {
$rcon->sendCommand( "whitelist remove $player" );
}

$nplayers = $this->GetWhitelistedNames( true );
if ( count( $nplayers ) ) {
if ( $tries > 0 ) $this->ClearWhitelist( $tries - 1 );
else { $rcon->disconnect(); return false; }
else {
$rcon->disconnect();
return false;
}
}
$rcon->disconnect();
return true;

+ 23
- 21
orm_schemas/MinecraftServerSubscription.class.php Zobrazit soubor

@@ -1,8 +1,10 @@
<?php

/**
* @Name minecraft_server_subscription
*/
class MinecraftServerSubscription extends Entity {
class MinecraftServerSubscription extends Entity
{
/**
* @DB-Column
* @Name ID
@@ -12,31 +14,31 @@ class MinecraftServerSubscription extends Entity {
* @NotNull
*/
public $ID;
/**
* @DB-Relation
* @Field ID
* @FieldName ConcerningServerID
* @ManyToOne
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var MinecraftServer
*/
/**
* @DB-Relation
* @Field ID
* @FieldName ConcerningServerID
* @ManyToOne
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var MinecraftServer
*/
public $ConcerningServer;
/**
* @DB-Relation
* @Field ID
* @FieldName UnlockedUserID
* @ManyToOne
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var MinecraftUser
*/
/**
* @DB-Relation
* @Field ID
* @FieldName UnlockedUserID
* @ManyToOne
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var MinecraftUser
*/
public $UnlockedUser;
/**
* @DB-Column
* @Name SubscriptionDate
* @Name SubscriptionDate
* @Default CURRENT_TIMESTAMP
* @Type TIMESTAMP
* @Type TIMESTAMP
* @NotNull
*/
public $SubscriptionDate;

+ 27
- 23
orm_schemas/MinecraftUser.class.php Zobrazit soubor

@@ -1,9 +1,11 @@
<?php

/**
* @Name minecraft_user
* @Name minecraft_user
* @Unique Username
*/
class MinecraftUser extends Entity {
class MinecraftUser extends Entity
{
/**
* @DB-Column
* @Name ID
@@ -22,32 +24,34 @@ class MinecraftUser extends Entity {
* @Pattern-Missmatch-Comment [ 'de' => 'Der Benutzername ist nur 3-16 Zeichen lang und enth&auml;lt a-z, A-Z, 0-9, _', 'en' => 'The Username is only 3-16 chars long and contains only a-z, A-Z, 0-9, _' ]
*/
public $Username;
/**
* @DB-Relation
* @Field ID
* @FieldName SubscriptionID
* @OneToMany
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var MinecraftServer[]
*/
/**
* @DB-Relation
* @Field ID
* @FieldName SubscriptionID
* @OneToMany
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var MinecraftServer[]
*/
public $Subscriptions;
/**
* @DB-Relation
* @Field ID
* @FieldName OwnerID
* @ManyToOne
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var User
*/
/**
* @DB-Relation
* @Field ID
* @FieldName OwnerID
* @ManyToOne
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var User
*/
public $Owner;

public function HasSubscripted( MinecraftServer $server ) {
$f = date( 'Y-m-01' ); $l = date( 'Y-m-t' );
public function HasSubscripted( MinecraftServer $server )
{
$f = date( 'Y-m-01' );
$l = date( 'Y-m-t' );
$uid = $this->GetID();
$sid = $server->GetID();
$earlier = MinecraftServerSubscription::GetAll( "SubscriptionDate BETWEEN '$f' AND '$l' AND UnlockedUserID = $uid AND ConcerningServerID = $sid" );
return !!count( $earlier );
return ! !count( $earlier );
}
}

+ 16
- 13
orm_schemas/MinecraftUserAccount.class.php Zobrazit soubor

@@ -1,8 +1,10 @@
<?php

/**
* @Name minecraft_user_account
*/
class MinecraftUserAccount extends Entity {
class MinecraftUserAccount extends Entity
{
/**
* @DB-Column
* @Name ID
@@ -25,26 +27,27 @@ class MinecraftUserAccount extends Entity {
* @Type TEXT
*/
public $Comment;
/**
* @DB-Relation
* @Field ID
* @FieldName DebtorID
* @ManyToOne
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var User
*/
/**
* @DB-Relation
* @Field ID
* @FieldName DebtorID
* @ManyToOne
* @OnUpdate CASCADE
* @OnDelete CASCADE
* @var User
*/
public $Debtor;
/**
* @DB-Column
* @Name Occurence
* @Type TIMESTAMP
* @Name Occurence
* @Type TIMESTAMP
* @Default CURRENT_TIMESTAMP
* @NotNull
*/
public $Occurence;

public static function ACCOUNT() {
public static function ACCOUNT()
{
if ( User::ONLINE() ) return defaulted( MinecraftUserAccount::SUM( 'Modifier', [ 'DebtorID' => User::CURRENT()->ID ] ), '0' );
return '0';
}

+ 1
- 1
templates/Account.Template.php Zobrazit soubor

@@ -1,4 +1,4 @@
<meta log-in />
<meta log-in/>
<div style="width: 100%; text-align: right; border: 1px solid white; border-radius: 1rem; padding: 1rem; margin: 1rem 0; box-sizing: border-box;">
<span>Account: <a eval-innerText="MinecraftUserAccount::ACCOUNT() . ' &euro;'"></a></span>
</div>

Načítá se…
Zrušit
Uložit