From 43c197316ae7077b44a475e2429c1a0174e407c9 Mon Sep 17 00:00:00 2001 From: slawkens Date: Fri, 3 Feb 2023 14:39:09 +0100 Subject: [PATCH] feature: mail confirmed reward Suggested by @EPuncker --- .gitignore | 2 ++ config.php | 9 ++++++- plugins/email-confirmed-reward.json | 17 ++++++++++++ plugins/email-confirmed-reward/reward.php | 33 +++++++++++++++++++++++ system/hooks.php | 3 ++- system/pages/account/confirm_email.php | 10 +++++++ 6 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 plugins/email-confirmed-reward.json create mode 100644 plugins/email-confirmed-reward/reward.php diff --git a/.gitignore b/.gitignore index 0cf55168..b2eb49c9 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,8 @@ plugins/* !plugins/example.json !plugins/account-create-hint.json !plugins/account-create-hint +!plugins/email-confirmed-reward.json +!plugins/email-confirmed-reward landing # others/rest diff --git a/config.php b/config.php index 65f811e0..9fb0fc4d 100644 --- a/config.php +++ b/config.php @@ -93,7 +93,14 @@ $config = array( 'account_management' => true, // disable if you're using other method to manage users (fe. tfs account manager) 'account_create_auto_login' => false, // auto login after creating account? 'account_create_character_create' => true, // allow directly to create character on create account page? - 'account_mail_verify' => false, // force users to confirm their email addresses when registering account + 'account_mail_verify' => false, // force users to confirm their email addresses when registering + 'account_mail_confirmed_reward' => [ // reward users for confirming their E-Mails + // account_mail_verify needs to be enabled too + 'premium_days' => 0, + 'premium_points' => 0, + 'coins' => 0, + 'message' => 'You received %d %s for confirming your E-Mail address.' // example: You received 20 premium points for confirming your E-Mail address. + ], 'account_mail_unique' => true, // email addresses cannot be duplicated? (one account = one email) 'account_premium_days' => 0, // default premium days on new account 'account_premium_points' => 0, // default premium points on new account diff --git a/plugins/email-confirmed-reward.json b/plugins/email-confirmed-reward.json new file mode 100644 index 00000000..b1ae4cc1 --- /dev/null +++ b/plugins/email-confirmed-reward.json @@ -0,0 +1,17 @@ +{ + "name": "EMail Confirmed Reward", + "description": "Reward users for confirming their E-Mail.", + "version": "1.0", + "author": "MyAAC Authors", + "contact": "www.my-aac.org", + "hooks": { + "mail-confirmed-reward": { + "type": "EMAIL_CONFIRMED", + "file": "plugins/email-confirmed-reward/reward.php" + } + }, + "uninstall": [ + "plugins/email-confirmed-reward.json", + "plugins/email-confirmed-reward" + ] +} diff --git a/plugins/email-confirmed-reward/reward.php b/plugins/email-confirmed-reward/reward.php new file mode 100644 index 00000000..107ab8d7 --- /dev/null +++ b/plugins/email-confirmed-reward/reward.php @@ -0,0 +1,33 @@ +hasColumn('accounts', 'coins'); +if ($reward['coins'] > 0 && $hasCoinsColumn) { + log_append('email_confirm_error.log', 'accounts.coins column does not exist.'); +} + +if (!isset($account) || !$account->isLoaded()) { + log_append('email_confirm_error.log', 'Account not loaded.'); + return; +} + +if ($reward['premium_points'] > 0) { + $account->setCustomField('premium_points', (int)$account->getCustomField('premium_points') + $reward['premium_points']); + + success(sprintf($reward['message'], $reward['premium_points'], 'premium points')); +} + +if ($reward['coins'] > 0 && $hasCoinsColumn) { + $account->setCustomField('coins', (int)$account->getCustomField('coins') + $reward['coins']); + + success(sprintf($reward['message'], $reward['coins'], 'coins')); +} + +if ($reward['premium_days'] > 0) { + $account->setPremDays($account->getPremDays() + $reward['premium_days']); + $account->save(); + + success(sprintf($reward['message'], $reward['premium_days'], 'premium days')); +} diff --git a/system/hooks.php b/system/hooks.php index c84e5e30..e69febfa 100644 --- a/system/hooks.php +++ b/system/hooks.php @@ -43,8 +43,9 @@ define('HOOK_ACCOUNT_CREATE_AFTER_TOWNS', 31); define('HOOK_ACCOUNT_CREATE_BEFORE_SUBMIT_BUTTON', 32); define('HOOK_ACCOUNT_CREATE_AFTER_FORM', 33); define('HOOK_ACCOUNT_CREATE_AFTER_SUBMIT', 34); +define('HOOK_EMAIL_CONFIRMED', 35); define('HOOK_FIRST', HOOK_STARTUP); -define('HOOK_LAST', HOOK_ACCOUNT_CREATE_AFTER_SUBMIT); +define('HOOK_LAST', HOOK_EMAIL_CONFIRMED); require_once LIBS . 'plugins.php'; class Hook diff --git a/system/pages/account/confirm_email.php b/system/pages/account/confirm_email.php index 078ba324..7de7fb4a 100644 --- a/system/pages/account/confirm_email.php +++ b/system/pages/account/confirm_email.php @@ -23,6 +23,16 @@ if(!$res->rowCount()) { } else { + $query = $db->query('SELECT id FROM accounts WHERE email_hash = ' . $db->quote($hash) . ' AND email_verified = 0'); + if ($query->rowCount() == 1) { + $query = $query->fetch(PDO::FETCH_ASSOC); + $account = new OTS_Account(); + $account->load($query['id']); + if ($account->isLoaded()) { + $hooks->trigger(HOOK_EMAIL_CONFIRMED, ['account' => $account]); + } + } + $db->update('accounts', array('email_verified' => '1'), array('email_hash' => $hash)); success('You have now verified your e-mail, this will increase the security of your account. Thank you for doing this.'); }