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 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  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/' => [
  15. 'settings' => [
  16. null => 'settings_view',
  17. '/*' => 'server_settings_view'
  18. ],
  19. 'users' => [
  20. null => 'users_view',
  21. '/*' => 'user_view'
  22. ],
  23. 'grant' => 'grant_view',
  24. 'settle' => 'settle_view',
  25. 'balance' => 'balance_view',
  26. 'acredit' => 'acredit_view'
  27. ]
  28. ];
  29. // return [ '/minecraft-pay/settings', '/minecraft-pay/settings/*', '/minecraft-pay/users', '/minecraft-pay/grant', '/minecraft-pay/settle', '/minecraft-pay/balance', '/minecraft-pay/users/*', '/minecraft-pay/acredit' ];
  30. }
  31. public function grant_view( string $url ) {
  32. if ( !Permission::PERMITTED( 'Minecraft-Pay-Settings', 1 ) ) return;
  33. $params = [];
  34. if ( array_key_exists( 'GrantUserRights', $_POST ) && array_key_exists( 'ID', $_POST ) ) {
  35. $u = User::GetByID( $_POST[ 'ID' ] );
  36. $s = false;
  37. if ( !is_null( $u ) ) {
  38. $p = Permission::SEARCH( 'Minecraft-Possess-User' );
  39. $s = $p->grant_user( $u->GetID(), true ); $s = true;
  40. // echo $p;
  41. // echo $s;
  42. $params[ 'save_message' ] =
  43. // $s ?
  44. __( [ 'de' => 'Recht erfolgreich gew&auml;hrt', 'en' => 'Right granted successfully' ] ); // :
  45. // __( [ 'de' => 'Recht konnte nicht gew&auml;hrt werden', 'en' => 'Right could not be granted' ] );
  46. }
  47. else $params[ 'save_message' ] = __( [ 'de' => 'Benutzer nicht gefunden', 'en' => 'Could not find user' ] );
  48. $params[ 'save_success' ] = $s;
  49. }
  50. $this->show_template( 'GrantUser', $params );
  51. }
  52. public function settle_view( string $url ) {
  53. $m = array_key_exists( 'month', $_GET ) ? $_GET[ 'month' ] : date( 'm' ) - 1;
  54. $y = array_key_exists( 'month', $_GET ) ? $_GET[ 'month' ] : date( 'Y' );
  55. if ( $m == '0' ) { $m = '12'; $y--; }
  56. $mp = MinecraftMonthPaid::GetByUnique( 0, $m ,$y );
  57. if ( $mp ) {
  58. echo __( [ 'de' => 'Bereits abgerechnet', 'en' => 'Already settled' ] );
  59. return;
  60. }
  61. $sum = 0;
  62. foreach ( MinecraftServer::GetAll() as $server ) {
  63. $m = strlen( $m ) == 2 ? $m : '0' . $m;
  64. $f = "$y-$m-01";
  65. $cap = date( 't', strtotime( $f ) );
  66. $l = "$y-$m-$cap";
  67. $sid = $server->ID;
  68. $subscribers = MinecraftServerSubscription::GetAll( "ConcerningServerID = $sid AND SubscriptionDate BETWEEN '$f' AND '$l'" );
  69. $subsCount = count( $subscribers );
  70. $pot = $subsCount * $server->GetPerMonthPrice();
  71. $potPart = ceil( ( $pot / $subsCount ) * 100 ) / 100;
  72. if ( $pot == 0 ) continue;
  73. $potPart *= -1;
  74. if ( $pot > $server->GetMaxPerMonthPrice() ) $pot = $server->GetMaxPerMonthPrice();
  75. $sum += $pot;
  76. /* $dayssum = 0;
  77. $subs = [];
  78. $sum += $pot;
  79. $potheap = 0;
  80. $dayssumheap = 0;
  81. foreach( $subscribers as $subscriber ) {
  82. $days = date( 'd', strtotime( $subscriber->GetSubscriptionDate() ) );
  83. $dayssum += $days;
  84. $subs[] = [ $days, $subscriber ];
  85. }
  86. foreach ( $subs as $subscription ) {
  87. $price = $pot * ( $dayssum / $subscription[ 0 ] )
  88. }*/
  89. foreach( $subscribers as $subscriber ) {
  90. $u = $subscriber->GetUnlockedUser()->GetOwner();
  91. $ac = new MinecraftUserAccount();
  92. $ac->SetMod( $potPart );
  93. $ac->SetDebtor( $u );
  94. $ac->SetComment( 'Host-Relief for ' . $server->GetName() . ' for ' . $m . '-' . $y );
  95. $ac->Save();
  96. }
  97. $server->ClearWhitelist();
  98. }
  99. $mp = new MinecraftMonthPaid();
  100. $mp->SetAmount( $sum );
  101. $mp->SetMonth( $m );
  102. $mp->SetYear( $y );
  103. if ( $mp->Save() ) {
  104. echo __( [ 'de' => 'Abrechnung beendet', 'en' => 'Settled' ] );
  105. }
  106. }
  107. public function acredit_view( string $url ) {
  108. if ( !Permission::PERMITTED( 'Minecraft-Pay-Settings', 1 ) ) return;
  109. $params = null;
  110. if (
  111. array_key_exists( 'AddAccountChange', $_POST ) &&
  112. array_key_exists( 'Mod', $_POST ) &&
  113. array_key_exists( 'DebtorID', $_POST ) &&
  114. array_key_exists( 'Comment', $_POST )
  115. ) {
  116. $ac = MinecraftUserAccount::FromPropertyArray( $_POST );
  117. $ac->SetDebtor( User::GetByID( $_POST[ 'DebtorID' ] ) );
  118. $params = [];
  119. $params[ 'save_success' ] = $ac->Save();
  120. $params[ 'save_message' ] =
  121. $params[ 'save_success' ] ?
  122. __( [ 'de' => 'Gutschrift erfolgreich', 'en' => 'Credit successful' ] ) :
  123. __( [ 'de' => 'Gutschrift fehlgeschlagen', 'en' => 'Credit failed' ] );
  124. }
  125. $this->show_template( 'AlterAccount', $params );
  126. }
  127. public function balance_view( string $url ) {
  128. if ( !Permission::PERMITTED( 'Minecraft-Possess-User', 1 ) ) return;
  129. $this->show_template( 'AccountList', null );
  130. }
  131. public function users_view( string $url ) {
  132. if ( !Permission::PERMITTED( 'Minecraft-Possess-User', 1 ) ) return;
  133. if ( $url == '/minecraft-pay/users' ) {
  134. $params = [];
  135. if ( array_key_exists( 'CreateMinecraftUser', $_POST ) && array_key_exists( 'Username', $_POST ) ) {
  136. $s = MinecraftUser::FromPropertyArray( $_POST );
  137. $s->SetOwner( User::CURRENT() );
  138. try {
  139. $s->Save();
  140. $params[ 'save_message' ] = __( [ 'de' => 'Minecraft Benutzer erfolgreich angelegt', 'en' => 'Created minecraft user successfully' ] );
  141. $params[ 'save_success' ] = true;
  142. } catch( Exception $ex ) {
  143. $params[ 'save_message' ] = $ex->getMessage();
  144. if ( startsWith( $params[ 'save_message' ], 'Duplicate entry' ) )
  145. $params[ 'save_message' ] = __(
  146. [
  147. 'de' => 'Doppelter Name oder es wurde bei einem anderen Server weder Domain noch Port angegeben',
  148. 'en' => 'Duplicated Name or another server has neither domain nor port'
  149. ]
  150. );
  151. $params[ 'save_success' ] = false;
  152. }
  153. }
  154. if ( array_key_exists( 'DeleteMinecraftUser', $_POST ) && array_key_exists( 'ID', $_POST ) ) {
  155. $s = MinecraftUser::GetByID( $_POST[ 'ID' ] );
  156. if ( User::CURRENT()->GetID() != $s->GetOwner()->GetID() ) {
  157. $params[ 'save_message' ] = __( [ 'de' => 'Dieser Benutzer geh&ouml;t Ihnen nicht!', 'en' => 'This user does not belong to you!' ] );
  158. $params[ 'save_success' ] = false;
  159. } else {
  160. try {
  161. $s->Delete();
  162. $params[ 'save_message' ] = __( [ 'de' => 'Minecraft Benutzer erfolgreich gel&ouml;scht', 'en' => 'Deleted minecraft user successfully' ] );
  163. $params[ 'save_success' ] = true;
  164. } catch( Exception $ex ) {
  165. $params[ 'save_message' ] = $ex->getMessage();
  166. $params[ 'save_success' ] = false;
  167. }
  168. }
  169. }
  170. $this->show_template( 'UsersList', $params );
  171. } else $this->user_view( $url );
  172. }
  173. public function user_view( string $url ) {
  174. if ( !Permission::PERMITTED( 'Minecraft-Possess-User', 1 ) ) return;
  175. if ( !preg_match( '/\/minecraft-pay\/users\/([0-9]+)/', $url, $m ) || is_null( MinecraftUser::GetByID( $m[ 1 ] ) ) ) {
  176. Alert::SHOW( __( [ 'de' => 'Dieser Benutzer existiert nicht', 'en' => 'This user does not exist' ] ) );
  177. return;
  178. }
  179. $params = [];
  180. if ( array_key_exists( 'RUnlockUser', $_POST ) && array_key_exists( 'ID', $_POST ) ) {
  181. $s = MinecraftServer::GetByID( $_POST[ 'ID' ] );
  182. $u = MinecraftUser::GetByID( $m[ 1 ] );
  183. if ( is_null( $s ) ) { $params[ 'save_message' ] = __( [ 'de' => 'Unbekannter Server', 'en' => 'Unknown server' ] ); $params[ 'save_success' ] = false; }
  184. else if ( is_null( $u ) ) { $params[ 'save_message' ] = __( [ 'de' => 'Unbekannter Benutzer', 'en' => 'Unknown user' ] ); $params[ 'save_success' ] = false; }
  185. else {
  186. if ( $s->Unlock( $u ) ) {
  187. if ( !$u->HasSubscripted( $s ) ) {
  188. $ms = new MinecraftServerSubscription();
  189. $ms->SetConcerningServer( $s );
  190. $ms->SetUnlockedUser( $u );
  191. $params[ 'save_success' ] = $ms->Save();
  192. $params[ 'save_message' ] =
  193. $params[ 'save_success' ] ?
  194. __( [ 'de' => 'Erfolgreich freigeschaltet', 'en' => 'Unlock successful' ] ) :
  195. __( [ 'de' => 'Freischaltung fehlgeschlagen', 'en' => 'Unlock failed' ] );
  196. if ( !$params[ 'save_success' ] ) $s->Lock( $u );
  197. } else { $params[ 'save_message' ] = __( [ 'de' => 'Erfolgreich freigeschaltet', 'en' => 'Unlock successful' ] ); $params[ 'save_success' ] = true; }
  198. } else { $params[ 'save_message' ] = __( [ 'de' => 'Freischaltung fehlgeschlagen', 'en' => 'Unlock failed' ] ); $params[ 'save_success' ] = false; }
  199. }
  200. }
  201. $params[ 'user' ] = MinecraftUser::GetByID( $m[ 1 ] );
  202. $this->show_template( 'Users', $params );
  203. }
  204. public function settings_view( string $url ) {
  205. if ( !Permission::PERMITTED( 'Minecraft-Pay-Settings', 1 ) ) return;
  206. if ( $url == '/minecraft-pay/settings' ) {
  207. $params = [];
  208. if ( array_key_exists( 'CreateServer', $_POST ) && array_key_exists( 'Name', $_POST ) ) {
  209. $s = MinecraftServer::FromPropertyArray( $_POST );
  210. try {
  211. $s->Save();
  212. $params[ 'save_message' ] = __( [ 'de' => 'Server erfolgreich angelegt', 'en' => 'Created server successfully' ] );
  213. $params[ 'save_success' ] = true;
  214. } catch( Exception $ex ) {
  215. $params[ 'save_message' ] = $ex->getMessage();
  216. if ( startsWith( $params[ 'save_message' ], 'Duplicate entry' ) )
  217. $params[ 'save_message' ] = __(
  218. [
  219. 'de' => 'Doppelter Name oder es wurde bei einem anderen Server weder Domain noch Port angegeben',
  220. 'en' => 'Duplicated Name or another server has neither domain nor port'
  221. ]
  222. );
  223. $params[ 'save_success' ] = false;
  224. }
  225. }
  226. if ( array_key_exists( 'DeleteServer', $_POST ) && array_key_exists( 'ID', $_POST ) ) {
  227. $s = MinecraftServer::FromPropertyArray( $_POST );
  228. try {
  229. $s->Delete();
  230. $params[ 'save_message' ] = __( [ 'de' => 'Server erfolgreich gel&ouml;scht', 'en' => 'Deleted server successfully' ] );
  231. $params[ 'save_success' ] = true;
  232. } catch( Exception $ex ) {
  233. $params[ 'save_message' ] = $ex->getMessage();
  234. $params[ 'save_success' ] = false;
  235. }
  236. }
  237. $this->show_template( 'SettingsList', $params );
  238. }
  239. else $this->server_settings_view( $url );
  240. // $this->show_template( 'Settings', [ 'settings' => (object) [ 'Server' => '', 'Port' => 35575, 'Password' => '' ] ] );
  241. }
  242. public function server_settings_view( string $url ) {
  243. if ( !Permission::PERMITTED( 'Minecraft-Pay-Settings', 1 ) ) return;
  244. if ( !preg_match( '/\/minecraft-pay\/settings\/([0-9]+)/', $url, $m ) || is_null( MinecraftServer::GetByID( $m[ 1 ] ) ) ) {
  245. Alert::SHOW( __( [ 'de' => 'Dieser Server existiert nicht', 'en' => 'This server does not exist' ] ) );
  246. return;
  247. }
  248. $params = [];
  249. if (
  250. array_key_exists( 'SaveServerSettings', $_POST ) &&
  251. array_key_exists( 'Domain', $_POST ) &&
  252. array_key_exists( 'Port', $_POST ) &&
  253. array_key_exists( 'Password', $_POST ) &&
  254. array_key_exists( 'ServerPath', $_POST )
  255. ) {
  256. if ( !$_POST[ 'Port' ] ) $_POST[ 'Port' ] = null;
  257. $o = MinecraftServer::GetByID( $m[ 1 ] );
  258. $s = MinecraftServer::FromPropertyArray( $_POST );
  259. $s->SetID( $o->GetID() );
  260. $s->SetName( $o->GetName() );
  261. try {
  262. $s->Save();
  263. $params[ 'save_message' ] = __( [ 'de' => 'Server erfolgreich gespeichert', 'en' => 'Saved server successfully' ] );
  264. $params[ 'save_success' ] = true;
  265. } catch( Exception $ex ) {
  266. $params[ 'save_message' ] = $ex->getMessage();
  267. if ( startsWith( $params[ 'save_message' ], 'Duplicate entry' ) )
  268. $params[ 'save_message' ] = __(
  269. [
  270. 'de' => 'Doppelte Domain noch Port Kombination',
  271. 'en' => 'Duplicated domain - port combination'
  272. ]
  273. );
  274. $params[ 'save_success' ] = false;
  275. }
  276. }
  277. $params[ 'settings' ] = MinecraftServer::GetByID( $m[ 1 ] );
  278. $this->show_template( 'Settings', $params );
  279. }
  280. public function load_plugin(): void {
  281. if ( is_null( Permission::GetByUnique( 0, 'Minecraft-Pay-Settings' ) ) ) {
  282. $p = Permission::FromArray( [], [] );
  283. $p->SetName( 'Minecraft-Pay-Settings' );
  284. $p->SetSlug( slugify( 'Minecraft-Pay-Settings' ) );
  285. $p->Save();
  286. }
  287. if ( is_null( Permission::GetByUnique( 0, 'Minecraft-Possess-User' ) ) ) {
  288. $p = Permission::FromArray( [], [] );
  289. $p->SetName( 'Minecraft-Possess-User' );
  290. $p->SetSlug( slugify( 'Minecraft-Possess-User' ) );
  291. $p->Save();
  292. }
  293. if ( User::ONLINE() && Permission::PERMITTED( 'Minecraft-Possess-User' ) ) {
  294. $me = new MenuEntry( 'Minecraft Payment' );
  295. $me->addImageFromResource( 'minecraft.svg', MinecraftPaymentPlugin::get_plugin_name() );
  296. $me->setFilter( 'none' );
  297. if ( Permission::PERMITTED( 'Minecraft-Pay-Settings' ) ) {
  298. $sub = new MenuEntry( 'Minecraft Payment', HOME_URL . 'minecraft-pay/settings' );
  299. $sub->addImageFromResource( 'settings.svg', Plugin_Plugin::get_plugin_name() );
  300. $me->addSubEntry( $sub );
  301. }
  302. $sub = new MenuEntry( [ 'de' => 'Minecraft Benutzer', 'en' => 'Minecraft Users' ], HOME_URL . 'minecraft-pay/users' );
  303. $sub->addImageFromResource( 'users.svg', UserManager_Plugin::get_plugin_name() );
  304. $me->addSubEntry( $sub );
  305. if ( Permission::PERMITTED( 'Minecraft-Pay-Settings' ) ) {
  306. $sub = new MenuEntry( [ 'de' => 'Gutschrift', 'en' => 'Credit' ], HOME_URL . 'minecraft-pay/acredit' );
  307. $sub->addImageFromResource( 'cash.svg', MinecraftPaymentPlugin::get_plugin_name() );
  308. $me->addSubEntry( $sub );
  309. }
  310. $sub = new MenuEntry( [ 'de' => 'Transaktionen', 'en' => 'Transactions' ], HOME_URL . 'minecraft-pay/balance' );
  311. $sub->addImageFromResource( 'cash.svg', MinecraftPaymentPlugin::get_plugin_name() );
  312. $me->addSubEntry( $sub );
  313. if ( Permission::PERMITTED( 'Minecraft-Pay-Settings' ) ) {
  314. $sub = new MenuEntry( [ 'de' => 'Recht gew&auml;hren', 'en' => 'Grant right' ], HOME_URL . 'minecraft-pay/grant' );
  315. $sub->addImageFromResource( 'key.svg', MinecraftPaymentPlugin::get_plugin_name() );
  316. $me->addSubEntry( $sub );
  317. };
  318. SideMenu::addMainMenuEntry( $me );
  319. }
  320. }
  321. }