Serving a payment option for my minecraft server so I don't have to pay for it all alone
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

Plugin.php 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. class MinecraftPaymentPlugin extends Plugin {
  3. public static function get_plugin_name(): string {
  4. return 'Minecraft-Payment';
  5. }
  6. public function __construct( $_DB ) {
  7. $this->require_class( 'RCon' );
  8. }
  9. public function has_page(): bool {
  10. return true;
  11. }
  12. public function get_page_path() {
  13. return [
  14. '/minecraft-pay/settle' => 'settle_view'
  15. ];
  16. }
  17. public function pre_load_plugin(): void {
  18. $this->register_component_short( 'SettingsList' );
  19. $this->add_route( '/minecraft-pay/settings', 'SettingsList' );
  20. $this->register_component_short( 'Settings' );
  21. $this->add_route( '/minecraft-pay/settings/:id', 'Settings' );
  22. $this->register_component_short( 'UsersList' );
  23. $this->add_route( '/minecraft-pay/users', 'UsersList' );
  24. $this->register_component_short( 'MinecraftUsers' );
  25. $this->add_route( '/minecraft-pay/users/:id', 'MinecraftUsers' );
  26. $this->register_component_short( 'AlterAccount' );
  27. $this->add_route( '/minecraft-pay/acredit', 'AlterAccount' );
  28. $this->register_component_short( 'AccountList' );
  29. $this->add_route( '/minecraft-pay/balance', 'AccountList' );
  30. $this->register_component_short( 'GrantUser' );
  31. $this->add_route( '/minecraft-pay/grant', 'GrantUser' );
  32. $this->require_class( 'MinecraftPayAPI' );
  33. API::REGISTER_CLASS( new MinecraftPayAPI(), 3, 'minecraft-pay/' );
  34. }
  35. private function settle( $m, $y ) {
  36. $mp = MinecraftMonthPaid::GetByUnique( 0, $m ,$y );
  37. if ( $mp ) {
  38. echo __( [ 'de' => 'Bereits abgerechnet', 'en' => 'Already settled' ] );
  39. return;
  40. }
  41. $sum = 0;
  42. foreach ( MinecraftServer::GetAll() as $server ) {
  43. $m = strlen( $m ) == 2 ? $m : '0' . $m;
  44. $f = "$y-$m-01";
  45. $cap = date( 't', strtotime( $f ) );
  46. $l = "$y-$m-$cap";
  47. $sid = $server->ID;
  48. $subscribers = MinecraftServerSubscription::GetAll( "ConcerningServerID = $sid AND SubscriptionDate BETWEEN '$f' AND '$l'" );
  49. $subsCount = count( $subscribers );
  50. $pot = $subsCount * $server->GetPerMonthPrice();
  51. $potPart = ceil( ( $pot / $subsCount ) * 100 ) / 100;
  52. if ( $pot == 0 ) continue;
  53. $potPart *= -1;
  54. if ( $pot > $server->GetMaxPerMonthPrice() ) $pot = $server->GetMaxPerMonthPrice();
  55. $sum += $pot;
  56. /* $dayssum = 0;
  57. $subs = [];
  58. $sum += $pot;
  59. $potheap = 0;
  60. $dayssumheap = 0;
  61. foreach( $subscribers as $subscriber ) {
  62. $days = date( 'd', strtotime( $subscriber->GetSubscriptionDate() ) );
  63. $dayssum += $days;
  64. $subs[] = [ $days, $subscriber ];
  65. }
  66. foreach ( $subs as $subscription ) {
  67. $price = $pot * ( $dayssum / $subscription[ 0 ] )
  68. }*/
  69. foreach( $subscribers as $subscriber ) {
  70. $u = $subscriber->GetUnlockedUser()->GetOwner();
  71. $ac = new MinecraftUserAccount();
  72. $ac->SetMod( $potPart );
  73. $ac->SetDebtor( $u );
  74. $ac->SetComment( 'Host-Relief for ' . $server->GetName() . ' for ' . $m . '-' . $y );
  75. $ac->Save();
  76. }
  77. $server->ClearWhitelist();
  78. }
  79. $mp = new MinecraftMonthPaid();
  80. $mp->SetAmount( $sum );
  81. $mp->SetMonth( $m );
  82. $mp->SetYear( $y );
  83. if ( $mp->Save() ) {
  84. echo __( [ 'de' => 'Abrechnung beendet', 'en' => 'Settled' ] );
  85. }
  86. }
  87. public function settle_view( string $url ) {
  88. // ORDER BY Year DESC, Month DESC LIMIT 1
  89. $nwst = MinecraftMonthPaid::GetAll( "1 ORDER BY Year DESC, Month DESC LIMIT 1" )[ 0 ];
  90. if ( !$nwst ) {
  91. $nwst = new MinecraftMonthPaid();
  92. $nwst->SetMonth( date( 'm' ) );
  93. $nwst->SetYear( date( 'Y' ) );
  94. }
  95. $m = array_key_exists( 'month', $_GET ) ? $_GET[ 'month' ] + 1 : date( 'm' );
  96. $y = array_key_exists( 'year', $_GET ) ? $_GET[ 'year' ] : date( 'Y' );
  97. if ( $m == '0' ) { $m = '12'; $y--; }
  98. $start = ( new DateTime( $nwst->GetYear() . '-' . $nwst->GetMonth() . '-' . '01' ) )->modify( 'first day of next month' );
  99. $end = ( new DateTime( date( "$y-$m-01" ) ) )->modify( 'first day of this month' );
  100. $interval = DateInterval::createFromDateString( '1 month' );
  101. $period = new DatePeriod( $start, $interval, $end );
  102. $settled = false;
  103. foreach ($period as $dt) {
  104. $settled = true;
  105. echo 'Settling ' . $dt->format("Y-m") . ': ';
  106. $this->settle( $dt->format( 'm' ), $dt->format( 'Y' ) );
  107. echo "<br>\n";
  108. }
  109. if( !$settled ) {
  110. echo 'Nothing to settle';
  111. }
  112. }
  113. public function load_plugin(): void {
  114. if ( is_null( Permission::GetByUnique( 0, 'Minecraft-Pay-Settings' ) ) ) {
  115. $p = Permission::FromArray( [], [] );
  116. $p->SetName( 'Minecraft-Pay-Settings' );
  117. $p->SetSlug( slugify( 'Minecraft-Pay-Settings' ) );
  118. $p->Save();
  119. }
  120. if ( is_null( Permission::GetByUnique( 0, 'Minecraft-Possess-User' ) ) ) {
  121. $p = Permission::FromArray( [], [] );
  122. $p->SetName( 'Minecraft-Possess-User' );
  123. $p->SetSlug( slugify( 'Minecraft-Possess-User' ) );
  124. $p->Save();
  125. }
  126. if ( User::ONLINE() && Permission::PERMITTED( 'Minecraft-Possess-User' ) ) {
  127. $me = new MenuEntry( 'Minecraft Payment' );
  128. $me->addImageFromResource( 'minecraft.svg', MinecraftPaymentPlugin::get_plugin_name() );
  129. $me->setFilter( 'none' );
  130. if ( Permission::PERMITTED( 'Minecraft-Pay-Settings' ) ) {
  131. $sub = new MenuEntry( 'Minecraft Payment', HOME_URL . 'minecraft-pay/settings' );
  132. $sub->addImageFromResource( 'settings.svg', Plugin_Plugin::get_plugin_name() );
  133. $me->addSubEntry( $sub );
  134. }
  135. $sub = new MenuEntry( [ 'de' => 'Minecraft Benutzer', 'en' => 'Minecraft Users' ], HOME_URL . 'minecraft-pay/users' );
  136. $sub->addImageFromResource( 'users.svg', UserManager_Plugin::get_plugin_name() );
  137. $me->addSubEntry( $sub );
  138. if ( Permission::PERMITTED( 'Minecraft-Pay-Settings' ) ) {
  139. $sub = new MenuEntry( [ 'de' => 'Gutschrift', 'en' => 'Credit' ], HOME_URL . 'minecraft-pay/acredit' );
  140. $sub->addImageFromResource( 'cash.svg', MinecraftPaymentPlugin::get_plugin_name() );
  141. $me->addSubEntry( $sub );
  142. }
  143. $sub = new MenuEntry( [ 'de' => 'Transaktionen', 'en' => 'Transactions' ], HOME_URL . 'minecraft-pay/balance' );
  144. $sub->addImageFromResource( 'cash.svg', MinecraftPaymentPlugin::get_plugin_name() );
  145. $me->addSubEntry( $sub );
  146. if ( Permission::PERMITTED( 'Minecraft-Pay-Settings' ) ) {
  147. $sub = new MenuEntry( [ 'de' => 'Recht gew&auml;hren', 'en' => 'Grant right' ], HOME_URL . 'minecraft-pay/grant' );
  148. $sub->addImageFromResource( 'key.svg', MinecraftPaymentPlugin::get_plugin_name() );
  149. $me->addSubEntry( $sub );
  150. };
  151. SideMenu::addMainMenuEntry( $me );
  152. }
  153. }
  154. }