Serving a payment option for my minecraft server so I don't have to pay for it all alone
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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. }