diff --git a/runtime/history/SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2.json b/runtime/history/SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2.json new file mode 100644 index 00000000..426d2fe6 --- /dev/null +++ b/runtime/history/SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "change", + "component": "pvepro-seed-content-homepage", + "started_at_utc": "2026-09-19T21:49:18Z", + "finished_at_utc": "2026-09-19T21:49:57Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "e23c828e3098586a59c75f05b2a5534bd1ce6f3e7107ce5d43b51b48c83bc140", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "change_declared": true, + "result_contract_valid": true, + "result_contract_status": "OK", + "result_contract_error": null, + "command_rc": 0, + "changes_made": true, + "rollback_started": false, + "rollback_restored": null, + "mutation_outcome": "MUTATED", + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "1deadf23cbb20acc036a6c3db39b5a1660f45a50f9b9a63e434d50b11ca922ff", + "sanitized_output_sha256": "1deadf23cbb20acc036a6c3db39b5a1660f45a50f9b9a63e434d50b11ca922ff", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "SEED_CONTENT_PRESTATE_OK=true\nSEED_CHANGE_EXITCODE=0\nSEED_CHANGE_OUTPUT_BEGIN\nSTAGE=SEED_1\nTHREADPROC_RC=0\nSTAGE=SEED_2\nTHREADPROC_RC=0\nSTAGE=SEED_3\nTHREADPROC_RC=0\nSTAGE=SEED_4\nTHREADPROC_RC=0\nSTAGE=SEED_5\nTHREADPROC_RC=0\nSTAGE=SEED_6\nTHREADPROC_RC=0\nSTAGE=SEED_7\nTHREADPROC_RC=0\nSTAGE=SEED_8\nTHREADPROC_RC=0\nSTAGE=SEED_9\nTHREADPROC_RC=0\nSTAGE=SEED_10\nTHREADPROC_RC=0\nSTAGE=SEED_11\nTHREADPROC_RC=0\nSTAGE=SEED_12\nTHREADPROC_RC=0\nSTAGE=SEED_13\nTHREADPROC_RC=0\nSTAGE=SEED_14\nTHREADPROC_RC=0\nSTAGE=SEED_15\nTHREADPROC_RC=0\nSTAGE=SEED_16\nTHREADPROC_RC=0\nSTAGE=SEED_17\nTHREADPROC_RC=0\nSTAGE=SEED_18\nTHREADPROC_RC=0\nSTAGE=SEED_19\nTHREADPROC_RC=0\nSTAGE=SEED_20\nTHREADPROC_RC=0\nSTAGE=SEED_21\nTHREADPROC_RC=0\nSTAGE=SEED_22\nTHREADPROC_RC=0\nSTAGE=SEED_23\nTHREADPROC_RC=0\nSTAGE=SEED_24\nTHREADPROC_RC=0\nSTAGE=SEED_25\nTHREADPROC_RC=0\nSTAGE=SEED_26\nTHREADPROC_RC=0\nSTAGE=SEED_27\nTHREADPROC_RC=0\nSTAGE=SEED_28\nTHREADPROC_RC=0\nSTAGE=SEED_29\nTHREADPROC_RC=0\nSTAGE=SEED_30\nTHREADPROC_RC=0\nSTAGE=CTA_31\nTHREADPROC_RC=0\nSTAGE=CTA_32\nTHREADPROC_RC=0\nSTAGE=CTA_33\nTHREADPROC_RC=0\nSTAGE=CTA_34\nTHREADPROC_RC=0\nSTAGE=CTA_35\nTHREADPROC_RC=0\nSEED_THREADS_CREATED=30\nCTA_THREADS_CREATED=5\nTOTAL_NEW_THREADS_CREATED=35\nSEED_CHANGE_OUTPUT_END\nPOSTCHECK_OUTPUT_BEGIN\nXF_SHA=d0c10d91d743e0a541d9a1b201080491dae0a8b1757866f113ef707b83403219\nNODE_COUNT=18\nFORUM_COUNT=12\nTHREAD_COUNT=44\nPOST_COUNT=44\nZERO_REPLY_THREAD_COUNT=44\nNEW_TARGET_THREAD_COUNT=35\nCTA_STICKY_COUNT=5\nCTA_LAST_THREAD_COUNT=5\nTEMPLATE_THREAD_COUNT=9\nPHP_VERIFY_RC=0\nVERIFY_NEW_THREAD_ENTITIES=35\nVERIFY_NEW_FORUM_ASSOC=35\nVERIFY_NEW_AUTHOR_MATCH=35\nVERIFY_CTA_STICKY=5\nREG_ENABLED=0\nTITLE=PVEPro\nDESC_SHA=3748f06ab8cd9f32c7d3541e7193c478a47bbe69e383dd842ea6a3c9a65c0f57\nNODELIST_COUNT=18\nTABLES=224\nADMINS=1\nSVC_QEMU_GUEST_AGENT=active\nSVC_NGINX=active\nSVC_PHP8_3_FPM=active\nSVC_MARIADB=active\nMARIADB_SOCKET_ENABLED=masked\nPOSTCHECK_OUTPUT_END\nSEED_CONTENT_POSTCHECK_OK=true\nTASK_COMPLETE=true\nTASK_RESULT=PASS_PVEPRO_SEED_CONTENT_HOMEPAGE\nSEED_CASE_COUNT=30\nCTA_THREAD_COUNT=5\nTOTAL_FORUM_THREADS=44\nPUBLIC_CUTOVER=false\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}\n" +} diff --git a/runtime/history/SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2.txt b/runtime/history/SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2.txt new file mode 100644 index 00000000..bd16bbcc --- /dev/null +++ b/runtime/history/SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2.txt @@ -0,0 +1,145 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2 +STATUS=OK +RC=0 +HOST=pve01 +MODE=change +COMPONENT=pvepro-seed-content-homepage +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=e23c828e3098586a59c75f05b2a5534bd1ce6f3e7107ce5d43b51b48c83bc140 +DUPLICATE_FAILED_COMMAND_BLOCKED=false +EXECUTION_STARTED=true +CHANGE_DECLARED=true +RESULT_CONTRACT_VALID=true +RESULT_CONTRACT_STATUS=OK +RESULT_CONTRACT_ERROR=NONE +COMMAND_RC=0 +CHANGES_MADE=true +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +MUTATION_OUTCOME=MUTATED +SANITIZED=yes +SECRETS_INCLUDED=no +PRIVATE_ADDRESSES_INCLUDED=no +RAW_EVIDENCE_SHA256=1deadf23cbb20acc036a6c3db39b5a1660f45a50f9b9a63e434d50b11ca922ff +SANITIZED_OUTPUT_SHA256=1deadf23cbb20acc036a6c3db39b5a1660f45a50f9b9a63e434d50b11ca922ff +OUTPUT_BEGIN +SEED_CONTENT_PRESTATE_OK=true +SEED_CHANGE_EXITCODE=0 +SEED_CHANGE_OUTPUT_BEGIN +STAGE=SEED_1 +THREADPROC_RC=0 +STAGE=SEED_2 +THREADPROC_RC=0 +STAGE=SEED_3 +THREADPROC_RC=0 +STAGE=SEED_4 +THREADPROC_RC=0 +STAGE=SEED_5 +THREADPROC_RC=0 +STAGE=SEED_6 +THREADPROC_RC=0 +STAGE=SEED_7 +THREADPROC_RC=0 +STAGE=SEED_8 +THREADPROC_RC=0 +STAGE=SEED_9 +THREADPROC_RC=0 +STAGE=SEED_10 +THREADPROC_RC=0 +STAGE=SEED_11 +THREADPROC_RC=0 +STAGE=SEED_12 +THREADPROC_RC=0 +STAGE=SEED_13 +THREADPROC_RC=0 +STAGE=SEED_14 +THREADPROC_RC=0 +STAGE=SEED_15 +THREADPROC_RC=0 +STAGE=SEED_16 +THREADPROC_RC=0 +STAGE=SEED_17 +THREADPROC_RC=0 +STAGE=SEED_18 +THREADPROC_RC=0 +STAGE=SEED_19 +THREADPROC_RC=0 +STAGE=SEED_20 +THREADPROC_RC=0 +STAGE=SEED_21 +THREADPROC_RC=0 +STAGE=SEED_22 +THREADPROC_RC=0 +STAGE=SEED_23 +THREADPROC_RC=0 +STAGE=SEED_24 +THREADPROC_RC=0 +STAGE=SEED_25 +THREADPROC_RC=0 +STAGE=SEED_26 +THREADPROC_RC=0 +STAGE=SEED_27 +THREADPROC_RC=0 +STAGE=SEED_28 +THREADPROC_RC=0 +STAGE=SEED_29 +THREADPROC_RC=0 +STAGE=SEED_30 +THREADPROC_RC=0 +STAGE=CTA_31 +THREADPROC_RC=0 +STAGE=CTA_32 +THREADPROC_RC=0 +STAGE=CTA_33 +THREADPROC_RC=0 +STAGE=CTA_34 +THREADPROC_RC=0 +STAGE=CTA_35 +THREADPROC_RC=0 +SEED_THREADS_CREATED=30 +CTA_THREADS_CREATED=5 +TOTAL_NEW_THREADS_CREATED=35 +SEED_CHANGE_OUTPUT_END +POSTCHECK_OUTPUT_BEGIN +XF_SHA=d0c10d91d743e0a541d9a1b201080491dae0a8b1757866f113ef707b83403219 +NODE_COUNT=18 +FORUM_COUNT=12 +THREAD_COUNT=44 +POST_COUNT=44 +ZERO_REPLY_THREAD_COUNT=44 +NEW_TARGET_THREAD_COUNT=35 +CTA_STICKY_COUNT=5 +CTA_LAST_THREAD_COUNT=5 +TEMPLATE_THREAD_COUNT=9 +PHP_VERIFY_RC=0 +VERIFY_NEW_THREAD_ENTITIES=35 +VERIFY_NEW_FORUM_ASSOC=35 +VERIFY_NEW_AUTHOR_MATCH=35 +VERIFY_CTA_STICKY=5 +REG_ENABLED=0 +TITLE=PVEPro +DESC_SHA=3748f06ab8cd9f32c7d3541e7193c478a47bbe69e383dd842ea6a3c9a65c0f57 +NODELIST_COUNT=18 +TABLES=224 +ADMINS=1 +SVC_QEMU_GUEST_AGENT=active +SVC_NGINX=active +SVC_PHP8_3_FPM=active +SVC_MARIADB=active +MARIADB_SOCKET_ENABLED=masked +POSTCHECK_OUTPUT_END +SEED_CONTENT_POSTCHECK_OK=true +TASK_COMPLETE=true +TASK_RESULT=PASS_PVEPRO_SEED_CONTENT_HOMEPAGE +SEED_CASE_COUNT=30 +CTA_THREAD_COUNT=5 +TOTAL_FORUM_THREADS=44 +PUBLIC_CUTOVER=false +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2","status":"OK","changes_made":true,"rollback_started":false,"rollback_restored":null} + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 398a962c..426d2fe6 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,38 +1,38 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "NEWFI-260919-NEWFDOM-NOTIFY213-CONTRACT172", + "command_id": "SUPPORT-260920-PVEPRO-SEED-CONTENT-HOMEPAGE-702R2", "status": "OK", "rc": 0, "host": "pve01", - "mode": "read-only", - "component": "newfi-newfdom-notify213-xenforo-alert-push-signatures-readonly", - "started_at_utc": "2026-09-19T21:42:32Z", - "finished_at_utc": "2026-09-19T21:42:34Z", + "mode": "change", + "component": "pvepro-seed-content-homepage", + "started_at_utc": "2026-09-19T21:49:18Z", + "finished_at_utc": "2026-09-19T21:49:57Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "bda1140816eec82827d7d14464a8f4c170a8a77387d53dd4265102ee7c2c6b4c", + "command_sha256": "e23c828e3098586a59c75f05b2a5534bd1ce6f3e7107ce5d43b51b48c83bc140", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, - "change_declared": false, + "change_declared": true, "result_contract_valid": true, - "result_contract_status": null, + "result_contract_status": "OK", "result_contract_error": null, "command_rc": 0, - "changes_made": false, + "changes_made": true, "rollback_started": false, "rollback_restored": null, - "mutation_outcome": "NO_MUTATION", + "mutation_outcome": "MUTATED", "sanitized": true, "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "5a429f5a36df397f1561ab9cf5a3ef10db191d7e304e6f9a7705cd2e7a703034", - "sanitized_output_sha256": "5a429f5a36df397f1561ab9cf5a3ef10db191d7e304e6f9a7705cd2e7a703034", + "raw_evidence_sha256": "1deadf23cbb20acc036a6c3db39b5a1660f45a50f9b9a63e434d50b11ca922ff", + "sanitized_output_sha256": "1deadf23cbb20acc036a6c3db39b5a1660f45a50f9b9a63e434d50b11ca922ff", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "NEWFI172_BEGIN=true\nCOMMAND_ID=NEWFI-260919-NEWFDOM-NOTIFY213-CONTRACT172\nNEWFI172_FRAMEWORK={\"command_id\":\"NEWFI-260919-NEWFDOM-NOTIFY213-CONTRACT172\",\"controller_details\":{\"src/XF/Pub/Controller/AccountConfirmationController.php\":{\"bytes\":2043,\"matches\":[{\"context\":[{\"line\":13,\"text\":\"{\"},{\"line\":14,\"text\":\"\\tpublic function actionEmail(ParameterBag $params)\"},{\"line\":15,\"text\":\"\\t{\"},{\"line\":16,\"text\":\"\\t\\t/** @var User $user */\"},{\"line\":17,\"text\":\"\\t\\t$user = $this->assertRecordExists(User::class, $params->user_id);\"},{\"line\":18,\"text\":\"\"}],\"line\":14,\"text\":\"\\tpublic function actionEmail(ParameterBag $params)\"},{\"context\":[{\"line\":49,\"text\":\"\"},{\"line\":50,\"text\":\"\\tpublic function actionResend()\"},{\"line\":51,\"text\":\"\\t{\"},{\"line\":52,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":53,\"text\":\"\\t\\tif (!$visitor->user_id)\"},{\"line\":54,\"text\":\"\\t\\t{\"}],\"line\":50,\"text\":\"\\tpublic function actionResend()\"}],\"path\":\"/var/www/forums/newfi/public/src/XF/Pub/Controller/AccountConfirmationController.php\",\"present\":true,\"sha256\":\"f9c19473d2620ec0e20ab435871f296af90d85daf49fb8211ad7dde7af08781d\"},\"src/XF/Pub/Controller/AccountController.php\":{\"bytes\":54974,\"matches\":[{\"context\":[{\"line\":17,\"text\":\"use XF\\\\Entity\\\\User;\"},{\"line\":18,\"text\":\"use XF\\\\Entity\\\\UserAlert;\"},{\"line\":19,\"text\":\"use XF\\\\Entity\\\\UserConnectedAccount;\"},{\"line\":20,\"text\":\"use XF\\\\Entity\\\\UsernameChange;\"},{\"line\":21,\"text\":\"use XF\\\\Entity\\\\UserProfile;\"},{\"line\":22,\"text\":\"use XF\\\\Entity\\\\UserTfa;\"}],\"line\":18,\"text\":\"use XF\\\\Entity\\\\UserAlert;\"},{\"context\":[{\"line\":40,\"text\":\"use XF\\\\Repository\\\\TfaRepository;\"},{\"line\":41,\"text\":\"use XF\\\\Repository\\\\UserAlertRepository;\"},{\"line\":42,\"text\":\"use XF\\\\Repository\\\\UserTfaTrustedRepository;\"},{\"line\":43,\"text\":\"use XF\\\\Repository\\\\UserUpgradeRepository;\"},{\"line\":44,\"text\":\"use XF\\\\Service\\\\Passkey\\\\ManagerService;\"},{\"line\":45,\"text\":\"use XF\\\\Service\\\\User\\\\AvatarService;\"}],\"line\":41,\"text\":\"use XF\\\\Repository\\\\UserAlertRepository;\"},{\"context\":[{\"line\":66,\"text\":\"\"},{\"line\":67,\"text\":\"\\tpublic function actionIndex()\"},{\"line\":68,\"text\":\"\\t{\"},{\"line\":69,\"text\":\"\\t\\treturn $this->rerouteController(self::class, 'account-details');\"},{\"line\":70,\"text\":\"\\t}\"},{\"line\":71,\"text\":\"\"}],\"line\":67,\"text\":\"\\tpublic function actionIndex()\"},{\"context\":[{\"line\":77,\"text\":\"\"},{\"line\":78,\"text\":\"\\tpublic function actionAccountDetails()\"},{\"line\":79,\"text\":\"\\t{\"},{\"line\":80,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":81,\"text\":\"\"},{\"line\":82,\"text\":\"\\t\\tif ($this->isPost())\"}],\"line\":78,\"text\":\"\\tpublic function actionAccountDetails()\"},{\"context\":[{\"line\":200,\"text\":\"\"},{\"line\":201,\"text\":\"\\tpublic function actionUsername()\"},{\"line\":202,\"text\":\"\\t{\"},{\"line\":203,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":204,\"text\":\"\"},{\"line\":205,\"text\":\"\\t\\tif (!$visitor->canChangeUsername($error))\"}],\"line\":201,\"text\":\"\\tpublic function actionUsername()\"},{\"context\":[{\"line\":243,\"text\":\"\"},{\"line\":244,\"text\":\"\\tpublic function actionEmail()\"},{\"line\":245,\"text\":\"\\t{\"},{\"line\":246,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":247,\"text\":\"\\t\\t$auth = $visitor->Auth->getAuthenticationHandler();\"},{\"line\":248,\"text\":\"\\t\\tif (!$auth)\"}],\"line\":244,\"text\":\"\\tpublic function actionEmail()\"},{\"context\":[{\"line\":319,\"text\":\"\"},{\"line\":320,\"text\":\"\\tpublic function actionSignature()\"},{\"line\":321,\"text\":\"\\t{\"},{\"line\":322,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":323,\"text\":\"\\t\\tif (!$visitor->canEditSignature())\"},{\"line\":324,\"text\":\"\\t\\t{\"}],\"line\":320,\"text\":\"\\tpublic function actionSignature()\"},{\"context\":[{\"line\":372,\"text\":\"\"},{\"line\":373,\"text\":\"\\tpublic function actionPrivacy()\"},{\"line\":374,\"text\":\"\\t{\"},{\"line\":375,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":376,\"text\":\"\\t\\t{\"},{\"line\":377,\"text\":\"\\t\\t\\t$this->savePrivacyProcess(\\\\XF::visitor())->run();\"}],\"line\":373,\"text\":\"\\tpublic function actionPrivacy()\"},{\"context\":[{\"line\":376,\"text\":\"\\t\\t{\"},{\"line\":377,\"text\":\"\\t\\t\\t$this->savePrivacyProcess(\\\\XF::visitor())->run();\"},{\"line\":378,\"text\":\"\\t\\t\\treturn $this->redirect($this->buildLink('account/privacy'));\"},{\"line\":379,\"text\":\"\\t\\t}\"},{\"line\":380,\"text\":\"\\t\\telse\"},{\"line\":381,\"text\":\"\\t\\t{\"}],\"line\":377,\"text\":\"\\t\\t\\t$this->savePrivacyProcess(\\\\XF::visitor())->run();\"},{\"context\":[{\"line\":377,\"text\":\"\\t\\t\\t$this->savePrivacyProcess(\\\\XF::visitor())->run();\"},{\"line\":378,\"text\":\"\\t\\t\\treturn $this->redirect($this->buildLink('account/privacy'));\"},{\"line\":379,\"text\":\"\\t\\t}\"},{\"line\":380,\"text\":\"\\t\\telse\"},{\"line\":381,\"text\":\"\\t\\t{\"},{\"line\":382,\"text\":\"\\t\\t\\t$view = $this->view('XF:Account\\\\Privacy', 'account_privacy');\"}],\"line\":378,\"text\":\"\\t\\t\\treturn $this->redirect($this->buildLink('account/privacy'));\"},{\"context\":[{\"line\":381,\"text\":\"\\t\\t{\"},{\"line\":382,\"text\":\"\\t\\t\\t$view = $this->view('XF:Account\\\\Privacy', 'account_privacy');\"},{\"line\":383,\"text\":\"\\t\\t\\treturn $this->addAccountWrapperParams($view, 'privacy');\"},{\"line\":384,\"text\":\"\\t\\t}\"},{\"line\":385,\"text\":\"\\t}\"},{\"line\":386,\"text\":\"\"}],\"line\":382,\"text\":\"\\t\\t\\t$view = $this->view('XF:Account\\\\Privacy', 'account_privacy');\"},{\"context\":[{\"line\":382,\"text\":\"\\t\\t\\t$view = $this->view('XF:Account\\\\Privacy', 'account_privacy');\"},{\"line\":383,\"text\":\"\\t\\t\\treturn $this->addAccountWrapperParams($view, 'privacy');\"},{\"line\":384,\"text\":\"\\t\\t}\"},{\"line\":385,\"text\":\"\\t}\"},{\"line\":386,\"text\":\"\"},{\"line\":387,\"text\":\"\\tprotected function savePrivacyProcess(User $visitor)\"}],\"line\":383,\"text\":\"\\t\\t\\treturn $this->addAccountWrapperParams($view, 'privacy');\"},{\"context\":[{\"line\":386,\"text\":\"\"},{\"line\":387,\"text\":\"\\tprotected function savePrivacyProcess(User $visitor)\"},{\"line\":388,\"text\":\"\\t{\"},{\"line\":389,\"text\":\"\\t\\t$form = $this->formAction();\"},{\"line\":390,\"text\":\"\"},{\"line\":391,\"text\":\"\\t\\t$input = $this->filter([\"}],\"line\":387,\"text\":\"\\tprotected function savePrivacyProcess(User $visitor)\"},{\"context\":[{\"line\":400,\"text\":\"\\t\\t\\t],\"},{\"line\":401,\"text\":\"\\t\\t\\t'privacy' => [\"},{\"line\":402,\"text\":\"\\t\\t\\t\\t'allow_view_profile' => 'str',\"},{\"line\":403,\"text\":\"\\t\\t\\t\\t'allow_post_profile' => 'str',\"},{\"line\":404,\"text\":\"\\t\\t\\t\\t'allow_receive_news_feed' => 'str',\"},{\"line\":405,\"text\":\"\\t\\t\\t\\t'allow_send_personal_conversation' => 'str',\"}],\"line\":401,\"text\":\"\\t\\t\\t'privacy' => [\"},{\"context\":[{\"line\":419,\"text\":\"\"},{\"line\":420,\"text\":\"\\t\\t$userPrivacy = $visitor->getRelationOrDefault('Privacy');\"},{\"line\":421,\"text\":\"\\t\\t$form->setupEntityInput($userPrivacy, $input['privacy']);\"},{\"line\":422,\"text\":\"\"},{\"line\":423,\"text\":\"\\t\\t$form->complete(function () use ($visitor)\"},{\"line\":424,\"text\":\"\\t\\t{\"}],\"line\":420,\"text\":\"\\t\\t$userPrivacy = $visitor->getRelationOrDefault('Privacy');\"},{\"context\":[{\"line\":420,\"text\":\"\\t\\t$userPrivacy = $visitor->getRelationOrDefault('Privacy');\"},{\"line\":421,\"text\":\"\\t\\t$form->setupEntityInput($userPrivacy, $input['privacy']);\"},{\"line\":422,\"text\":\"\"},{\"line\":423,\"text\":\"\\t\\t$form->complete(function () use ($visitor)\"},{\"line\":424,\"text\":\"\\t\\t{\"},{\"line\":425,\"text\":\"\\t\\t\\t$ipRepo = $this->repository(IpRepository::class);\"}],\"line\":421,\"text\":\"\\t\\t$form->setupEntityInput($userPrivacy, $input['privacy']);\"},{\"context\":[{\"line\":425,\"text\":\"\\t\\t\\t$ipRepo = $this->repository(IpRepository::class);\"},{\"line\":426,\"text\":\"\\t\\t\\t$ipRepo->logIp($visitor->user_id, $this->request->getIp(), 'user', $visitor->user_id, 'privacy_edit');\"},{\"line\":427,\"text\":\"\\t\\t});\"},{\"line\":428,\"text\":\"\"},{\"line\":429,\"text\":\"\\t\\treturn $form;\"},{\"line\":430,\"text\":\"\\t}\"}],\"line\":426,\"text\":\"\\t\\t\\t$ipRepo->logIp($visitor->user_id, $this->request->getIp(), 'user', $visitor->user_id, 'privacy_edit');\"},{\"context\":[{\"line\":431,\"text\":\"\"},{\"line\":432,\"text\":\"\\tpublic function actionPreferences()\"},{\"line\":433,\"text\":\"\\t{\"},{\"line\":434,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":435,\"text\":\"\\t\\t{\"},{\"line\":436,\"text\":\"\\t\\t\\t$this->preferencesSaveProcess(\\\\XF::visitor())->run();\"}],\"line\":432,\"text\":\"\\tpublic function actionPreferences()\"},{\"context\":[{\"line\":435,\"text\":\"\\t\\t{\"},{\"line\":436,\"text\":\"\\t\\t\\t$this->preferencesSaveProcess(\\\\XF::visitor())->run();\"},{\"line\":437,\"text\":\"\\t\\t\\treturn $this->redirect($this->buildLink('account/preferences'));\"},{\"line\":438,\"text\":\"\\t\\t}\"},{\"line\":439,\"text\":\"\\t\\telse\"},{\"line\":440,\"text\":\"\\t\\t{\"}],\"line\":436,\"text\":\"\\t\\t\\t$this->preferencesSaveProcess(\\\\XF::visitor())->run();\"},{\"context\":[{\"line\":436,\"text\":\"\\t\\t\\t$this->preferencesSaveProcess(\\\\XF::visitor())->run();\"},{\"line\":437,\"text\":\"\\t\\t\\treturn $this->redirect($this->buildLink('account/preferences'));\"},{\"line\":438,\"text\":\"\\t\\t}\"},{\"line\":439,\"text\":\"\\t\\telse\"},{\"line\":440,\"text\":\"\\t\\t{\"},{\"line\":441,\"text\":\"\\t\\t\\t$styles = $this->repository(StyleRepository::class)->getUserSelectableStyles();\"}],\"line\":437,\"text\":\"\\t\\t\\treturn $this->redirect($this->buildLink('account/preferences'));\"},{\"context\":[{\"line\":447,\"text\":\"\"},{\"line\":448,\"text\":\"\\t\\t\\t$alertRepo = $this->repository(UserAlertRepository::class);\"},{\"line\":449,\"text\":\"\"},{\"line\":450,\"text\":\"\\t\\t\\t$viewParams = [\"},{\"line\":451,\"text\":\"\\t\\t\\t\\t'styles' => $styles,\"},{\"line\":452,\"text\":\"\\t\\t\\t\\t'defaultStyle' => $styles[$this->app->options()->defaultStyleId] ?? [],\"}],\"line\":448,\"text\":\"\\t\\t\\t$alertRepo = $this->repository(UserAlertRepository::class);\"},{\"context\":[{\"line\":457,\"text\":\"\"},{\"line\":458,\"text\":\"\\t\\t\\t\\t'alertOptOuts' => $alertRepo->getAlertOptOuts(),\"},{\"line\":459,\"text\":\"\\t\\t\\t];\"},{\"line\":460,\"text\":\"\"},{\"line\":461,\"text\":\"\\t\\t\\t$view = $this->view('XF:Account\\\\Preferences', 'account_preferences', $viewParams);\"},{\"line\":462,\"text\":\"\\t\\t\\treturn $this->addAccountWrapperParams($view, 'preferences');\"}],\"line\":458,\"text\":\"\\t\\t\\t\\t'alertOptOuts' => $alertRepo->getAlertOptOuts(),\"},{\"context\":[{\"line\":460,\"text\":\"\"},{\"line\":461,\"text\":\"\\t\\t\\t$view = $this->view('XF:Account\\\\Preferences', 'account_preferences', $viewParams);\"},{\"line\":462,\"text\":\"\\t\\t\\treturn $this->addAccountWrapperParams($view, 'preferences');\"},{\"line\":463,\"text\":\"\\t\\t}\"},{\"line\":464,\"text\":\"\\t}\"},{\"line\":465,\"text\":\"\"}],\"line\":461,\"text\":\"\\t\\t\\t$view = $this->view('XF:Account\\\\Preferences', 'account_preferences', $viewParams);\"},{\"context\":[{\"line\":461,\"text\":\"\\t\\t\\t$view = $this->view('XF:Account\\\\Preferences', 'account_preferences', $viewParams);\"},{\"line\":462,\"text\":\"\\t\\t\\treturn $this->addAccountWrapperParams($view, 'preferences');\"},{\"line\":463,\"text\":\"\\t\\t}\"},{\"line\":464,\"text\":\"\\t}\"},{\"line\":465,\"text\":\"\"},{\"line\":466,\"text\":\"\\tprotected function preferencesSaveProcess(User $visitor)\"}],\"line\":462,\"text\":\"\\t\\t\\treturn $this->addAccountWrapperParams($view, 'preferences');\"},{\"context\":[{\"line\":465,\"text\":\"\"},{\"line\":466,\"text\":\"\\tprotected function preferencesSaveProcess(User $visitor)\"},{\"line\":467,\"text\":\"\\t{\"},{\"line\":468,\"text\":\"\\t\\t$form = $this->formAction();\"},{\"line\":469,\"text\":\"\"},{\"line\":470,\"text\":\"\\t\\t$input = $this->filter([\"}],\"line\":466,\"text\":\"\\tprotected function preferencesSaveProcess(User $visitor)\"},{\"context\":[{\"line\":484,\"text\":\"\\t\\t\\t\\t'email_on_conversation' => 'bool',\"},{\"line\":485,\"text\":\"\\t\\t\\t\\t'push_on_conversation' => 'bool',\"},{\"line\":486,\"text\":\"\\t\\t\\t],\"},{\"line\":487,\"text\":\"\\t\\t\\t'moderator' => [\"},{\"line\":488,\"text\":\"\\t\\t\\t\\t'notify_report' => 'bool',\"},{\"line\":489,\"text\":\"\\t\\t\\t\\t'notify_approval' => 'bool',\"}],\"line\":485,\"text\":\"\\t\\t\\t\\t'push_on_conversation' => 'bool',\"},{\"context\":[{\"line\":494,\"text\":\"\"},{\"line\":495,\"text\":\"\\t\\t$alertRepo = $this->repository(UserAlertRepository::class);\"},{\"line\":496,\"text\":\"\\t\\t$optOutActions = $alertRepo->getAlertOptOutActions();\"},{\"line\":497,\"text\":\"\\t\\t$alert = $this->filter('alert', 'array-bool');\"},{\"line\":498,\"text\":\"\\t\\t$push = $this->filter('push', 'array-bool');\"},{\"line\":499,\"text\":\"\\t\\t$pushShown = $this->filter('push_shown', 'array-bool');\"}],\"line\":495,\"text\":\"\\t\\t$alertRepo = $this->repository(UserAlertRepository::class);\"},{\"context\":[{\"line\":495,\"text\":\"\\t\\t$alertRepo = $this->repository(UserAlertRepository::class);\"},{\"line\":496,\"text\":\"\\t\\t$optOutActions = $alertRepo->getAlertOptOutActions();\"},{\"line\":497,\"text\":\"\\t\\t$alert = $this->filter('alert', 'array-bool');\"},{\"line\":498,\"text\":\"\\t\\t$push = $this->filter('push', 'array-bool');\"},{\"line\":499,\"text\":\"\\t\\t$pushShown = $this->filter('push_shown', 'array-bool');\"},{\"line\":500,\"text\":\"\"}],\"line\":496,\"text\":\"\\t\\t$optOutActions = $alertRepo->getAlertOptOutActions();\"},{\"context\":[{\"line\":496,\"text\":\"\\t\\t$optOutActions = $alertRepo->getAlertOptOutActions();\"},{\"line\":497,\"text\":\"\\t\\t$alert = $this->filter('alert', 'array-bool');\"},{\"line\":498,\"text\":\"\\t\\t$push = $this->filter('push', 'array-bool');\"},{\"line\":499,\"text\":\"\\t\\t$pushShown = $this->filter('push_shown', 'array-bool');\"},{\"line\":500,\"text\":\"\"},{\"line\":501,\"text\":\"\\t\\t$alertOptOuts = [];\"}],\"line\":497,\"text\":\"\\t\\t$alert = $this->filter('alert', 'array-bool');\"},{\"context\":[{\"line\":497,\"text\":\"\\t\\t$alert = $this->filter('alert', 'array-bool');\"},{\"line\":498,\"text\":\"\\t\\t$push = $this->filter('push', 'array-bool');\"},{\"line\":499,\"text\":\"\\t\\t$pushShown = $this->filter('push_shown', 'array-bool');\"},{\"line\":500,\"text\":\"\"},{\"line\":501,\"text\":\"\\t\\t$alertOptOuts = [];\"},{\"line\":502,\"text\":\"\\t\\t$pushOptOuts = [];\"}],\"line\":498,\"text\":\"\\t\\t$push = $this->filter('push', 'array-bool');\"},{\"context\":[{\"line\":498,\"text\":\"\\t\\t$push = $this->filter('push', 'array-bool');\"},{\"line\":499,\"text\":\"\\t\\t$pushShown = $this->filter('push_shown', 'array-bool');\"},{\"line\":500,\"text\":\"\"},{\"line\":501,\"text\":\"\\t\\t$alertOptOuts = [];\"},{\"line\":502,\"text\":\"\\t\\t$pushOptOuts = [];\"},{\"line\":503,\"text\":\"\\t\\tforeach (array_keys($optOutActions) AS $optOut)\"}],\"line\":499,\"text\":\"\\t\\t$pushShown = $this->filter('push_shown', 'array-bool');\"},{\"context\":[{\"line\":500,\"text\":\"\"},{\"line\":501,\"text\":\"\\t\\t$alertOptOuts = [];\"},{\"line\":502,\"text\":\"\\t\\t$pushOptOuts = [];\"},{\"line\":503,\"text\":\"\\t\\tforeach (array_keys($optOutActions) AS $optOut)\"},{\"line\":504,\"text\":\"\\t\\t{\"},{\"line\":505,\"text\":\"\\t\\t\\tif (empty($alert[$optOut]))\"}],\"line\":501,\"text\":\"\\t\\t$alertOptOuts = [];\"},{\"context\":[{\"line\":501,\"text\":\"\\t\\t$alertOptOuts = [];\"},{\"line\":502,\"text\":\"\\t\\t$pushOptOuts = [];\"},{\"line\":503,\"text\":\"\\t\\tforeach (array_keys($optOutActions) AS $optOut)\"},{\"line\":504,\"text\":\"\\t\\t{\"},{\"line\":505,\"text\":\"\\t\\t\\tif (empty($alert[$optOut]))\"},{\"line\":506,\"text\":\"\\t\\t\\t{\"}],\"line\":502,\"text\":\"\\t\\t$pushOptOuts = [];\"},{\"context\":[{\"line\":504,\"text\":\"\\t\\t{\"},{\"line\":505,\"text\":\"\\t\\t\\tif (empty($alert[$optOut]))\"},{\"line\":506,\"text\":\"\\t\\t\\t{\"},{\"line\":507,\"text\":\"\\t\\t\\t\\t$alertOptOuts[$optOut] = $optOut;\"},{\"line\":508,\"text\":\"\\t\\t\\t}\"},{\"line\":509,\"text\":\"\\t\\t\\tif (empty($push[$optOut]) && isset($pushShown[$optOut]))\"}],\"line\":505,\"text\":\"\\t\\t\\tif (empty($alert[$optOut]))\"},{\"context\":[{\"line\":506,\"text\":\"\\t\\t\\t{\"},{\"line\":507,\"text\":\"\\t\\t\\t\\t$alertOptOuts[$optOut] = $optOut;\"},{\"line\":508,\"text\":\"\\t\\t\\t}\"},{\"line\":509,\"text\":\"\\t\\t\\tif (empty($push[$optOut]) && isset($pushShown[$optOut]))\"},{\"line\":510,\"text\":\"\\t\\t\\t{\"},{\"line\":511,\"text\":\"\\t\\t\\t\\t$pushOptOuts[$optOut] = $optOut;\"}],\"line\":507,\"text\":\"\\t\\t\\t\\t$alertOptOuts[$optOut] = $optOut;\"},{\"context\":[{\"line\":508,\"text\":\"\\t\\t\\t}\"},{\"line\":509,\"text\":\"\\t\\t\\tif (empty($push[$optOut]) && isset($pushShown[$optOut]))\"},{\"line\":510,\"text\":\"\\t\\t\\t{\"},{\"line\":511,\"text\":\"\\t\\t\\t\\t$pushOptOuts[$optOut] = $optOut;\"},{\"line\":512,\"text\":\"\\t\\t\\t}\"},{\"line\":513,\"text\":\"\\t\\t}\"}],\"line\":509,\"text\":\"\\t\\t\\tif (empty($push[$optOut]) && isset($pushShown[$optOut]))\"},{\"context\":[{\"line\":510,\"text\":\"\\t\\t\\t{\"},{\"line\":511,\"text\":\"\\t\\t\\t\\t$pushOptOuts[$optOut] = $optOut;\"},{\"line\":512,\"text\":\"\\t\\t\\t}\"},{\"line\":513,\"text\":\"\\t\\t}\"},{\"line\":514,\"text\":\"\"},{\"line\":515,\"text\":\"\\t\\t$input['option']['alert_optout'] = $alertOptOuts;\"}],\"line\":511,\"text\":\"\\t\\t\\t\\t$pushOptOuts[$optOut] = $optOut;\"},{\"context\":[{\"line\":514,\"text\":\"\"},{\"line\":515,\"text\":\"\\t\\t$input['option']['alert_optout'] = $alertOptOuts;\"},{\"line\":516,\"text\":\"\"},{\"line\":517,\"text\":\"\\t\\tif ($visitor->canUsePushNotifications())\"},{\"line\":518,\"text\":\"\\t\\t{\"},{\"line\":519,\"text\":\"\\t\\t\\t$input['option']['push_optout'] = $pushOptOuts;\"}],\"line\":515,\"text\":\"\\t\\t$input['option']['alert_optout'] = $alertOptOuts;\"},{\"context\":[{\"line\":516,\"text\":\"\"},{\"line\":517,\"text\":\"\\t\\tif ($visitor->canUsePushNotifications())\"},{\"line\":518,\"text\":\"\\t\\t{\"},{\"line\":519,\"text\":\"\\t\\t\\t$input['option']['push_optout'] = $pushOptOuts;\"},{\"line\":520,\"text\":\"\\t\\t}\"},{\"line\":521,\"text\":\"\"}],\"line\":517,\"text\":\"\\t\\tif ($visitor->canUsePushNotifications())\"},{\"context\":[{\"line\":518,\"text\":\"\\t\\t{\"},{\"line\":519,\"text\":\"\\t\\t\\t$input['option']['push_optout'] = $pushOptOuts;\"},{\"line\":520,\"text\":\"\\t\\t}\"},{\"line\":521,\"text\":\"\"},{\"line\":522,\"text\":\"\\t\\t$form->setup(function () use ($visitor, $input)\"},{\"line\":523,\"text\":\"\\t\\t{\"}],\"line\":519,\"text\":\"\\t\\t\\t$input['option']['push_optout'] = $pushOptOuts;\"},{\"context\":[{\"line\":542,\"text\":\"\"},{\"line\":543,\"text\":\"\\t\\t$this->customFieldsSaveProcess($form, 'preferences');\"},{\"line\":544,\"text\":\"\"},{\"line\":545,\"text\":\"\\t\\t$form->apply(function () use ($input, $visitor)\"},{\"line\":546,\"text\":\"\\t\\t{\"},{\"line\":547,\"text\":\"\\t\\t\\tif ($input['restore_notices'])\"}],\"line\":543,\"text\":\"\\t\\t$this->customFieldsSaveProcess($form, 'preferences');\"},{\"context\":[{\"line\":555,\"text\":\"\\t\\t\\t$ipRepo = $this->repository(IpRepository::class);\"},{\"line\":556,\"text\":\"\\t\\t\\t$ipRepo->logIp($visitor->user_id, $this->request->getIp(), 'user', $visitor->user_id, 'preferences_edit');\"},{\"line\":557,\"text\":\"\\t\\t});\"},{\"line\":558,\"text\":\"\"},{\"line\":559,\"text\":\"\\t\\treturn $form;\"},{\"line\":560,\"text\":\"\\t}\"}],\"line\":556,\"text\":\"\\t\\t\\t$ipRepo->logIp($visitor->user_id, $this->request->getIp(), 'user', $visitor->user_id, 'preferences_edit');\"},{\"context\":[{\"line\":561,\"text\":\"\"},{\"line\":562,\"text\":\"\\tpublic function actionDismissNotice()\"},{\"line\":563,\"text\":\"\\t{\"},{\"line\":564,\"text\":\"\\t\\t/** @var Notice $notice */\"},{\"line\":565,\"text\":\"\\t\\t$notice = $this->assertRecordExists(Notice::class, $this->filter('notice_id', 'uint'));\"},{\"line\":566,\"text\":\"\"}],\"line\":562,\"text\":\"\\tpublic function actionDismissNotice()\"},{\"context\":[{\"line\":583,\"text\":\"\"},{\"line\":584,\"text\":\"\\tpublic function actionAvatar()\"},{\"line\":585,\"text\":\"\\t{\"},{\"line\":586,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":587,\"text\":\"\\t\\tif (!$visitor->canUploadAvatar())\"},{\"line\":588,\"text\":\"\\t\\t{\"}],\"line\":584,\"text\":\"\\tpublic function actionAvatar()\"},{\"context\":[{\"line\":685,\"text\":\"\"},{\"line\":686,\"text\":\"\\tpublic function actionBanner()\"},{\"line\":687,\"text\":\"\\t{\"},{\"line\":688,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":689,\"text\":\"\\t\\tif (!$visitor->canUploadProfileBanner())\"},{\"line\":690,\"text\":\"\\t\\t{\"}],\"line\":686,\"text\":\"\\tpublic function actionBanner()\"},{\"context\":[{\"line\":747,\"text\":\"\"},{\"line\":748,\"text\":\"\\tpublic function actionFollowing()\"},{\"line\":749,\"text\":\"\\t{\"},{\"line\":750,\"text\":\"\\t\\t$followingUsers = [];\"},{\"line\":751,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":752,\"text\":\"\\t\\tif ($following = $visitor->Profile->following)\"}],\"line\":748,\"text\":\"\\tpublic function actionFollowing()\"},{\"context\":[{\"line\":766,\"text\":\"\"},{\"line\":767,\"text\":\"\\tpublic function actionIgnored()\"},{\"line\":768,\"text\":\"\\t{\"},{\"line\":769,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":770,\"text\":\"\\t\\tif ($ignored = $visitor->Profile->ignored)\"},{\"line\":771,\"text\":\"\\t\\t{\"}],\"line\":767,\"text\":\"\\tpublic function actionIgnored()\"},{\"context\":[{\"line\":788,\"text\":\"\"},{\"line\":789,\"text\":\"\\tpublic function actionReactions()\"},{\"line\":790,\"text\":\"\\t{\"},{\"line\":791,\"text\":\"\\t\\t$this->assertNotEmbeddedImageRequest();\"},{\"line\":792,\"text\":\"\"},{\"line\":793,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"}],\"line\":789,\"text\":\"\\tpublic function actionReactions()\"},{\"context\":[{\"line\":844,\"text\":\"\"},{\"line\":845,\"text\":\"\\tpublic function actionSecurity()\"},{\"line\":846,\"text\":\"\\t{\"},{\"line\":847,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":848,\"text\":\"\\t\\t$auth = $visitor->Auth->getAuthenticationHandler();\"},{\"line\":849,\"text\":\"\\t\\tif (!$auth)\"}],\"line\":845,\"text\":\"\\tpublic function actionSecurity()\"},{\"context\":[{\"line\":937,\"text\":\"\"},{\"line\":938,\"text\":\"\\tpublic function actionPasskeyAdd()\"},{\"line\":939,\"text\":\"\\t{\"},{\"line\":940,\"text\":\"\\t\\tif (!$this->request->isSecure() && !$this->request->isHostLocal())\"},{\"line\":941,\"text\":\"\\t\\t{\"},{\"line\":942,\"text\":\"\\t\\t\\treturn $this->notFound();\"}],\"line\":938,\"text\":\"\\tpublic function actionPasskeyAdd()\"},{\"context\":[{\"line\":989,\"text\":\"\"},{\"line\":990,\"text\":\"\\tpublic function actionPasskeyEdit(ParameterBag $params)\"},{\"line\":991,\"text\":\"\\t{\"},{\"line\":992,\"text\":\"\\t\\t$this->assertPasswordVerified(3600);\"},{\"line\":993,\"text\":\"\"},{\"line\":994,\"text\":\"\\t\\t$passkey = $this->assertPasskeyExists($params->passkey_id);\"}],\"line\":990,\"text\":\"\\tpublic function actionPasskeyEdit(ParameterBag $params)\"},{\"context\":[{\"line\":1016,\"text\":\"\"},{\"line\":1017,\"text\":\"\\tpublic function actionPasskeyDelete(ParameterBag $params)\"},{\"line\":1018,\"text\":\"\\t{\"},{\"line\":1019,\"text\":\"\\t\\t$this->assertPasswordVerified(3600);\"},{\"line\":1020,\"text\":\"\"},{\"line\":1021,\"text\":\"\\t\\t$passkey = $this->assertPasskeyExists($params->passkey_id);\"}],\"line\":1017,\"text\":\"\\tpublic function actionPasskeyDelete(ParameterBag $params)\"},{\"context\":[{\"line\":1036,\"text\":\"\"},{\"line\":1037,\"text\":\"\\tpublic function actionConnectedAccount()\"},{\"line\":1038,\"text\":\"\\t{\"},{\"line\":1039,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":1040,\"text\":\"\\t\\t$auth = $visitor->Auth->getAuthenticationHandler();\"},{\"line\":1041,\"text\":\"\"}],\"line\":1037,\"text\":\"\\tpublic function actionConnectedAccount()\"},{\"context\":[{\"line\":1051,\"text\":\"\"},{\"line\":1052,\"text\":\"\\tpublic function actionConnectedAccountDisassociate(ParameterBag $params)\"},{\"line\":1053,\"text\":\"\\t{\"},{\"line\":1054,\"text\":\"\\t\\t$this->assertPostOnly();\"},{\"line\":1055,\"text\":\"\"},{\"line\":1056,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"}],\"line\":1052,\"text\":\"\\tpublic function actionConnectedAccountDisassociate(ParameterBag $params)\"},{\"context\":[{\"line\":1105,\"text\":\"\"},{\"line\":1106,\"text\":\"\\tpublic function actionRequestPassword()\"},{\"line\":1107,\"text\":\"\\t{\"},{\"line\":1108,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":1109,\"text\":\"\\t\\t$auth = $visitor->Auth->getAuthenticationHandler();\"},{\"line\":1110,\"text\":\"\\t\\tif (!$auth)\"}],\"line\":1106,\"text\":\"\\tpublic function actionRequestPassword()\"},{\"context\":[{\"line\":1138,\"text\":\"\"},{\"line\":1139,\"text\":\"\\tpublic function actionTwoStep()\"},{\"line\":1140,\"text\":\"\\t{\"},{\"line\":1141,\"text\":\"\\t\\t$this->assertTfaEnabled();\"},{\"line\":1142,\"text\":\"\\t\\t$this->assertTwoStepPasswordVerified();\"},{\"line\":1143,\"text\":\"\"}],\"line\":1139,\"text\":\"\\tpublic function actionTwoStep()\"},{\"context\":[{\"line\":1176,\"text\":\"\"},{\"line\":1177,\"text\":\"\\tpublic function actionTwoStepBackupCodes()\"},{\"line\":1178,\"text\":\"\\t{\"},{\"line\":1179,\"text\":\"\\t\\t$this->assertTfaEnabled();\"},{\"line\":1180,\"text\":\"\\t\\t$this->assertTwoStepPasswordVerified();\"},{\"line\":1181,\"text\":\"\"}],\"line\":1177,\"text\":\"\\tpublic function actionTwoStepBackupCodes()\"},{\"context\":[{\"line\":1203,\"text\":\"\"},{\"line\":1204,\"text\":\"\\tpublic function actionTwoStepAdd(ParameterBag $params)\"},{\"line\":1205,\"text\":\"\\t{\"},{\"line\":1206,\"text\":\"\\t\\t$this->assertTfaEnabled();\"},{\"line\":1207,\"text\":\"\\t\\t$this->assertTwoStepPasswordVerified();\"},{\"line\":1208,\"text\":\"\\t\\t$this->assertPostOnly();\"}],\"line\":1204,\"text\":\"\\tpublic function actionTwoStepAdd(ParameterBag $params)\"},{\"context\":[{\"line\":1287,\"text\":\"\"},{\"line\":1288,\"text\":\"\\tpublic function actionTwoStepEnable(ParameterBag $params)\"},{\"line\":1289,\"text\":\"\\t{\"},{\"line\":1290,\"text\":\"\\t\\t$this->assertTfaEnabled();\"},{\"line\":1291,\"text\":\"\\t\\t$this->assertTwoStepPasswordVerified();\"},{\"line\":1292,\"text\":\"\\t\\t$this->assertPostOnly();\"}],\"line\":1288,\"text\":\"\\tpublic function actionTwoStepEnable(ParameterBag $params)\"},{\"context\":[{\"line\":1368,\"text\":\"\"},{\"line\":1369,\"text\":\"\\tpublic function actionTwoStepDisable(ParameterBag $params)\"},{\"line\":1370,\"text\":\"\\t{\"},{\"line\":1371,\"text\":\"\\t\\t$this->assertTfaEnabled();\"},{\"line\":1372,\"text\":\"\\t\\t$this->assertTwoStepPasswordVerified();\"},{\"line\":1373,\"text\":\"\"}],\"line\":1369,\"text\":\"\\tpublic function actionTwoStepDisable(ParameterBag $params)\"}],\"path\":\"/var/www/forums/newfi/public/src/XF/Pub/Controller/AccountController.php\",\"present\":true,\"sha256\":\"73e755ef485d737f1a74e576827af1a127ec95c153f3a818eb20b344f5243270\"}},\"controller_scan\":[\"src/XF/Pub/Controller/AccountConfirmationController.php\",\"src/XF/Pub/Controller/AccountController.php\"],\"exact\":{\"abstract_handler\":{\"bytes\":4761,\"matches\":[{\"context\":[{\"line\":61,\"text\":\"\\t * @return string|null\"},{\"line\":62,\"text\":\"\\t */\"},{\"line\":63,\"text\":\"\\tpublic function getPushTemplateName($action)\"},{\"line\":64,\"text\":\"\\t{\"},{\"line\":65,\"text\":\"\\t\\treturn 'public:push_' . $this->contentType . '_' . $action;\"},{\"line\":66,\"text\":\"\\t}\"},{\"line\":67,\"text\":\"\"},{\"line\":68,\"text\":\"\\t/**\"},{\"line\":69,\"text\":\"\\t * @param string $action\"}],\"line\":63,\"text\":\"\\tpublic function getPushTemplateName($action)\"},{\"context\":[{\"line\":71,\"text\":\"\\t * @return string\"},{\"line\":72,\"text\":\"\\t */\"},{\"line\":73,\"text\":\"\\tpublic function getTemplateName($action)\"},{\"line\":74,\"text\":\"\\t{\"},{\"line\":75,\"text\":\"\\t\\treturn 'public:alert_' . $this->contentType . '_' . $action;\"},{\"line\":76,\"text\":\"\\t}\"},{\"line\":77,\"text\":\"\"},{\"line\":78,\"text\":\"\\t/**\"},{\"line\":79,\"text\":\"\\t * @param string $action\"}],\"line\":73,\"text\":\"\\tpublic function getTemplateName($action)\"},{\"context\":[{\"line\":87,\"text\":\"\\t * }\"},{\"line\":88,\"text\":\"\\t */\"},{\"line\":89,\"text\":\"\\tpublic function getTemplateData($action, UserAlert $alert, ?Entity $content = null)\"},{\"line\":90,\"text\":\"\\t{\"},{\"line\":91,\"text\":\"\\t\\tif (!$content)\"},{\"line\":92,\"text\":\"\\t\\t{\"},{\"line\":93,\"text\":\"\\t\\t\\t$content = $alert->Content;\"},{\"line\":94,\"text\":\"\\t\\t}\"},{\"line\":95,\"text\":\"\"}],\"line\":89,\"text\":\"\\tpublic function getTemplateData($action, UserAlert $alert, ?Entity $content = null)\"},{\"context\":[{\"line\":107,\"text\":\"\\t * @return string\"},{\"line\":108,\"text\":\"\\t */\"},{\"line\":109,\"text\":\"\\tpublic function render(UserAlert $alert, ?Entity $content = null)\"},{\"line\":110,\"text\":\"\\t{\"},{\"line\":111,\"text\":\"\\t\\tif (!$content)\"},{\"line\":112,\"text\":\"\\t\\t{\"},{\"line\":113,\"text\":\"\\t\\t\\t$content = $alert->Content;\"},{\"line\":114,\"text\":\"\\t\\t\\tif (!$content)\"},{\"line\":115,\"text\":\"\\t\\t\\t{\"}],\"line\":109,\"text\":\"\\tpublic function render(UserAlert $alert, ?Entity $content = null)\"},{\"context\":[{\"line\":140,\"text\":\"\\t * }\"},{\"line\":141,\"text\":\"\\t */\"},{\"line\":142,\"text\":\"\\tpublic function getApiOutput(UserAlert $alert)\"},{\"line\":143,\"text\":\"\\t{\"},{\"line\":144,\"text\":\"\\t\\t$templater = \\\\XF::app()->templater();\"},{\"line\":145,\"text\":\"\\t\\t$content = $alert->Content;\"},{\"line\":146,\"text\":\"\\t\\tif (!$content)\"},{\"line\":147,\"text\":\"\\t\\t{\"},{\"line\":148,\"text\":\"\\t\\t\\treturn null;\"}],\"line\":142,\"text\":\"\\tpublic function getApiOutput(UserAlert $alert)\"},{\"context\":[{\"line\":192,\"text\":\"\\t * @return T|AbstractCollection\"},{\"line\":193,\"text\":\"\\t */\"},{\"line\":194,\"text\":\"\\tpublic function getContent($id)\"},{\"line\":195,\"text\":\"\\t{\"},{\"line\":196,\"text\":\"\\t\\treturn \\\\XF::app()->findByContentType($this->contentType, $id, $this->getEntityWith());\"},{\"line\":197,\"text\":\"\\t}\"},{\"line\":198,\"text\":\"\"},{\"line\":199,\"text\":\"\\t/**\"},{\"line\":200,\"text\":\"\\t * @return string\"}],\"line\":194,\"text\":\"\\tpublic function getContent($id)\"},{\"context\":[{\"line\":200,\"text\":\"\\t * @return string\"},{\"line\":201,\"text\":\"\\t */\"},{\"line\":202,\"text\":\"\\tpublic function getContentType()\"},{\"line\":203,\"text\":\"\\t{\"},{\"line\":204,\"text\":\"\\t\\treturn $this->contentType;\"},{\"line\":205,\"text\":\"\\t}\"},{\"line\":206,\"text\":\"\"},{\"line\":207,\"text\":\"\\t/**\"},{\"line\":208,\"text\":\"\\t * An array of alert actions which can be opted out of for this type.\"}],\"line\":202,\"text\":\"\\tpublic function getContentType()\"},{\"context\":[{\"line\":210,\"text\":\"\\t * @return list\"},{\"line\":211,\"text\":\"\\t */\"},{\"line\":212,\"text\":\"\\tpublic function getOptOutActions()\"},{\"line\":213,\"text\":\"\\t{\"},{\"line\":214,\"text\":\"\\t\\treturn [];\"},{\"line\":215,\"text\":\"\\t}\"},{\"line\":216,\"text\":\"\"},{\"line\":217,\"text\":\"\\t/**\"},{\"line\":218,\"text\":\"\\t * The display order of this type's alert opt outs.\"}],\"line\":212,\"text\":\"\\tpublic function getOptOutActions()\"}],\"path\":\"/var/www/forums/newfi/public/src/XF/Alert/AbstractHandler.php\",\"present\":true,\"sha256\":\"1d48488be1e561809a8d53ea9f43a3de2f04e70c5cc7c7e9a334fe12abcd2992\"},\"post_handler\":{\"bytes\":504,\"matches\":[{\"context\":[{\"line\":6,\"text\":\" * @extends AbstractHandler<\\\\XF\\\\Entity\\\\Post>\"},{\"line\":7,\"text\":\" */\"},{\"line\":8,\"text\":\"class PostHandler extends AbstractHandler\"},{\"line\":9,\"text\":\"{\"},{\"line\":10,\"text\":\"\\tpublic function getEntityWith()\"},{\"line\":11,\"text\":\"\\t{\"},{\"line\":12,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":13,\"text\":\"\"},{\"line\":14,\"text\":\"\\t\\treturn ['Thread', 'Thread.Forum', 'Thread.Forum.Node.Permissions|' . $visitor->permission_combination_id];\"}],\"line\":8,\"text\":\"class PostHandler extends AbstractHandler\"},{\"context\":[{\"line\":8,\"text\":\"class PostHandler extends AbstractHandler\"},{\"line\":9,\"text\":\"{\"},{\"line\":10,\"text\":\"\\tpublic function getEntityWith()\"},{\"line\":11,\"text\":\"\\t{\"},{\"line\":12,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":13,\"text\":\"\"},{\"line\":14,\"text\":\"\\t\\treturn ['Thread', 'Thread.Forum', 'Thread.Forum.Node.Permissions|' . $visitor->permission_combination_id];\"},{\"line\":15,\"text\":\"\\t}\"},{\"line\":16,\"text\":\"\"}],\"line\":10,\"text\":\"\\tpublic function getEntityWith()\"},{\"context\":[{\"line\":15,\"text\":\"\\t}\"},{\"line\":16,\"text\":\"\"},{\"line\":17,\"text\":\"\\tpublic function getOptOutActions()\"},{\"line\":18,\"text\":\"\\t{\"},{\"line\":19,\"text\":\"\\t\\treturn [\"},{\"line\":20,\"text\":\"\\t\\t\\t'forumwatch_insert',\"},{\"line\":21,\"text\":\"\\t\\t\\t'insert',\"},{\"line\":22,\"text\":\"\\t\\t\\t'quote',\"},{\"line\":23,\"text\":\"\\t\\t\\t'mention',\"}],\"line\":17,\"text\":\"\\tpublic function getOptOutActions()\"},{\"context\":[{\"line\":26,\"text\":\"\\t}\"},{\"line\":27,\"text\":\"\"},{\"line\":28,\"text\":\"\\tpublic function getOptOutDisplayOrder()\"},{\"line\":29,\"text\":\"\\t{\"},{\"line\":30,\"text\":\"\\t\\treturn 100;\"},{\"line\":31,\"text\":\"\\t}\"},{\"line\":32,\"text\":\"}\"}],\"line\":28,\"text\":\"\\tpublic function getOptOutDisplayOrder()\"}],\"path\":\"/var/www/forums/newfi/public/src/XF/Alert/PostHandler.php\",\"present\":true,\"sha256\":\"d74153b3b727580b34214db2d787695b04d7969a2f251d3575f5fad1389013b1\"},\"service_worker\":{\"bytes\":6000,\"matches\":[{\"context\":[{\"line\":38,\"text\":\"{\"},{\"line\":39,\"text\":\"\\tconst clientId = event.source.id\"},{\"line\":40,\"text\":\"\\tconst message = event.data\"},{\"line\":41,\"text\":\"\\tif (typeof message !== 'object' || message === null)\"},{\"line\":42,\"text\":\"\\t{\"},{\"line\":43,\"text\":\"\\t\\tconsole.error('Invalid message:', message)\"},{\"line\":44,\"text\":\"\\t\\treturn\"},{\"line\":45,\"text\":\"\\t}\"},{\"line\":46,\"text\":\"\"}],\"line\":40,\"text\":\"\\tconst message = event.data\"},{\"context\":[{\"line\":83,\"text\":\"})\"},{\"line\":84,\"text\":\"\"},{\"line\":85,\"text\":\"self.addEventListener('push', event =>\"},{\"line\":86,\"text\":\"{\"},{\"line\":87,\"text\":\"\\tif (!(self.Notification && self.Notification.permission === 'granted'))\"},{\"line\":88,\"text\":\"\\t{\"},{\"line\":89,\"text\":\"\\t\\treturn\"},{\"line\":90,\"text\":\"\\t}\"},{\"line\":91,\"text\":\"\"}],\"line\":85,\"text\":\"self.addEventListener('push', event =>\"},{\"context\":[{\"line\":94,\"text\":\"\\ttry\"},{\"line\":95,\"text\":\"\\t{\"},{\"line\":96,\"text\":\"\\t\\tdata = event.data.json()\"},{\"line\":97,\"text\":\"\\t}\"},{\"line\":98,\"text\":\"\\tcatch (e)\"},{\"line\":99,\"text\":\"\\t{\"},{\"line\":100,\"text\":\"\\t\\tconsole.warn('Received push notification but payload not in the expected format.', e)\"},{\"line\":101,\"text\":\"\\t\\tconsole.warn('Received data:', event.data.text())\"},{\"line\":102,\"text\":\"\\t\\treturn\"}],\"line\":96,\"text\":\"\\t\\tdata = event.data.json()\"},{\"context\":[{\"line\":99,\"text\":\"\\t{\"},{\"line\":100,\"text\":\"\\t\\tconsole.warn('Received push notification but payload not in the expected format.', e)\"},{\"line\":101,\"text\":\"\\t\\tconsole.warn('Received data:', event.data.text())\"},{\"line\":102,\"text\":\"\\t\\treturn\"},{\"line\":103,\"text\":\"\\t}\"},{\"line\":104,\"text\":\"\"},{\"line\":105,\"text\":\"\\tif (!data || !data.title || !data.body)\"},{\"line\":106,\"text\":\"\\t{\"},{\"line\":107,\"text\":\"\\t\\tconsole.warn('Received push notification but no payload data or required fields missing.', data)\"}],\"line\":101,\"text\":\"\\t\\tconsole.warn('Received data:', event.data.text())\"},{\"context\":[{\"line\":123,\"text\":\"\\t}\"},{\"line\":124,\"text\":\"\"},{\"line\":125,\"text\":\"\\tconst notificationPromise = self.registration.showNotification(data.title, options)\"},{\"line\":126,\"text\":\"\"},{\"line\":127,\"text\":\"\\tif ('setAppBadge' in self.navigator && 'clearAppBadge' in self.navigator)\"},{\"line\":128,\"text\":\"\\t{\"},{\"line\":129,\"text\":\"\\t\\tlet newCount = parseInt(String(data.total_unread).replace(/[,. ]/g, ''))\"},{\"line\":130,\"text\":\"\"},{\"line\":131,\"text\":\"\\t\\tif (newCount)\"}],\"line\":125,\"text\":\"\\tconst notificationPromise = self.registration.showNotification(data.title, options)\"},{\"context\":[{\"line\":142,\"text\":\"})\"},{\"line\":143,\"text\":\"\"},{\"line\":144,\"text\":\"self.addEventListener('notificationclick', event =>\"},{\"line\":145,\"text\":\"{\"},{\"line\":146,\"text\":\"\\tconst notification = event.notification\"},{\"line\":147,\"text\":\"\\tnotification.close()\"},{\"line\":148,\"text\":\"\"},{\"line\":149,\"text\":\"\\tconst url = notification.data.url\"},{\"line\":150,\"text\":\"\\tif (!url)\"}],\"line\":144,\"text\":\"self.addEventListener('notificationclick', event =>\"},{\"context\":[{\"line\":147,\"text\":\"\\tnotification.close()\"},{\"line\":148,\"text\":\"\"},{\"line\":149,\"text\":\"\\tconst url = notification.data.url\"},{\"line\":150,\"text\":\"\\tif (!url)\"},{\"line\":151,\"text\":\"\\t{\"},{\"line\":152,\"text\":\"\\t\\treturn\"},{\"line\":153,\"text\":\"\\t}\"},{\"line\":154,\"text\":\"\"},{\"line\":155,\"text\":\"\\tconst urlToOpen = new URL(url, self.location.origin).href\"}],\"line\":149,\"text\":\"\\tconst url = notification.data.url\"}],\"path\":\"/var/www/forums/newfi/public/service_worker.js\",\"present\":true,\"sha256\":\"e422cd54e00c05c4e7a7a803894b95826f2ada4a2e3e5129eba742d95dcfa4f9\"},\"user_alert_entity\":{\"bytes\":6367,\"matches\":[{\"context\":[{\"line\":14,\"text\":\" * @property int $user_id\"},{\"line\":15,\"text\":\" * @property string $username\"},{\"line\":16,\"text\":\" * @property string $content_type\"},{\"line\":17,\"text\":\" * @property int $content_id\"},{\"line\":18,\"text\":\" * @property string $action\"},{\"line\":19,\"text\":\" * @property int $event_date\"},{\"line\":20,\"text\":\" * @property int $view_date\"},{\"line\":21,\"text\":\" * @property int $read_date\"},{\"line\":22,\"text\":\" * @property bool $auto_read\"}],\"line\":16,\"text\":\" * @property string $content_type\"},{\"context\":[{\"line\":15,\"text\":\" * @property string $username\"},{\"line\":16,\"text\":\" * @property string $content_type\"},{\"line\":17,\"text\":\" * @property int $content_id\"},{\"line\":18,\"text\":\" * @property string $action\"},{\"line\":19,\"text\":\" * @property int $event_date\"},{\"line\":20,\"text\":\" * @property int $view_date\"},{\"line\":21,\"text\":\" * @property int $read_date\"},{\"line\":22,\"text\":\" * @property bool $auto_read\"},{\"line\":23,\"text\":\" * @property array|null $extra_data\"}],\"line\":17,\"text\":\" * @property int $content_id\"},{\"context\":[{\"line\":16,\"text\":\" * @property string $content_type\"},{\"line\":17,\"text\":\" * @property int $content_id\"},{\"line\":18,\"text\":\" * @property string $action\"},{\"line\":19,\"text\":\" * @property int $event_date\"},{\"line\":20,\"text\":\" * @property int $view_date\"},{\"line\":21,\"text\":\" * @property int $read_date\"},{\"line\":22,\"text\":\" * @property bool $auto_read\"},{\"line\":23,\"text\":\" * @property array|null $extra_data\"},{\"line\":24,\"text\":\" * @property string $depends_on_addon_id\"}],\"line\":18,\"text\":\" * @property string $action\"},{\"context\":[{\"line\":21,\"text\":\" * @property int $read_date\"},{\"line\":22,\"text\":\" * @property bool $auto_read\"},{\"line\":23,\"text\":\" * @property array|null $extra_data\"},{\"line\":24,\"text\":\" * @property string $depends_on_addon_id\"},{\"line\":25,\"text\":\" *\"},{\"line\":26,\"text\":\" * GETTERS\"},{\"line\":27,\"text\":\" * @property-read Entity|null $Content\"},{\"line\":28,\"text\":\" *\"},{\"line\":29,\"text\":\" * RELATIONS\"}],\"line\":23,\"text\":\" * @property array|null $extra_data\"},{\"context\":[{\"line\":22,\"text\":\" * @property bool $auto_read\"},{\"line\":23,\"text\":\" * @property array|null $extra_data\"},{\"line\":24,\"text\":\" * @property string $depends_on_addon_id\"},{\"line\":25,\"text\":\" *\"},{\"line\":26,\"text\":\" * GETTERS\"},{\"line\":27,\"text\":\" * @property-read Entity|null $Content\"},{\"line\":28,\"text\":\" *\"},{\"line\":29,\"text\":\" * RELATIONS\"},{\"line\":30,\"text\":\" * @property-read User|null $User\"}],\"line\":24,\"text\":\" * @property string $depends_on_addon_id\"},{\"context\":[{\"line\":49,\"text\":\"\\t}\"},{\"line\":50,\"text\":\"\"},{\"line\":51,\"text\":\"\\tpublic function getHandler()\"},{\"line\":52,\"text\":\"\\t{\"},{\"line\":53,\"text\":\"\\t\\treturn $this->getAlertRepo()->getAlertHandler($this->content_type);\"},{\"line\":54,\"text\":\"\\t}\"},{\"line\":55,\"text\":\"\"},{\"line\":56,\"text\":\"\\t/**\"},{\"line\":57,\"text\":\"\\t * @return Entity|null\"}],\"line\":51,\"text\":\"\\tpublic function getHandler()\"},{\"context\":[{\"line\":51,\"text\":\"\\tpublic function getHandler()\"},{\"line\":52,\"text\":\"\\t{\"},{\"line\":53,\"text\":\"\\t\\treturn $this->getAlertRepo()->getAlertHandler($this->content_type);\"},{\"line\":54,\"text\":\"\\t}\"},{\"line\":55,\"text\":\"\"},{\"line\":56,\"text\":\"\\t/**\"},{\"line\":57,\"text\":\"\\t * @return Entity|null\"},{\"line\":58,\"text\":\"\\t */\"},{\"line\":59,\"text\":\"\\tpublic function getContent()\"}],\"line\":53,\"text\":\"\\t\\treturn $this->getAlertRepo()->getAlertHandler($this->content_type);\"},{\"context\":[{\"line\":57,\"text\":\"\\t * @return Entity|null\"},{\"line\":58,\"text\":\"\\t */\"},{\"line\":59,\"text\":\"\\tpublic function getContent()\"},{\"line\":60,\"text\":\"\\t{\"},{\"line\":61,\"text\":\"\\t\\t$handler = $this->getHandler();\"},{\"line\":62,\"text\":\"\\t\\treturn $handler ? $handler->getContent($this->content_id) : null;\"},{\"line\":63,\"text\":\"\\t}\"},{\"line\":64,\"text\":\"\"},{\"line\":65,\"text\":\"\\tpublic function setContent(?Entity $content = null)\"}],\"line\":59,\"text\":\"\\tpublic function getContent()\"},{\"context\":[{\"line\":60,\"text\":\"\\t{\"},{\"line\":61,\"text\":\"\\t\\t$handler = $this->getHandler();\"},{\"line\":62,\"text\":\"\\t\\treturn $handler ? $handler->getContent($this->content_id) : null;\"},{\"line\":63,\"text\":\"\\t}\"},{\"line\":64,\"text\":\"\"},{\"line\":65,\"text\":\"\\tpublic function setContent(?Entity $content = null)\"},{\"line\":66,\"text\":\"\\t{\"},{\"line\":67,\"text\":\"\\t\\t$this->_getterCache['Content'] = $content;\"},{\"line\":68,\"text\":\"\\t}\"}],\"line\":62,\"text\":\"\\t\\treturn $handler ? $handler->getContent($this->content_id) : null;\"},{\"context\":[{\"line\":68,\"text\":\"\\t}\"},{\"line\":69,\"text\":\"\"},{\"line\":70,\"text\":\"\\tpublic function render()\"},{\"line\":71,\"text\":\"\\t{\"},{\"line\":72,\"text\":\"\\t\\t$handler = $this->getHandler();\"},{\"line\":73,\"text\":\"\\t\\treturn $handler ? $handler->render($this) : '';\"},{\"line\":74,\"text\":\"\\t}\"},{\"line\":75,\"text\":\"\"},{\"line\":76,\"text\":\"\\tpublic function isAlertRenderable()\"}],\"line\":70,\"text\":\"\\tpublic function render()\"},{\"context\":[{\"line\":209,\"text\":\"\\t}\"},{\"line\":210,\"text\":\"\"},{\"line\":211,\"text\":\"\\tpublic static function getStructure(Structure $structure)\"},{\"line\":212,\"text\":\"\\t{\"},{\"line\":213,\"text\":\"\\t\\t$structure->table = 'xf_user_alert';\"},{\"line\":214,\"text\":\"\\t\\t$structure->shortName = 'XF:UserAlert';\"},{\"line\":215,\"text\":\"\\t\\t$structure->primaryKey = 'alert_id';\"},{\"line\":216,\"text\":\"\\t\\t$structure->columns = [\"},{\"line\":217,\"text\":\"\\t\\t\\t'alert_id' => ['type' => self::UINT, 'autoIncrement' => true, 'nullable' => true],\"}],\"line\":211,\"text\":\"\\tpublic static function getStructure(Structure $structure)\"},{\"context\":[{\"line\":219,\"text\":\"\\t\\t\\t'user_id' => ['type' => self::UINT, 'default' => 0, 'api' => true],\"},{\"line\":220,\"text\":\"\\t\\t\\t'username' => ['type' => self::STR, 'maxLength' => 50, 'default' => '', 'api' => true],\"},{\"line\":221,\"text\":\"\\t\\t\\t'content_type' => ['type' => self::STR, 'maxLength' => 25, 'required' => true, 'api' => true],\"},{\"line\":222,\"text\":\"\\t\\t\\t'content_id' => ['type' => self::UINT, 'required' => true, 'api' => true],\"},{\"line\":223,\"text\":\"\\t\\t\\t'action' => ['type' => self::STR, 'maxLength' => 30, 'required' => true, 'api' => true],\"},{\"line\":224,\"text\":\"\\t\\t\\t'event_date' => ['type' => self::UINT, 'default' => \\\\XF::$time, 'api' => true],\"},{\"line\":225,\"text\":\"\\t\\t\\t'view_date' => ['type' => self::UINT, 'default' => 0, 'api' => true],\"},{\"line\":226,\"text\":\"\\t\\t\\t'read_date' => ['type' => self::UINT, 'default' => 0, 'api' => true],\"},{\"line\":227,\"text\":\"\\t\\t\\t'auto_read' => ['type' => self::BOOL, 'default' => true, 'api' => true],\"}],\"line\":221,\"text\":\"\\t\\t\\t'content_type' => ['type' => self::STR, 'maxLength' => 25, 'required' => true, 'api' => true],\"},{\"context\":[{\"line\":220,\"text\":\"\\t\\t\\t'username' => ['type' => self::STR, 'maxLength' => 50, 'default' => '', 'api' => true],\"},{\"line\":221,\"text\":\"\\t\\t\\t'content_type' => ['type' => self::STR, 'maxLength' => 25, 'required' => true, 'api' => true],\"},{\"line\":222,\"text\":\"\\t\\t\\t'content_id' => ['type' => self::UINT, 'required' => true, 'api' => true],\"},{\"line\":223,\"text\":\"\\t\\t\\t'action' => ['type' => self::STR, 'maxLength' => 30, 'required' => true, 'api' => true],\"},{\"line\":224,\"text\":\"\\t\\t\\t'event_date' => ['type' => self::UINT, 'default' => \\\\XF::$time, 'api' => true],\"},{\"line\":225,\"text\":\"\\t\\t\\t'view_date' => ['type' => self::UINT, 'default' => 0, 'api' => true],\"},{\"line\":226,\"text\":\"\\t\\t\\t'read_date' => ['type' => self::UINT, 'default' => 0, 'api' => true],\"},{\"line\":227,\"text\":\"\\t\\t\\t'auto_read' => ['type' => self::BOOL, 'default' => true, 'api' => true],\"},{\"line\":228,\"text\":\"\\t\\t\\t'extra_data' => ['type' => self::JSON_ARRAY, 'default' => []],\"}],\"line\":222,\"text\":\"\\t\\t\\t'content_id' => ['type' => self::UINT, 'required' => true, 'api' => true],\"},{\"context\":[{\"line\":221,\"text\":\"\\t\\t\\t'content_type' => ['type' => self::STR, 'maxLength' => 25, 'required' => true, 'api' => true],\"},{\"line\":222,\"text\":\"\\t\\t\\t'content_id' => ['type' => self::UINT, 'required' => true, 'api' => true],\"},{\"line\":223,\"text\":\"\\t\\t\\t'action' => ['type' => self::STR, 'maxLength' => 30, 'required' => true, 'api' => true],\"},{\"line\":224,\"text\":\"\\t\\t\\t'event_date' => ['type' => self::UINT, 'default' => \\\\XF::$time, 'api' => true],\"},{\"line\":225,\"text\":\"\\t\\t\\t'view_date' => ['type' => self::UINT, 'default' => 0, 'api' => true],\"},{\"line\":226,\"text\":\"\\t\\t\\t'read_date' => ['type' => self::UINT, 'default' => 0, 'api' => true],\"},{\"line\":227,\"text\":\"\\t\\t\\t'auto_read' => ['type' => self::BOOL, 'default' => true, 'api' => true],\"},{\"line\":228,\"text\":\"\\t\\t\\t'extra_data' => ['type' => self::JSON_ARRAY, 'default' => []],\"},{\"line\":229,\"text\":\"\\t\\t\\t'depends_on_addon_id' => ['type' => self::BINARY, 'maxLength' => 50, 'default' => ''],\"}],\"line\":223,\"text\":\"\\t\\t\\t'action' => ['type' => self::STR, 'maxLength' => 30, 'required' => true, 'api' => true],\"},{\"context\":[{\"line\":226,\"text\":\"\\t\\t\\t'read_date' => ['type' => self::UINT, 'default' => 0, 'api' => true],\"},{\"line\":227,\"text\":\"\\t\\t\\t'auto_read' => ['type' => self::BOOL, 'default' => true, 'api' => true],\"},{\"line\":228,\"text\":\"\\t\\t\\t'extra_data' => ['type' => self::JSON_ARRAY, 'default' => []],\"},{\"line\":229,\"text\":\"\\t\\t\\t'depends_on_addon_id' => ['type' => self::BINARY, 'maxLength' => 50, 'default' => ''],\"},{\"line\":230,\"text\":\"\\t\\t];\"},{\"line\":231,\"text\":\"\\t\\t$structure->getters = [\"},{\"line\":232,\"text\":\"\\t\\t\\t'Content' => true,\"},{\"line\":233,\"text\":\"\\t\\t];\"},{\"line\":234,\"text\":\"\\t\\t$structure->relations = [\"}],\"line\":228,\"text\":\"\\t\\t\\t'extra_data' => ['type' => self::JSON_ARRAY, 'default' => []],\"},{\"context\":[{\"line\":227,\"text\":\"\\t\\t\\t'auto_read' => ['type' => self::BOOL, 'default' => true, 'api' => true],\"},{\"line\":228,\"text\":\"\\t\\t\\t'extra_data' => ['type' => self::JSON_ARRAY, 'default' => []],\"},{\"line\":229,\"text\":\"\\t\\t\\t'depends_on_addon_id' => ['type' => self::BINARY, 'maxLength' => 50, 'default' => ''],\"},{\"line\":230,\"text\":\"\\t\\t];\"},{\"line\":231,\"text\":\"\\t\\t$structure->getters = [\"},{\"line\":232,\"text\":\"\\t\\t\\t'Content' => true,\"},{\"line\":233,\"text\":\"\\t\\t];\"},{\"line\":234,\"text\":\"\\t\\t$structure->relations = [\"},{\"line\":235,\"text\":\"\\t\\t\\t'User' => [\"}],\"line\":229,\"text\":\"\\t\\t\\t'depends_on_addon_id' => ['type' => self::BINARY, 'maxLength' => 50, 'default' => ''],\"},{\"context\":[{\"line\":249,\"text\":\"\\t\\t\\t\\t'entity' => 'XF:AddOn',\"},{\"line\":250,\"text\":\"\\t\\t\\t\\t'type' => self::TO_ONE,\"},{\"line\":251,\"text\":\"\\t\\t\\t\\t'conditions' => [['addon_id', '=', '$depends_on_addon_id']],\"},{\"line\":252,\"text\":\"\\t\\t\\t\\t'primary' => true,\"},{\"line\":253,\"text\":\"\\t\\t\\t],\"},{\"line\":254,\"text\":\"\\t\\t];\"},{\"line\":255,\"text\":\"\\t\\t$structure->options = [\"},{\"line\":256,\"text\":\"\\t\\t\\t'force_unread_in_ui' => false,\"},{\"line\":257,\"text\":\"\\t\\t];\"}],\"line\":251,\"text\":\"\\t\\t\\t\\t'conditions' => [['addon_id', '=', '$depends_on_addon_id']],\"}],\"path\":\"/var/www/forums/newfi/public/src/XF/Entity/UserAlert.php\",\"present\":true,\"sha256\":\"a749d5470269ec4fa9cc9fe419b9e4446208d8914e905ce5d8442292494a5cd2\"},\"user_alert_repo\":{\"bytes\":21675,\"matches\":[{\"context\":[{\"line\":12,\"text\":\"use XF\\\\Mvc\\\\Entity\\\\Finder;\"},{\"line\":13,\"text\":\"use XF\\\\Mvc\\\\Entity\\\\Repository;\"},{\"line\":14,\"text\":\"use XF\\\\Service\\\\Alert\\\\PusherService;\"},{\"line\":15,\"text\":\"\"},{\"line\":16,\"text\":\"use function count, is_array;\"},{\"line\":17,\"text\":\"\"},{\"line\":18,\"text\":\"class UserAlertRepository extends Repository\"},{\"line\":19,\"text\":\"{\"},{\"line\":20,\"text\":\"\\t/**\"}],\"line\":14,\"text\":\"use XF\\\\Service\\\\Alert\\\\PusherService;\"},{\"context\":[{\"line\":24,\"text\":\"\\t * @return UserAlertFinder\"},{\"line\":25,\"text\":\"\\t */\"},{\"line\":26,\"text\":\"\\tpublic function findAlertsForUser($userId, $cutOff = null)\"},{\"line\":27,\"text\":\"\\t{\"},{\"line\":28,\"text\":\"\\t\\t$finder = $this->finder(UserAlertFinder::class)\"},{\"line\":29,\"text\":\"\\t\\t\\t->where('alerted_user_id', $userId)\"},{\"line\":30,\"text\":\"\\t\\t\\t->whereAddOnActive([\"},{\"line\":31,\"text\":\"\\t\\t\\t\\t'column' => 'depends_on_addon_id',\"},{\"line\":32,\"text\":\"\\t\\t\\t])\"}],\"line\":26,\"text\":\"\\tpublic function findAlertsForUser($userId, $cutOff = null)\"},{\"context\":[{\"line\":55,\"text\":\"\\t * @return bool\"},{\"line\":56,\"text\":\"\\t */\"},{\"line\":57,\"text\":\"\\tpublic function userReceivesAlert(User $receiver, $senderId, $contentType, $action)\"},{\"line\":58,\"text\":\"\\t{\"},{\"line\":59,\"text\":\"\\t\\tif (!$receiver->user_id || $receiver->is_banned)\"},{\"line\":60,\"text\":\"\\t\\t{\"},{\"line\":61,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":62,\"text\":\"\\t\\t}\"},{\"line\":63,\"text\":\"\"}],\"line\":57,\"text\":\"\\tpublic function userReceivesAlert(User $receiver, $senderId, $contentType, $action)\"},{\"context\":[{\"line\":73,\"text\":\"\"},{\"line\":74,\"text\":\"\\t\\t$userOption = $receiver->Option;\"},{\"line\":75,\"text\":\"\\t\\treturn $userOption->doesReceiveAlert($contentType, $action);\"},{\"line\":76,\"text\":\"\\t}\"},{\"line\":77,\"text\":\"\"},{\"line\":78,\"text\":\"\\t/**\"},{\"line\":79,\"text\":\"\\t * @param int $senderId\"},{\"line\":80,\"text\":\"\\t * @param string $contentType\"},{\"line\":81,\"text\":\"\\t * @param string $action\"}],\"line\":75,\"text\":\"\\t\\treturn $userOption->doesReceiveAlert($contentType, $action);\"},{\"context\":[{\"line\":83,\"text\":\"\\t * @return bool\"},{\"line\":84,\"text\":\"\\t */\"},{\"line\":85,\"text\":\"\\tpublic function userReceivesPush(User $receiver, $senderId, $contentType, $action)\"},{\"line\":86,\"text\":\"\\t{\"},{\"line\":87,\"text\":\"\\t\\tif (!$receiver->user_id || $receiver->is_banned)\"},{\"line\":88,\"text\":\"\\t\\t{\"},{\"line\":89,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":90,\"text\":\"\\t\\t}\"},{\"line\":91,\"text\":\"\"}],\"line\":85,\"text\":\"\\tpublic function userReceivesPush(User $receiver, $senderId, $contentType, $action)\"},{\"context\":[{\"line\":101,\"text\":\"\"},{\"line\":102,\"text\":\"\\t\\t$userOption = $receiver->Option;\"},{\"line\":103,\"text\":\"\\t\\treturn $userOption->doesReceivePush($contentType, $action);\"},{\"line\":104,\"text\":\"\\t}\"},{\"line\":105,\"text\":\"\"},{\"line\":106,\"text\":\"\\t/**\"},{\"line\":107,\"text\":\"\\t * @param string $contentType\"},{\"line\":108,\"text\":\"\\t * @param int $contentId\"},{\"line\":109,\"text\":\"\\t * @param string $action\"}],\"line\":103,\"text\":\"\\t\\treturn $userOption->doesReceivePush($contentType, $action);\"},{\"context\":[{\"line\":113,\"text\":\"\\t * @return bool\"},{\"line\":114,\"text\":\"\\t */\"},{\"line\":115,\"text\":\"\\tpublic function alertFromUser(\"},{\"line\":116,\"text\":\"\\t\\tUser $receiver,\"},{\"line\":117,\"text\":\"\\t\\t?User $sender,\"},{\"line\":118,\"text\":\"\\t\\t$contentType,\"},{\"line\":119,\"text\":\"\\t\\t$contentId,\"},{\"line\":120,\"text\":\"\\t\\t$action,\"},{\"line\":121,\"text\":\"\\t\\tarray $extra = [],\"}],\"line\":115,\"text\":\"\\tpublic function alertFromUser(\"},{\"context\":[{\"line\":126,\"text\":\"\\t\\t$senderName = $sender ? $sender->username : '';\"},{\"line\":127,\"text\":\"\"},{\"line\":128,\"text\":\"\\t\\tif (!$this->userReceivesAlert($receiver, $senderId, $contentType, $action))\"},{\"line\":129,\"text\":\"\\t\\t{\"},{\"line\":130,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":131,\"text\":\"\\t\\t}\"},{\"line\":132,\"text\":\"\"},{\"line\":133,\"text\":\"\\t\\treturn $this->insertAlert($receiver->user_id, $senderId, $senderName, $contentType, $contentId, $action, $extra, $options);\"},{\"line\":134,\"text\":\"\\t}\"}],\"line\":128,\"text\":\"\\t\\tif (!$this->userReceivesAlert($receiver, $senderId, $contentType, $action))\"},{\"context\":[{\"line\":131,\"text\":\"\\t\\t}\"},{\"line\":132,\"text\":\"\"},{\"line\":133,\"text\":\"\\t\\treturn $this->insertAlert($receiver->user_id, $senderId, $senderName, $contentType, $contentId, $action, $extra, $options);\"},{\"line\":134,\"text\":\"\\t}\"},{\"line\":135,\"text\":\"\"},{\"line\":136,\"text\":\"\\t/**\"},{\"line\":137,\"text\":\"\\t * @param int $senderId\"},{\"line\":138,\"text\":\"\\t * @param string $senderName\"},{\"line\":139,\"text\":\"\\t * @param string $contentType\"}],\"line\":133,\"text\":\"\\t\\treturn $this->insertAlert($receiver->user_id, $senderId, $senderName, $contentType, $contentId, $action, $extra, $options);\"},{\"context\":[{\"line\":145,\"text\":\"\\t * @return bool\"},{\"line\":146,\"text\":\"\\t */\"},{\"line\":147,\"text\":\"\\tpublic function alert(\"},{\"line\":148,\"text\":\"\\t\\tUser $receiver,\"},{\"line\":149,\"text\":\"\\t\\t$senderId,\"},{\"line\":150,\"text\":\"\\t\\t$senderName,\"},{\"line\":151,\"text\":\"\\t\\t$contentType,\"},{\"line\":152,\"text\":\"\\t\\t$contentId,\"},{\"line\":153,\"text\":\"\\t\\t$action,\"}],\"line\":147,\"text\":\"\\tpublic function alert(\"},{\"context\":[{\"line\":156,\"text\":\"\\t)\"},{\"line\":157,\"text\":\"\\t{\"},{\"line\":158,\"text\":\"\\t\\tif (!$this->userReceivesAlert($receiver, $senderId, $contentType, $action))\"},{\"line\":159,\"text\":\"\\t\\t{\"},{\"line\":160,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":161,\"text\":\"\\t\\t}\"},{\"line\":162,\"text\":\"\"},{\"line\":163,\"text\":\"\\t\\treturn $this->insertAlert($receiver->user_id, $senderId, $senderName, $contentType, $contentId, $action, $extra, $options);\"},{\"line\":164,\"text\":\"\\t}\"}],\"line\":158,\"text\":\"\\t\\tif (!$this->userReceivesAlert($receiver, $senderId, $contentType, $action))\"},{\"context\":[{\"line\":161,\"text\":\"\\t\\t}\"},{\"line\":162,\"text\":\"\"},{\"line\":163,\"text\":\"\\t\\treturn $this->insertAlert($receiver->user_id, $senderId, $senderName, $contentType, $contentId, $action, $extra, $options);\"},{\"line\":164,\"text\":\"\\t}\"},{\"line\":165,\"text\":\"\"},{\"line\":166,\"text\":\"\\t/**\"},{\"line\":167,\"text\":\"\\t * @param int $receiverId\"},{\"line\":168,\"text\":\"\\t * @param int $senderId\"},{\"line\":169,\"text\":\"\\t * @param string $senderName\"}],\"line\":163,\"text\":\"\\t\\treturn $this->insertAlert($receiver->user_id, $senderId, $senderName, $contentType, $contentId, $action, $extra, $options);\"},{\"context\":[{\"line\":176,\"text\":\"\\t * @return bool\"},{\"line\":177,\"text\":\"\\t */\"},{\"line\":178,\"text\":\"\\tpublic function insertAlert(\"},{\"line\":179,\"text\":\"\\t\\t$receiverId,\"},{\"line\":180,\"text\":\"\\t\\t$senderId,\"},{\"line\":181,\"text\":\"\\t\\t$senderName,\"},{\"line\":182,\"text\":\"\\t\\t$contentType,\"},{\"line\":183,\"text\":\"\\t\\t$contentId,\"},{\"line\":184,\"text\":\"\\t\\t$action,\"}],\"line\":178,\"text\":\"\\tpublic function insertAlert(\"},{\"context\":[{\"line\":210,\"text\":\"\\t\\t}\"},{\"line\":211,\"text\":\"\"},{\"line\":212,\"text\":\"\\t\\t$alert = $this->em->create(UserAlert::class);\"},{\"line\":213,\"text\":\"\\t\\t$alert->alerted_user_id = $receiverId;\"},{\"line\":214,\"text\":\"\\t\\t$alert->user_id = $senderId;\"},{\"line\":215,\"text\":\"\\t\\t$alert->username = $senderName;\"},{\"line\":216,\"text\":\"\\t\\t$alert->content_type = $contentType;\"},{\"line\":217,\"text\":\"\\t\\t$alert->content_id = $contentId;\"},{\"line\":218,\"text\":\"\\t\\t$alert->action = $action;\"}],\"line\":212,\"text\":\"\\t\\t$alert = $this->em->create(UserAlert::class);\"},{\"context\":[{\"line\":223,\"text\":\"\\t\\t$alert->save();\"},{\"line\":224,\"text\":\"\"},{\"line\":225,\"text\":\"\\t\\tif ($alert->Receiver && $this->userReceivesPush($alert->Receiver, $senderId, $contentType, $action))\"},{\"line\":226,\"text\":\"\\t\\t{\"},{\"line\":227,\"text\":\"\\t\\t\\t$pusher = $this->app()->service(PusherService::class, $alert->Receiver, $alert);\"},{\"line\":228,\"text\":\"\\t\\t\\t$pusher->push();\"},{\"line\":229,\"text\":\"\\t\\t}\"},{\"line\":230,\"text\":\"\"},{\"line\":231,\"text\":\"\\t\\treturn true;\"}],\"line\":225,\"text\":\"\\t\\tif ($alert->Receiver && $this->userReceivesPush($alert->Receiver, $senderId, $contentType, $action))\"},{\"context\":[{\"line\":225,\"text\":\"\\t\\tif ($alert->Receiver && $this->userReceivesPush($alert->Receiver, $senderId, $contentType, $action))\"},{\"line\":226,\"text\":\"\\t\\t{\"},{\"line\":227,\"text\":\"\\t\\t\\t$pusher = $this->app()->service(PusherService::class, $alert->Receiver, $alert);\"},{\"line\":228,\"text\":\"\\t\\t\\t$pusher->push();\"},{\"line\":229,\"text\":\"\\t\\t}\"},{\"line\":230,\"text\":\"\"},{\"line\":231,\"text\":\"\\t\\treturn true;\"},{\"line\":232,\"text\":\"\\t}\"},{\"line\":233,\"text\":\"\"}],\"line\":227,\"text\":\"\\t\\t\\t$pusher = $this->app()->service(PusherService::class, $alert->Receiver, $alert);\"},{\"context\":[{\"line\":226,\"text\":\"\\t\\t{\"},{\"line\":227,\"text\":\"\\t\\t\\t$pusher = $this->app()->service(PusherService::class, $alert->Receiver, $alert);\"},{\"line\":228,\"text\":\"\\t\\t\\t$pusher->push();\"},{\"line\":229,\"text\":\"\\t\\t}\"},{\"line\":230,\"text\":\"\"},{\"line\":231,\"text\":\"\\t\\treturn true;\"},{\"line\":232,\"text\":\"\\t}\"},{\"line\":233,\"text\":\"\"},{\"line\":234,\"text\":\"\\t/**\"}],\"line\":228,\"text\":\"\\t\\t\\t$pusher->push();\"},{\"context\":[{\"line\":238,\"text\":\"\\t * @param string $action\"},{\"line\":239,\"text\":\"\\t */\"},{\"line\":240,\"text\":\"\\tpublic function fastDeleteAlertsToUser($toUserId, $contentType, $contentId, $action)\"},{\"line\":241,\"text\":\"\\t{\"},{\"line\":242,\"text\":\"\\t\\t$finder = $this->finder(UserAlertFinder::class)\"},{\"line\":243,\"text\":\"\\t\\t\\t->where([\"},{\"line\":244,\"text\":\"\\t\\t\\t\\t'content_type' => $contentType,\"},{\"line\":245,\"text\":\"\\t\\t\\t\\t'content_id' => $contentId,\"},{\"line\":246,\"text\":\"\\t\\t\\t\\t'action' => $action,\"}],\"line\":240,\"text\":\"\\tpublic function fastDeleteAlertsToUser($toUserId, $contentType, $contentId, $action)\"},{\"context\":[{\"line\":258,\"text\":\"\\t * @param string $action\"},{\"line\":259,\"text\":\"\\t */\"},{\"line\":260,\"text\":\"\\tpublic function fastDeleteAlertsFromUser($fromUserId, $contentType, $contentId, $action)\"},{\"line\":261,\"text\":\"\\t{\"},{\"line\":262,\"text\":\"\\t\\t$finder = $this->finder(UserAlertFinder::class)\"},{\"line\":263,\"text\":\"\\t\\t\\t->where([\"},{\"line\":264,\"text\":\"\\t\\t\\t\\t'content_type' => $contentType,\"},{\"line\":265,\"text\":\"\\t\\t\\t\\t'content_id' => $contentId,\"},{\"line\":266,\"text\":\"\\t\\t\\t\\t'action' => $action,\"}],\"line\":260,\"text\":\"\\tpublic function fastDeleteAlertsFromUser($fromUserId, $contentType, $contentId, $action)\"},{\"context\":[{\"line\":276,\"text\":\"\\t * @param int[]|int $contentId\"},{\"line\":277,\"text\":\"\\t */\"},{\"line\":278,\"text\":\"\\tpublic function fastDeleteAlertsForContent($contentType, $contentId)\"},{\"line\":279,\"text\":\"\\t{\"},{\"line\":280,\"text\":\"\\t\\t$finder = $this->finder(UserAlertFinder::class)\"},{\"line\":281,\"text\":\"\\t\\t\\t->where([\"},{\"line\":282,\"text\":\"\\t\\t\\t\\t'content_type' => $contentType,\"},{\"line\":283,\"text\":\"\\t\\t\\t\\t'content_id' => $contentId,\"},{\"line\":284,\"text\":\"\\t\\t\\t]);\"}],\"line\":278,\"text\":\"\\tpublic function fastDeleteAlertsForContent($contentType, $contentId)\"},{\"context\":[{\"line\":292,\"text\":\"\\t * @return int Number of alerts deleted\"},{\"line\":293,\"text\":\"\\t */\"},{\"line\":294,\"text\":\"\\tprotected function deleteAlertsInternal(Finder $matches)\"},{\"line\":295,\"text\":\"\\t{\"},{\"line\":296,\"text\":\"\\t\\t$results = $matches->fetchColumns('alert_id', 'alerted_user_id', 'view_date', 'read_date');\"},{\"line\":297,\"text\":\"\\t\\tif (!$results)\"},{\"line\":298,\"text\":\"\\t\\t{\"},{\"line\":299,\"text\":\"\\t\\t\\treturn 0;\"},{\"line\":300,\"text\":\"\\t\\t}\"}],\"line\":294,\"text\":\"\\tprotected function deleteAlertsInternal(Finder $matches)\"},{\"context\":[{\"line\":362,\"text\":\"\\t * @param int|null $viewDate\"},{\"line\":363,\"text\":\"\\t */\"},{\"line\":364,\"text\":\"\\tpublic function markUserAlertsViewed(User $user, $viewDate = null)\"},{\"line\":365,\"text\":\"\\t{\"},{\"line\":366,\"text\":\"\\t\\t$this->markAllUserAlertsViewedOrRead($user, $viewDate);\"},{\"line\":367,\"text\":\"\\t}\"},{\"line\":368,\"text\":\"\"},{\"line\":369,\"text\":\"\\t/**\"},{\"line\":370,\"text\":\"\\t * @param int|null $viewDate\"}],\"line\":364,\"text\":\"\\tpublic function markUserAlertsViewed(User $user, $viewDate = null)\"},{\"context\":[{\"line\":370,\"text\":\"\\t * @param int|null $viewDate\"},{\"line\":371,\"text\":\"\\t */\"},{\"line\":372,\"text\":\"\\tpublic function markUserAlertViewed(UserAlert $alert, $viewDate = null)\"},{\"line\":373,\"text\":\"\\t{\"},{\"line\":374,\"text\":\"\\t\\tif (!$alert->Receiver || !$alert->isUnviewed())\"},{\"line\":375,\"text\":\"\\t\\t{\"},{\"line\":376,\"text\":\"\\t\\t\\treturn;\"},{\"line\":377,\"text\":\"\\t\\t}\"},{\"line\":378,\"text\":\"\"}],\"line\":372,\"text\":\"\\tpublic function markUserAlertViewed(UserAlert $alert, $viewDate = null)\"},{\"context\":[{\"line\":387,\"text\":\"\\t * @param int|null $readDate\"},{\"line\":388,\"text\":\"\\t */\"},{\"line\":389,\"text\":\"\\tpublic function markUserAlertsRead(User $user, $readDate = null)\"},{\"line\":390,\"text\":\"\\t{\"},{\"line\":391,\"text\":\"\\t\\t$this->markAllUserAlertsViewedOrRead($user, $readDate, true);\"},{\"line\":392,\"text\":\"\\t}\"},{\"line\":393,\"text\":\"\"},{\"line\":394,\"text\":\"\\t/**\"},{\"line\":395,\"text\":\"\\t * @param AbstractCollection $alerts\"}],\"line\":389,\"text\":\"\\tpublic function markUserAlertsRead(User $user, $readDate = null)\"},{\"context\":[{\"line\":396,\"text\":\"\\t * @param int|null $readDate\"},{\"line\":397,\"text\":\"\\t */\"},{\"line\":398,\"text\":\"\\tpublic function autoMarkUserAlertsRead(\"},{\"line\":399,\"text\":\"\\t\\tAbstractCollection $alerts,\"},{\"line\":400,\"text\":\"\\t\\tUser $user,\"},{\"line\":401,\"text\":\"\\t\\t$readDate = null\"},{\"line\":402,\"text\":\"\\t)\"},{\"line\":403,\"text\":\"\\t{\"},{\"line\":404,\"text\":\"\\t\\t$alerts = $alerts->filter(function (UserAlert $alert): bool\"}],\"line\":398,\"text\":\"\\tpublic function autoMarkUserAlertsRead(\"},{\"context\":[{\"line\":413,\"text\":\"\\t * @param AbstractCollection $alerts\"},{\"line\":414,\"text\":\"\\t */\"},{\"line\":415,\"text\":\"\\tprotected function markSpecificUserAlertsRead(\"},{\"line\":416,\"text\":\"\\t\\tAbstractCollection $alerts,\"},{\"line\":417,\"text\":\"\\t\\tUser $user,\"},{\"line\":418,\"text\":\"\\t\\t?int $readDate = null\"},{\"line\":419,\"text\":\"\\t)\"},{\"line\":420,\"text\":\"\\t{\"},{\"line\":421,\"text\":\"\\t\\tif (!$user->user_id)\"}],\"line\":415,\"text\":\"\\tprotected function markSpecificUserAlertsRead(\"},{\"context\":[{\"line\":455,\"text\":\"\\t * @param int|null $readDate\"},{\"line\":456,\"text\":\"\\t */\"},{\"line\":457,\"text\":\"\\tpublic function markUserAlertsReadForContent(\"},{\"line\":458,\"text\":\"\\t\\t$contentType,\"},{\"line\":459,\"text\":\"\\t\\t$contentIds,\"},{\"line\":460,\"text\":\"\\t\\t$onlyActions = null,\"},{\"line\":461,\"text\":\"\\t\\t?User $user = null,\"},{\"line\":462,\"text\":\"\\t\\t$readDate = null\"},{\"line\":463,\"text\":\"\\t)\"}],\"line\":457,\"text\":\"\\tpublic function markUserAlertsReadForContent(\"},{\"context\":[{\"line\":517,\"text\":\"\\t * @param int|null $readDate\"},{\"line\":518,\"text\":\"\\t */\"},{\"line\":519,\"text\":\"\\tpublic function markUserAlertRead(UserAlert $alert, $readDate = null)\"},{\"line\":520,\"text\":\"\\t{\"},{\"line\":521,\"text\":\"\\t\\tif (!$alert->Receiver || !$alert->isUnread())\"},{\"line\":522,\"text\":\"\\t\\t{\"},{\"line\":523,\"text\":\"\\t\\t\\treturn;\"},{\"line\":524,\"text\":\"\\t\\t}\"},{\"line\":525,\"text\":\"\"}],\"line\":519,\"text\":\"\\tpublic function markUserAlertRead(UserAlert $alert, $readDate = null)\"},{\"context\":[{\"line\":532,\"text\":\"\\t}\"},{\"line\":533,\"text\":\"\"},{\"line\":534,\"text\":\"\\tpublic function markUserAlertUnread(\"},{\"line\":535,\"text\":\"\\t\\tUserAlert $alert,\"},{\"line\":536,\"text\":\"\\t\\tbool $disableAutoRead = true\"},{\"line\":537,\"text\":\"\\t)\"},{\"line\":538,\"text\":\"\\t{\"},{\"line\":539,\"text\":\"\\t\\tif (!$alert->Receiver || $alert->isUnread())\"},{\"line\":540,\"text\":\"\\t\\t{\"}],\"line\":534,\"text\":\"\\tpublic function markUserAlertUnread(\"},{\"context\":[{\"line\":555,\"text\":\"\\t * not viewable.\"},{\"line\":556,\"text\":\"\\t */\"},{\"line\":557,\"text\":\"\\tpublic function markInaccessibleAlertsRead(User $user)\"},{\"line\":558,\"text\":\"\\t{\"},{\"line\":559,\"text\":\"\\t\\t$unreadAlerts = $this->finder(UserAlertFinder::class)\"},{\"line\":560,\"text\":\"\\t\\t\\t->where([\"},{\"line\":561,\"text\":\"\\t\\t\\t\\t'alerted_user_id' => $user->user_id,\"},{\"line\":562,\"text\":\"\\t\\t\\t\\t'read_date' => 0,\"},{\"line\":563,\"text\":\"\\t\\t\\t])\"}],\"line\":557,\"text\":\"\\tpublic function markInaccessibleAlertsRead(User $user)\"},{\"context\":[{\"line\":582,\"text\":\"\\t}\"},{\"line\":583,\"text\":\"\"},{\"line\":584,\"text\":\"\\tprotected function markAllUserAlertsViewedOrRead(\"},{\"line\":585,\"text\":\"\\t\\tUser $user,\"},{\"line\":586,\"text\":\"\\t\\t?int $viewDate = null,\"},{\"line\":587,\"text\":\"\\t\\tbool $markRead = false\"},{\"line\":588,\"text\":\"\\t): void\"},{\"line\":589,\"text\":\"\\t{\"},{\"line\":590,\"text\":\"\\t\\tif ($this->app()->request()->isPrefetch())\"}],\"line\":584,\"text\":\"\\tprotected function markAllUserAlertsViewedOrRead(\"},{\"context\":[{\"line\":652,\"text\":\"\\t * @param list $alertIds\"},{\"line\":653,\"text\":\"\\t */\"},{\"line\":654,\"text\":\"\\tprotected function markUserAlertsViewedOrRead(\"},{\"line\":655,\"text\":\"\\t\\tUser $user,\"},{\"line\":656,\"text\":\"\\t\\tarray $alertIds,\"},{\"line\":657,\"text\":\"\\t\\t?int $viewDate = null,\"},{\"line\":658,\"text\":\"\\t\\tbool $markRead = false,\"},{\"line\":659,\"text\":\"\\t\\tbool $updateAlertEntities = false\"},{\"line\":660,\"text\":\"\\t): void\"}],\"line\":654,\"text\":\"\\tprotected function markUserAlertsViewedOrRead(\"},{\"context\":[{\"line\":774,\"text\":\"\\t * @param list $alertIds\"},{\"line\":775,\"text\":\"\\t */\"},{\"line\":776,\"text\":\"\\tprotected function markUserAlertsUnread(\"},{\"line\":777,\"text\":\"\\t\\tUser $user,\"},{\"line\":778,\"text\":\"\\t\\tarray $alertIds,\"},{\"line\":779,\"text\":\"\\t\\tbool $disableAutoRead = true,\"},{\"line\":780,\"text\":\"\\t\\tbool $updateAlertEntities = false\"},{\"line\":781,\"text\":\"\\t): void\"},{\"line\":782,\"text\":\"\\t{\"}],\"line\":776,\"text\":\"\\tprotected function markUserAlertsUnread(\"},{\"context\":[{\"line\":884,\"text\":\"\\t * @return int Number of alerts deleted\"},{\"line\":885,\"text\":\"\\t */\"},{\"line\":886,\"text\":\"\\tpublic function pruneViewedAlerts($cutOff = null)\"},{\"line\":887,\"text\":\"\\t{\"},{\"line\":888,\"text\":\"\\t\\t$cutOff = $cutOff ?? \\\\XF::$time - $this->options()->alertExpiryDays * 86400;\"},{\"line\":889,\"text\":\"\"},{\"line\":890,\"text\":\"\\t\\t$finder = $this->finder(UserAlertFinder::class)\"},{\"line\":891,\"text\":\"\\t\\t\\t->where('view_date', '>', 0)\"},{\"line\":892,\"text\":\"\\t\\t\\t->where('view_date', '<', $cutOff)\"}],\"line\":886,\"text\":\"\\tpublic function pruneViewedAlerts($cutOff = null)\"},{\"context\":[{\"line\":901,\"text\":\"\\t * @return int Number of alerts deleted\"},{\"line\":902,\"text\":\"\\t */\"},{\"line\":903,\"text\":\"\\tpublic function pruneUnviewedAlerts($cutOff = null)\"},{\"line\":904,\"text\":\"\\t{\"},{\"line\":905,\"text\":\"\\t\\t$cutOff = $cutOff ?? \\\\XF::$time - 30 * 86400;\"},{\"line\":906,\"text\":\"\"},{\"line\":907,\"text\":\"\\t\\t$finder = $this->finder(UserAlertFinder::class)\"},{\"line\":908,\"text\":\"\\t\\t\\t->where('view_date', 0)\"},{\"line\":909,\"text\":\"\\t\\t\\t->where('event_date', '<', $cutOff)\"}],\"line\":903,\"text\":\"\\tpublic function pruneUnviewedAlerts($cutOff = null)\"},{\"context\":[{\"line\":916,\"text\":\"\\t * @return bool\"},{\"line\":917,\"text\":\"\\t */\"},{\"line\":918,\"text\":\"\\tpublic function updateUnviewedCountForUser(User $user)\"},{\"line\":919,\"text\":\"\\t{\"},{\"line\":920,\"text\":\"\\t\\tif (!$user->user_id)\"},{\"line\":921,\"text\":\"\\t\\t{\"},{\"line\":922,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":923,\"text\":\"\\t\\t}\"},{\"line\":924,\"text\":\"\"}],\"line\":918,\"text\":\"\\tpublic function updateUnviewedCountForUser(User $user)\"},{\"context\":[{\"line\":936,\"text\":\"\\t * @return bool\"},{\"line\":937,\"text\":\"\\t */\"},{\"line\":938,\"text\":\"\\tpublic function updateUnreadCountForUser(User $user)\"},{\"line\":939,\"text\":\"\\t{\"},{\"line\":940,\"text\":\"\\t\\tif (!$user->user_id)\"},{\"line\":941,\"text\":\"\\t\\t{\"},{\"line\":942,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":943,\"text\":\"\\t\\t}\"},{\"line\":944,\"text\":\"\"}],\"line\":938,\"text\":\"\\tpublic function updateUnreadCountForUser(User $user)\"},{\"context\":[{\"line\":956,\"text\":\"\\t * @return array\"},{\"line\":957,\"text\":\"\\t */\"},{\"line\":958,\"text\":\"\\tpublic function getAlertHandlers()\"},{\"line\":959,\"text\":\"\\t{\"},{\"line\":960,\"text\":\"\\t\\t$handlers = [];\"},{\"line\":961,\"text\":\"\"},{\"line\":962,\"text\":\"\\t\\tforeach (\\\\XF::app()->getContentTypeField('alert_handler_class') AS $contentType => $handlerClass)\"},{\"line\":963,\"text\":\"\\t\\t{\"},{\"line\":964,\"text\":\"\\t\\t\\tif (!class_exists($handlerClass))\"}],\"line\":958,\"text\":\"\\tpublic function getAlertHandlers()\"},{\"context\":[{\"line\":980,\"text\":\"\\t * @return AbstractHandler|null\"},{\"line\":981,\"text\":\"\\t */\"},{\"line\":982,\"text\":\"\\tpublic function getAlertHandler($type, $throw = false)\"},{\"line\":983,\"text\":\"\\t{\"},{\"line\":984,\"text\":\"\\t\\t$handlerClass = \\\\XF::app()->getContentTypeFieldValue($type, 'alert_handler_class');\"},{\"line\":985,\"text\":\"\\t\\tif (!$handlerClass)\"},{\"line\":986,\"text\":\"\\t\\t{\"},{\"line\":987,\"text\":\"\\t\\t\\tif ($throw)\"},{\"line\":988,\"text\":\"\\t\\t\\t{\"}],\"line\":982,\"text\":\"\\tpublic function getAlertHandler($type, $throw = false)\"},{\"context\":[{\"line\":1010,\"text\":\"\\t * @param AbstractCollection $alerts\"},{\"line\":1011,\"text\":\"\\t */\"},{\"line\":1012,\"text\":\"\\tpublic function addContentToAlerts($alerts)\"},{\"line\":1013,\"text\":\"\\t{\"},{\"line\":1014,\"text\":\"\\t\\t$contentMap = [];\"},{\"line\":1015,\"text\":\"\\t\\tforeach ($alerts AS $key => $alert)\"},{\"line\":1016,\"text\":\"\\t\\t{\"},{\"line\":1017,\"text\":\"\\t\\t\\t$contentType = $alert->content_type;\"},{\"line\":1018,\"text\":\"\\t\\t\\tif (!isset($contentMap[$contentType]))\"}],\"line\":1012,\"text\":\"\\tpublic function addContentToAlerts($alerts)\"},{\"context\":[{\"line\":1026,\"text\":\"\\t\\tforeach ($contentMap AS $contentType => $contentIds)\"},{\"line\":1027,\"text\":\"\\t\\t{\"},{\"line\":1028,\"text\":\"\\t\\t\\t$handler = $this->getAlertHandler($contentType);\"},{\"line\":1029,\"text\":\"\\t\\t\\tif (!$handler)\"},{\"line\":1030,\"text\":\"\\t\\t\\t{\"},{\"line\":1031,\"text\":\"\\t\\t\\t\\tcontinue;\"},{\"line\":1032,\"text\":\"\\t\\t\\t}\"},{\"line\":1033,\"text\":\"\"},{\"line\":1034,\"text\":\"\\t\\t\\t$data = $handler->getContent($contentIds);\"}],\"line\":1028,\"text\":\"\\t\\t\\t$handler = $this->getAlertHandler($contentType);\"},{\"context\":[{\"line\":1044,\"text\":\"\\t * @return array>\"},{\"line\":1045,\"text\":\"\\t */\"},{\"line\":1046,\"text\":\"\\tpublic function getAlertOptOuts()\"},{\"line\":1047,\"text\":\"\\t{\"},{\"line\":1048,\"text\":\"\\t\\t$handlers = $this->getAlertHandlers();\"},{\"line\":1049,\"text\":\"\"},{\"line\":1050,\"text\":\"\\t\\t$alertOptOuts = [];\"},{\"line\":1051,\"text\":\"\\t\\t$orderedTypes = [];\"},{\"line\":1052,\"text\":\"\"}],\"line\":1046,\"text\":\"\\tpublic function getAlertOptOuts()\"},{\"context\":[{\"line\":1046,\"text\":\"\\tpublic function getAlertOptOuts()\"},{\"line\":1047,\"text\":\"\\t{\"},{\"line\":1048,\"text\":\"\\t\\t$handlers = $this->getAlertHandlers();\"},{\"line\":1049,\"text\":\"\"},{\"line\":1050,\"text\":\"\\t\\t$alertOptOuts = [];\"},{\"line\":1051,\"text\":\"\\t\\t$orderedTypes = [];\"},{\"line\":1052,\"text\":\"\"},{\"line\":1053,\"text\":\"\\t\\tforeach ($handlers AS $contentType => $handler)\"},{\"line\":1054,\"text\":\"\\t\\t{\"}],\"line\":1048,\"text\":\"\\t\\t$handlers = $this->getAlertHandlers();\"},{\"context\":[{\"line\":1053,\"text\":\"\\t\\tforeach ($handlers AS $contentType => $handler)\"},{\"line\":1054,\"text\":\"\\t\\t{\"},{\"line\":1055,\"text\":\"\\t\\t\\t$optOuts = $handler->getOptOutsMap();\"},{\"line\":1056,\"text\":\"\\t\\t\\tif (!$optOuts)\"},{\"line\":1057,\"text\":\"\\t\\t\\t{\"},{\"line\":1058,\"text\":\"\\t\\t\\t\\tcontinue;\"},{\"line\":1059,\"text\":\"\\t\\t\\t}\"},{\"line\":1060,\"text\":\"\"},{\"line\":1061,\"text\":\"\\t\\t\\t$alertOptOuts[$contentType] = $optOuts;\"}],\"line\":1055,\"text\":\"\\t\\t\\t$optOuts = $handler->getOptOutsMap();\"},{\"context\":[{\"line\":1060,\"text\":\"\"},{\"line\":1061,\"text\":\"\\t\\t\\t$alertOptOuts[$contentType] = $optOuts;\"},{\"line\":1062,\"text\":\"\\t\\t\\t$orderedTypes[$contentType] = $handler->getOptOutDisplayOrder();\"},{\"line\":1063,\"text\":\"\\t\\t}\"},{\"line\":1064,\"text\":\"\\t\\tasort($orderedTypes);\"},{\"line\":1065,\"text\":\"\"},{\"line\":1066,\"text\":\"\\t\\t$orderedOptOuts = [];\"},{\"line\":1067,\"text\":\"\\t\\tforeach ($orderedTypes AS $contentType => $null)\"},{\"line\":1068,\"text\":\"\\t\\t{\"}],\"line\":1062,\"text\":\"\\t\\t\\t$orderedTypes[$contentType] = $handler->getOptOutDisplayOrder();\"},{\"context\":[{\"line\":1076,\"text\":\"\\t * @return array\"},{\"line\":1077,\"text\":\"\\t */\"},{\"line\":1078,\"text\":\"\\tpublic function getAlertOptOutActions()\"},{\"line\":1079,\"text\":\"\\t{\"},{\"line\":1080,\"text\":\"\\t\\t$handlers = $this->getAlertHandlers();\"},{\"line\":1081,\"text\":\"\"},{\"line\":1082,\"text\":\"\\t\\t$actions = [];\"},{\"line\":1083,\"text\":\"\\t\\tforeach ($handlers AS $contentType => $handler)\"},{\"line\":1084,\"text\":\"\\t\\t{\"}],\"line\":1078,\"text\":\"\\tpublic function getAlertOptOutActions()\"},{\"context\":[{\"line\":1078,\"text\":\"\\tpublic function getAlertOptOutActions()\"},{\"line\":1079,\"text\":\"\\t{\"},{\"line\":1080,\"text\":\"\\t\\t$handlers = $this->getAlertHandlers();\"},{\"line\":1081,\"text\":\"\"},{\"line\":1082,\"text\":\"\\t\\t$actions = [];\"},{\"line\":1083,\"text\":\"\\t\\tforeach ($handlers AS $contentType => $handler)\"},{\"line\":1084,\"text\":\"\\t\\t{\"},{\"line\":1085,\"text\":\"\\t\\t\\tforeach ($handler->getOptOutActions() AS $action)\"},{\"line\":1086,\"text\":\"\\t\\t\\t{\"}],\"line\":1080,\"text\":\"\\t\\t$handlers = $this->getAlertHandlers();\"},{\"context\":[{\"line\":1083,\"text\":\"\\t\\tforeach ($handlers AS $contentType => $handler)\"},{\"line\":1084,\"text\":\"\\t\\t{\"},{\"line\":1085,\"text\":\"\\t\\t\\tforeach ($handler->getOptOutActions() AS $action)\"},{\"line\":1086,\"text\":\"\\t\\t\\t{\"},{\"line\":1087,\"text\":\"\\t\\t\\t\\t$actions[$contentType . '_' . $action] = true;\"},{\"line\":1088,\"text\":\"\\t\\t\\t}\"},{\"line\":1089,\"text\":\"\\t\\t}\"},{\"line\":1090,\"text\":\"\"},{\"line\":1091,\"text\":\"\\t\\treturn $actions;\"}],\"line\":1085,\"text\":\"\\t\\t\\tforeach ($handler->getOptOutActions() AS $action)\"}],\"path\":\"/var/www/forums/newfi/public/src/XF/Repository/UserAlertRepository.php\",\"present\":true,\"sha256\":\"5efd6dac58b2a42da3a64db6bc36aaee2cefea1394105aa872b672b835590cd9\"},\"user_entity_push\":{\"bytes\":65143,\"matches\":[{\"context\":[{\"line\":1051,\"text\":\"\\t}\"},{\"line\":1052,\"text\":\"\"},{\"line\":1053,\"text\":\"\\tpublic function canUsePushNotifications()\"},{\"line\":1054,\"text\":\"\\t{\"},{\"line\":1055,\"text\":\"\\t\\tif (!\\\\XF::isPushUsable())\"},{\"line\":1056,\"text\":\"\\t\\t{\"},{\"line\":1057,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":1058,\"text\":\"\\t\\t}\"},{\"line\":1059,\"text\":\"\"}],\"line\":1053,\"text\":\"\\tpublic function canUsePushNotifications()\"},{\"context\":[{\"line\":1882,\"text\":\"\\t * @api-out bool $activity_visible\"},{\"line\":1883,\"text\":\"\\t * @api-out int $age The user's current age. Only included if available.\"},{\"line\":1884,\"text\":\"\\t * @api-out array $alert_optout\"},{\"line\":1885,\"text\":\"\\t * @api-out string $allow_post_profile\"},{\"line\":1886,\"text\":\"\\t * @api-out string $allow_receive_news_feed\"},{\"line\":1887,\"text\":\"\\t * @api-out string $allow_send_personal_conversation\"},{\"line\":1888,\"text\":\"\\t * @api-out string $allow_view_identities\"},{\"line\":1889,\"text\":\"\\t * @api-out string $allow_view_profile\"},{\"line\":1890,\"text\":\"\\t * @api-out object $avatar_urls Maps from size types to URL.\"}],\"line\":1884,\"text\":\"\\t * @api-out array $alert_optout\"},{\"context\":[{\"line\":1917,\"text\":\"\\t * @api-out int $last_activity Unix timestamp of user's last activity, if available.\"},{\"line\":1918,\"text\":\"\\t * @api-out str $location\"},{\"line\":1919,\"text\":\"\\t * @api-out bool $push_on_conversation\"},{\"line\":1920,\"text\":\"\\t * @api-out array $push_optout\"},{\"line\":1921,\"text\":\"\\t * @api-out bool $receive_admin_email\"},{\"line\":1922,\"text\":\"\\t * @api-out array $secondary_group_ids\"},{\"line\":1923,\"text\":\"\\t * @api-out bool $show_dob_date\"},{\"line\":1924,\"text\":\"\\t * @api-out bool $show_dob_year\"},{\"line\":1925,\"text\":\"\\t * @api-out str $signature\"}],\"line\":1919,\"text\":\"\\t * @api-out bool $push_on_conversation\"},{\"context\":[{\"line\":1918,\"text\":\"\\t * @api-out str $location\"},{\"line\":1919,\"text\":\"\\t * @api-out bool $push_on_conversation\"},{\"line\":1920,\"text\":\"\\t * @api-out array $push_optout\"},{\"line\":1921,\"text\":\"\\t * @api-out bool $receive_admin_email\"},{\"line\":1922,\"text\":\"\\t * @api-out array $secondary_group_ids\"},{\"line\":1923,\"text\":\"\\t * @api-out bool $show_dob_date\"},{\"line\":1924,\"text\":\"\\t * @api-out bool $show_dob_year\"},{\"line\":1925,\"text\":\"\\t * @api-out str $signature\"},{\"line\":1926,\"text\":\"\\t * @api-out string $timezone\"}],\"line\":1920,\"text\":\"\\t * @api-out array $push_optout\"},{\"context\":[{\"line\":2076,\"text\":\"\\t\\t\\t\\t\\t\\t'receive_admin_email' => $option->receive_admin_email,\"},{\"line\":2077,\"text\":\"\\t\\t\\t\\t\\t\\t'email_on_conversation' => $option->email_on_conversation,\"},{\"line\":2078,\"text\":\"\\t\\t\\t\\t\\t\\t'push_on_conversation' => $option->push_on_conversation,\"},{\"line\":2079,\"text\":\"\\t\\t\\t\\t\\t\\t'creation_watch_state' => $option->creation_watch_state,\"},{\"line\":2080,\"text\":\"\\t\\t\\t\\t\\t\\t'interaction_watch_state' => $option->interaction_watch_state,\"},{\"line\":2081,\"text\":\"\\t\\t\\t\\t\\t\\t'alert_optout' => $option->alert_optout,\"},{\"line\":2082,\"text\":\"\\t\\t\\t\\t\\t\\t'push_optout' => $option->push_optout,\"},{\"line\":2083,\"text\":\"\\t\\t\\t\\t\\t\\t'use_tfa' => $option->use_tfa,\"},{\"line\":2084,\"text\":\"\\t\\t\\t\\t\\t]);\"}],\"line\":2078,\"text\":\"\\t\\t\\t\\t\\t\\t'push_on_conversation' => $option->push_on_conversation,\"},{\"context\":[{\"line\":2079,\"text\":\"\\t\\t\\t\\t\\t\\t'creation_watch_state' => $option->creation_watch_state,\"},{\"line\":2080,\"text\":\"\\t\\t\\t\\t\\t\\t'interaction_watch_state' => $option->interaction_watch_state,\"},{\"line\":2081,\"text\":\"\\t\\t\\t\\t\\t\\t'alert_optout' => $option->alert_optout,\"},{\"line\":2082,\"text\":\"\\t\\t\\t\\t\\t\\t'push_optout' => $option->push_optout,\"},{\"line\":2083,\"text\":\"\\t\\t\\t\\t\\t\\t'use_tfa' => $option->use_tfa,\"},{\"line\":2084,\"text\":\"\\t\\t\\t\\t\\t]);\"},{\"line\":2085,\"text\":\"\\t\\t\\t\\t\\t$result->includeExtra([\"},{\"line\":2086,\"text\":\"\\t\\t\\t\\t\\t\\t'allow_view_profile' => $privacy->allow_view_profile,\"},{\"line\":2087,\"text\":\"\\t\\t\\t\\t\\t\\t'allow_post_profile' => $privacy->allow_post_profile,\"}],\"line\":2081,\"text\":\"\\t\\t\\t\\t\\t\\t'alert_optout' => $option->alert_optout,\"},{\"context\":[{\"line\":2080,\"text\":\"\\t\\t\\t\\t\\t\\t'interaction_watch_state' => $option->interaction_watch_state,\"},{\"line\":2081,\"text\":\"\\t\\t\\t\\t\\t\\t'alert_optout' => $option->alert_optout,\"},{\"line\":2082,\"text\":\"\\t\\t\\t\\t\\t\\t'push_optout' => $option->push_optout,\"},{\"line\":2083,\"text\":\"\\t\\t\\t\\t\\t\\t'use_tfa' => $option->use_tfa,\"},{\"line\":2084,\"text\":\"\\t\\t\\t\\t\\t]);\"},{\"line\":2085,\"text\":\"\\t\\t\\t\\t\\t$result->includeExtra([\"},{\"line\":2086,\"text\":\"\\t\\t\\t\\t\\t\\t'allow_view_profile' => $privacy->allow_view_profile,\"},{\"line\":2087,\"text\":\"\\t\\t\\t\\t\\t\\t'allow_post_profile' => $privacy->allow_post_profile,\"},{\"line\":2088,\"text\":\"\\t\\t\\t\\t\\t\\t'allow_send_personal_conversation' => $privacy->allow_send_personal_conversation,\"}],\"line\":2082,\"text\":\"\\t\\t\\t\\t\\t\\t'push_optout' => $option->push_optout,\"},{\"context\":[{\"line\":2125,\"text\":\"\\t\\t\\t\\t'receive_admin_email' => $option->receive_admin_email,\"},{\"line\":2126,\"text\":\"\\t\\t\\t\\t'email_on_conversation' => $option->email_on_conversation,\"},{\"line\":2127,\"text\":\"\\t\\t\\t\\t'push_on_conversation' => $option->push_on_conversation,\"},{\"line\":2128,\"text\":\"\\t\\t\\t\\t'creation_watch_state' => $option->creation_watch_state,\"},{\"line\":2129,\"text\":\"\\t\\t\\t\\t'interaction_watch_state' => $option->interaction_watch_state,\"},{\"line\":2130,\"text\":\"\\t\\t\\t\\t'alert_optout' => $option->alert_optout,\"},{\"line\":2131,\"text\":\"\\t\\t\\t\\t'push_optout' => $option->push_optout,\"},{\"line\":2132,\"text\":\"\\t\\t\\t\\t'use_tfa' => $option->use_tfa,\"},{\"line\":2133,\"text\":\"\\t\\t\\t]);\"}],\"line\":2127,\"text\":\"\\t\\t\\t\\t'push_on_conversation' => $option->push_on_conversation,\"},{\"context\":[{\"line\":2128,\"text\":\"\\t\\t\\t\\t'creation_watch_state' => $option->creation_watch_state,\"},{\"line\":2129,\"text\":\"\\t\\t\\t\\t'interaction_watch_state' => $option->interaction_watch_state,\"},{\"line\":2130,\"text\":\"\\t\\t\\t\\t'alert_optout' => $option->alert_optout,\"},{\"line\":2131,\"text\":\"\\t\\t\\t\\t'push_optout' => $option->push_optout,\"},{\"line\":2132,\"text\":\"\\t\\t\\t\\t'use_tfa' => $option->use_tfa,\"},{\"line\":2133,\"text\":\"\\t\\t\\t]);\"},{\"line\":2134,\"text\":\"\"},{\"line\":2135,\"text\":\"\\t\\t\\t$fieldValues = $profile->custom_fields->getFieldValues();\"},{\"line\":2136,\"text\":\"\\t\\t\\t$result->custom_fields = (object) $fieldValues;\"}],\"line\":2130,\"text\":\"\\t\\t\\t\\t'alert_optout' => $option->alert_optout,\"},{\"context\":[{\"line\":2129,\"text\":\"\\t\\t\\t\\t'interaction_watch_state' => $option->interaction_watch_state,\"},{\"line\":2130,\"text\":\"\\t\\t\\t\\t'alert_optout' => $option->alert_optout,\"},{\"line\":2131,\"text\":\"\\t\\t\\t\\t'push_optout' => $option->push_optout,\"},{\"line\":2132,\"text\":\"\\t\\t\\t\\t'use_tfa' => $option->use_tfa,\"},{\"line\":2133,\"text\":\"\\t\\t\\t]);\"},{\"line\":2134,\"text\":\"\"},{\"line\":2135,\"text\":\"\\t\\t\\t$fieldValues = $profile->custom_fields->getFieldValues();\"},{\"line\":2136,\"text\":\"\\t\\t\\t$result->custom_fields = (object) $fieldValues;\"},{\"line\":2137,\"text\":\"\\t\\t}\"}],\"line\":2131,\"text\":\"\\t\\t\\t\\t'push_optout' => $option->push_optout,\"}],\"path\":\"/var/www/forums/newfi/public/src/XF/Entity/User.php\",\"present\":true,\"sha256\":\"1ea738d44993ad4cb7f5db12e8b2ee06c37bd2b2c7ae1714b068fb64bbb82758\"},\"user_push_repo\":{\"bytes\":3366,\"matches\":[{\"context\":[{\"line\":8,\"text\":\"use function intval, strlen;\"},{\"line\":9,\"text\":\"\"},{\"line\":10,\"text\":\"class UserPushRepository extends Repository\"},{\"line\":11,\"text\":\"{\"},{\"line\":12,\"text\":\"\\tpublic function validateSubscriptionDetails(array $subscription, &$error = null)\"},{\"line\":13,\"text\":\"\\t{\"},{\"line\":14,\"text\":\"\\t\\t$endpoint = $subscription['endpoint'] ?? null;\"},{\"line\":15,\"text\":\"\\t\\tif ($endpoint === null)\"},{\"line\":16,\"text\":\"\\t\\t{\"}],\"line\":10,\"text\":\"class UserPushRepository extends Repository\"},{\"context\":[{\"line\":10,\"text\":\"class UserPushRepository extends Repository\"},{\"line\":11,\"text\":\"{\"},{\"line\":12,\"text\":\"\\tpublic function validateSubscriptionDetails(array $subscription, &$error = null)\"},{\"line\":13,\"text\":\"\\t{\"},{\"line\":14,\"text\":\"\\t\\t$endpoint = $subscription['endpoint'] ?? null;\"},{\"line\":15,\"text\":\"\\t\\tif ($endpoint === null)\"},{\"line\":16,\"text\":\"\\t\\t{\"},{\"line\":17,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":18,\"text\":\"\\t\\t}\"}],\"line\":12,\"text\":\"\\tpublic function validateSubscriptionDetails(array $subscription, &$error = null)\"},{\"context\":[{\"line\":12,\"text\":\"\\tpublic function validateSubscriptionDetails(array $subscription, &$error = null)\"},{\"line\":13,\"text\":\"\\t{\"},{\"line\":14,\"text\":\"\\t\\t$endpoint = $subscription['endpoint'] ?? null;\"},{\"line\":15,\"text\":\"\\t\\tif ($endpoint === null)\"},{\"line\":16,\"text\":\"\\t\\t{\"},{\"line\":17,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":18,\"text\":\"\\t\\t}\"},{\"line\":19,\"text\":\"\"},{\"line\":20,\"text\":\"\\t\\tif (!$this->isValidEndpoint($endpoint))\"}],\"line\":14,\"text\":\"\\t\\t$endpoint = $subscription['endpoint'] ?? null;\"},{\"context\":[{\"line\":23,\"text\":\"\\t\\t}\"},{\"line\":24,\"text\":\"\"},{\"line\":25,\"text\":\"\\t\\tif (empty($subscription['key']) || empty($subscription['token']) || empty($subscription['encoding']))\"},{\"line\":26,\"text\":\"\\t\\t{\"},{\"line\":27,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":28,\"text\":\"\\t\\t}\"},{\"line\":29,\"text\":\"\"},{\"line\":30,\"text\":\"\\t\\tif (\"},{\"line\":31,\"text\":\"\\t\\t\\tstrlen($subscription['key']) > 1024\"}],\"line\":25,\"text\":\"\\t\\tif (empty($subscription['key']) || empty($subscription['token']) || empty($subscription['encoding']))\"},{\"context\":[{\"line\":29,\"text\":\"\"},{\"line\":30,\"text\":\"\\t\\tif (\"},{\"line\":31,\"text\":\"\\t\\t\\tstrlen($subscription['key']) > 1024\"},{\"line\":32,\"text\":\"\\t\\t\\t|| strlen($subscription['token']) > 256\"},{\"line\":33,\"text\":\"\\t\\t\\t|| strlen($subscription['encoding']) > 64\"},{\"line\":34,\"text\":\"\\t\\t)\"},{\"line\":35,\"text\":\"\\t\\t{\"},{\"line\":36,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":37,\"text\":\"\\t\\t}\"}],\"line\":31,\"text\":\"\\t\\t\\tstrlen($subscription['key']) > 1024\"},{\"context\":[{\"line\":30,\"text\":\"\\t\\tif (\"},{\"line\":31,\"text\":\"\\t\\t\\tstrlen($subscription['key']) > 1024\"},{\"line\":32,\"text\":\"\\t\\t\\t|| strlen($subscription['token']) > 256\"},{\"line\":33,\"text\":\"\\t\\t\\t|| strlen($subscription['encoding']) > 64\"},{\"line\":34,\"text\":\"\\t\\t)\"},{\"line\":35,\"text\":\"\\t\\t{\"},{\"line\":36,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":37,\"text\":\"\\t\\t}\"},{\"line\":38,\"text\":\"\"}],\"line\":32,\"text\":\"\\t\\t\\t|| strlen($subscription['token']) > 256\"},{\"context\":[{\"line\":31,\"text\":\"\\t\\t\\tstrlen($subscription['key']) > 1024\"},{\"line\":32,\"text\":\"\\t\\t\\t|| strlen($subscription['token']) > 256\"},{\"line\":33,\"text\":\"\\t\\t\\t|| strlen($subscription['encoding']) > 64\"},{\"line\":34,\"text\":\"\\t\\t)\"},{\"line\":35,\"text\":\"\\t\\t{\"},{\"line\":36,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":37,\"text\":\"\\t\\t}\"},{\"line\":38,\"text\":\"\"},{\"line\":39,\"text\":\"\\t\\treturn true;\"}],\"line\":33,\"text\":\"\\t\\t\\t|| strlen($subscription['encoding']) > 64\"},{\"context\":[{\"line\":40,\"text\":\"\\t}\"},{\"line\":41,\"text\":\"\"},{\"line\":42,\"text\":\"\\tpublic function insertUserPushSubscription(User $user, array $subscription)\"},{\"line\":43,\"text\":\"\\t{\"},{\"line\":44,\"text\":\"\\t\\t$db = $this->db();\"},{\"line\":45,\"text\":\"\"},{\"line\":46,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"line\":47,\"text\":\"\"},{\"line\":48,\"text\":\"\\t\\treturn $db->insert('xf_user_push_subscription', [\"}],\"line\":42,\"text\":\"\\tpublic function insertUserPushSubscription(User $user, array $subscription)\"},{\"context\":[{\"line\":44,\"text\":\"\\t\\t$db = $this->db();\"},{\"line\":45,\"text\":\"\"},{\"line\":46,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"line\":47,\"text\":\"\"},{\"line\":48,\"text\":\"\\t\\treturn $db->insert('xf_user_push_subscription', [\"},{\"line\":49,\"text\":\"\\t\\t\\t'endpoint_hash' => $endpointHash,\"},{\"line\":50,\"text\":\"\\t\\t\\t'endpoint' => $subscription['endpoint'],\"},{\"line\":51,\"text\":\"\\t\\t\\t'user_id' => $user->user_id,\"},{\"line\":52,\"text\":\"\\t\\t\\t'data' => json_encode([\"}],\"line\":46,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"context\":[{\"line\":46,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"line\":47,\"text\":\"\"},{\"line\":48,\"text\":\"\\t\\treturn $db->insert('xf_user_push_subscription', [\"},{\"line\":49,\"text\":\"\\t\\t\\t'endpoint_hash' => $endpointHash,\"},{\"line\":50,\"text\":\"\\t\\t\\t'endpoint' => $subscription['endpoint'],\"},{\"line\":51,\"text\":\"\\t\\t\\t'user_id' => $user->user_id,\"},{\"line\":52,\"text\":\"\\t\\t\\t'data' => json_encode([\"},{\"line\":53,\"text\":\"\\t\\t\\t\\t'key' => $subscription['key'],\"},{\"line\":54,\"text\":\"\\t\\t\\t\\t'token' => $subscription['token'],\"}],\"line\":48,\"text\":\"\\t\\treturn $db->insert('xf_user_push_subscription', [\"},{\"context\":[{\"line\":48,\"text\":\"\\t\\treturn $db->insert('xf_user_push_subscription', [\"},{\"line\":49,\"text\":\"\\t\\t\\t'endpoint_hash' => $endpointHash,\"},{\"line\":50,\"text\":\"\\t\\t\\t'endpoint' => $subscription['endpoint'],\"},{\"line\":51,\"text\":\"\\t\\t\\t'user_id' => $user->user_id,\"},{\"line\":52,\"text\":\"\\t\\t\\t'data' => json_encode([\"},{\"line\":53,\"text\":\"\\t\\t\\t\\t'key' => $subscription['key'],\"},{\"line\":54,\"text\":\"\\t\\t\\t\\t'token' => $subscription['token'],\"},{\"line\":55,\"text\":\"\\t\\t\\t\\t'encoding' => $subscription['encoding'],\"},{\"line\":56,\"text\":\"\\t\\t\\t]),\"}],\"line\":50,\"text\":\"\\t\\t\\t'endpoint' => $subscription['endpoint'],\"},{\"context\":[{\"line\":51,\"text\":\"\\t\\t\\t'user_id' => $user->user_id,\"},{\"line\":52,\"text\":\"\\t\\t\\t'data' => json_encode([\"},{\"line\":53,\"text\":\"\\t\\t\\t\\t'key' => $subscription['key'],\"},{\"line\":54,\"text\":\"\\t\\t\\t\\t'token' => $subscription['token'],\"},{\"line\":55,\"text\":\"\\t\\t\\t\\t'encoding' => $subscription['encoding'],\"},{\"line\":56,\"text\":\"\\t\\t\\t]),\"},{\"line\":57,\"text\":\"\\t\\t\\t'last_seen' => time(),\"},{\"line\":58,\"text\":\"\\t\\t], false, '\"},{\"line\":59,\"text\":\"\\t\\t\\tuser_id = VALUES(user_id),\"}],\"line\":53,\"text\":\"\\t\\t\\t\\t'key' => $subscription['key'],\"},{\"context\":[{\"line\":52,\"text\":\"\\t\\t\\t'data' => json_encode([\"},{\"line\":53,\"text\":\"\\t\\t\\t\\t'key' => $subscription['key'],\"},{\"line\":54,\"text\":\"\\t\\t\\t\\t'token' => $subscription['token'],\"},{\"line\":55,\"text\":\"\\t\\t\\t\\t'encoding' => $subscription['encoding'],\"},{\"line\":56,\"text\":\"\\t\\t\\t]),\"},{\"line\":57,\"text\":\"\\t\\t\\t'last_seen' => time(),\"},{\"line\":58,\"text\":\"\\t\\t], false, '\"},{\"line\":59,\"text\":\"\\t\\t\\tuser_id = VALUES(user_id),\"},{\"line\":60,\"text\":\"\\t\\t\\tdata = VALUES(data),\"}],\"line\":54,\"text\":\"\\t\\t\\t\\t'token' => $subscription['token'],\"},{\"context\":[{\"line\":53,\"text\":\"\\t\\t\\t\\t'key' => $subscription['key'],\"},{\"line\":54,\"text\":\"\\t\\t\\t\\t'token' => $subscription['token'],\"},{\"line\":55,\"text\":\"\\t\\t\\t\\t'encoding' => $subscription['encoding'],\"},{\"line\":56,\"text\":\"\\t\\t\\t]),\"},{\"line\":57,\"text\":\"\\t\\t\\t'last_seen' => time(),\"},{\"line\":58,\"text\":\"\\t\\t], false, '\"},{\"line\":59,\"text\":\"\\t\\t\\tuser_id = VALUES(user_id),\"},{\"line\":60,\"text\":\"\\t\\t\\tdata = VALUES(data),\"},{\"line\":61,\"text\":\"\\t\\t\\tlast_seen = VALUES(last_seen)\"}],\"line\":55,\"text\":\"\\t\\t\\t\\t'encoding' => $subscription['encoding'],\"},{\"context\":[{\"line\":63,\"text\":\"\\t}\"},{\"line\":64,\"text\":\"\"},{\"line\":65,\"text\":\"\\tpublic function deletePushSubscription(array $subscription)\"},{\"line\":66,\"text\":\"\\t{\"},{\"line\":67,\"text\":\"\\t\\t$db = $this->db();\"},{\"line\":68,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"line\":69,\"text\":\"\\t\\treturn $db->delete('xf_user_push_subscription', 'endpoint_hash = ?', $endpointHash);\"},{\"line\":70,\"text\":\"\\t}\"},{\"line\":71,\"text\":\"\"}],\"line\":65,\"text\":\"\\tpublic function deletePushSubscription(array $subscription)\"},{\"context\":[{\"line\":66,\"text\":\"\\t{\"},{\"line\":67,\"text\":\"\\t\\t$db = $this->db();\"},{\"line\":68,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"line\":69,\"text\":\"\\t\\treturn $db->delete('xf_user_push_subscription', 'endpoint_hash = ?', $endpointHash);\"},{\"line\":70,\"text\":\"\\t}\"},{\"line\":71,\"text\":\"\"},{\"line\":72,\"text\":\"\\tpublic function deleteUserPushSubscription(User $user, array $subscription)\"},{\"line\":73,\"text\":\"\\t{\"},{\"line\":74,\"text\":\"\\t\\t$db = $this->db();\"}],\"line\":68,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"context\":[{\"line\":67,\"text\":\"\\t\\t$db = $this->db();\"},{\"line\":68,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"line\":69,\"text\":\"\\t\\treturn $db->delete('xf_user_push_subscription', 'endpoint_hash = ?', $endpointHash);\"},{\"line\":70,\"text\":\"\\t}\"},{\"line\":71,\"text\":\"\"},{\"line\":72,\"text\":\"\\tpublic function deleteUserPushSubscription(User $user, array $subscription)\"},{\"line\":73,\"text\":\"\\t{\"},{\"line\":74,\"text\":\"\\t\\t$db = $this->db();\"},{\"line\":75,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"}],\"line\":69,\"text\":\"\\t\\treturn $db->delete('xf_user_push_subscription', 'endpoint_hash = ?', $endpointHash);\"},{\"context\":[{\"line\":70,\"text\":\"\\t}\"},{\"line\":71,\"text\":\"\"},{\"line\":72,\"text\":\"\\tpublic function deleteUserPushSubscription(User $user, array $subscription)\"},{\"line\":73,\"text\":\"\\t{\"},{\"line\":74,\"text\":\"\\t\\t$db = $this->db();\"},{\"line\":75,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"line\":76,\"text\":\"\\t\\treturn $db->delete('xf_user_push_subscription', 'endpoint_hash = ? AND user_id = ?', [\"},{\"line\":77,\"text\":\"\\t\\t\\t$endpointHash, $user->user_id,\"},{\"line\":78,\"text\":\"\\t\\t]);\"}],\"line\":72,\"text\":\"\\tpublic function deleteUserPushSubscription(User $user, array $subscription)\"},{\"context\":[{\"line\":73,\"text\":\"\\t{\"},{\"line\":74,\"text\":\"\\t\\t$db = $this->db();\"},{\"line\":75,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"line\":76,\"text\":\"\\t\\treturn $db->delete('xf_user_push_subscription', 'endpoint_hash = ? AND user_id = ?', [\"},{\"line\":77,\"text\":\"\\t\\t\\t$endpointHash, $user->user_id,\"},{\"line\":78,\"text\":\"\\t\\t]);\"},{\"line\":79,\"text\":\"\\t}\"},{\"line\":80,\"text\":\"\"},{\"line\":81,\"text\":\"\\tpublic function limitUserPushSubscriptionCount(User $user, $maxAllowed)\"}],\"line\":75,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"context\":[{\"line\":74,\"text\":\"\\t\\t$db = $this->db();\"},{\"line\":75,\"text\":\"\\t\\t$endpointHash = $this->getEndpointHash($subscription['endpoint']);\"},{\"line\":76,\"text\":\"\\t\\treturn $db->delete('xf_user_push_subscription', 'endpoint_hash = ? AND user_id = ?', [\"},{\"line\":77,\"text\":\"\\t\\t\\t$endpointHash, $user->user_id,\"},{\"line\":78,\"text\":\"\\t\\t]);\"},{\"line\":79,\"text\":\"\\t}\"},{\"line\":80,\"text\":\"\"},{\"line\":81,\"text\":\"\\tpublic function limitUserPushSubscriptionCount(User $user, $maxAllowed)\"},{\"line\":82,\"text\":\"\\t{\"}],\"line\":76,\"text\":\"\\t\\treturn $db->delete('xf_user_push_subscription', 'endpoint_hash = ? AND user_id = ?', [\"},{\"context\":[{\"line\":79,\"text\":\"\\t}\"},{\"line\":80,\"text\":\"\"},{\"line\":81,\"text\":\"\\tpublic function limitUserPushSubscriptionCount(User $user, $maxAllowed)\"},{\"line\":82,\"text\":\"\\t{\"},{\"line\":83,\"text\":\"\\t\\t$cutOff = max(0, intval($maxAllowed)); // offset is 0 based, so this will give the max+1 row\"},{\"line\":84,\"text\":\"\"},{\"line\":85,\"text\":\"\\t\\t$lastSeenCutOff = $this->db()->fetchOne(\\\"\"},{\"line\":86,\"text\":\"\\t\\t\\tSELECT last_seen\"},{\"line\":87,\"text\":\"\\t\\t\\tFROM xf_user_push_subscription\"}],\"line\":81,\"text\":\"\\tpublic function limitUserPushSubscriptionCount(User $user, $maxAllowed)\"},{\"context\":[{\"line\":85,\"text\":\"\\t\\t$lastSeenCutOff = $this->db()->fetchOne(\\\"\"},{\"line\":86,\"text\":\"\\t\\t\\tSELECT last_seen\"},{\"line\":87,\"text\":\"\\t\\t\\tFROM xf_user_push_subscription\"},{\"line\":88,\"text\":\"\\t\\t\\tWHERE user_id = ?\"},{\"line\":89,\"text\":\"\\t\\t\\tORDER BY last_seen DESC\"},{\"line\":90,\"text\":\"\\t\\t\\tLIMIT ?, 1\"},{\"line\":91,\"text\":\"\\t\\t\\\", [$user->user_id, $cutOff]);\"},{\"line\":92,\"text\":\"\\t\\tif ($lastSeenCutOff)\"},{\"line\":93,\"text\":\"\\t\\t{\"}],\"line\":87,\"text\":\"\\t\\t\\tFROM xf_user_push_subscription\"},{\"context\":[{\"line\":93,\"text\":\"\\t\\t{\"},{\"line\":94,\"text\":\"\\t\\t\\t$this->db()->delete(\"},{\"line\":95,\"text\":\"\\t\\t\\t\\t'xf_user_push_subscription',\"},{\"line\":96,\"text\":\"\\t\\t\\t\\t'user_id = ? AND last_seen <= ?',\"},{\"line\":97,\"text\":\"\\t\\t\\t\\t[$user->user_id, $lastSeenCutOff]\"},{\"line\":98,\"text\":\"\\t\\t\\t);\"},{\"line\":99,\"text\":\"\\t\\t}\"},{\"line\":100,\"text\":\"\\t}\"},{\"line\":101,\"text\":\"\"}],\"line\":95,\"text\":\"\\t\\t\\t\\t'xf_user_push_subscription',\"},{\"context\":[{\"line\":100,\"text\":\"\\t}\"},{\"line\":101,\"text\":\"\"},{\"line\":102,\"text\":\"\\tpublic function getUserSubscriptions(User $user)\"},{\"line\":103,\"text\":\"\\t{\"},{\"line\":104,\"text\":\"\\t\\treturn $this->db()->fetchAllKeyed(\"},{\"line\":105,\"text\":\"\\t\\t\\t'SELECT *\"},{\"line\":106,\"text\":\"\\t\\t\\t\\tFROM xf_user_push_subscription\"},{\"line\":107,\"text\":\"\\t\\t\\t\\tWHERE user_id = ?\"},{\"line\":108,\"text\":\"\\t\\t\\t\\tORDER BY endpoint_id',\"}],\"line\":102,\"text\":\"\\tpublic function getUserSubscriptions(User $user)\"},{\"context\":[{\"line\":104,\"text\":\"\\t\\treturn $this->db()->fetchAllKeyed(\"},{\"line\":105,\"text\":\"\\t\\t\\t'SELECT *\"},{\"line\":106,\"text\":\"\\t\\t\\t\\tFROM xf_user_push_subscription\"},{\"line\":107,\"text\":\"\\t\\t\\t\\tWHERE user_id = ?\"},{\"line\":108,\"text\":\"\\t\\t\\t\\tORDER BY endpoint_id',\"},{\"line\":109,\"text\":\"\\t\\t\\t'endpoint_hash',\"},{\"line\":110,\"text\":\"\\t\\t\\t[$user->user_id]\"},{\"line\":111,\"text\":\"\\t\\t);\"},{\"line\":112,\"text\":\"\\t}\"}],\"line\":106,\"text\":\"\\t\\t\\t\\tFROM xf_user_push_subscription\"},{\"context\":[{\"line\":112,\"text\":\"\\t}\"},{\"line\":113,\"text\":\"\"},{\"line\":114,\"text\":\"\\tpublic function getEndpointHash($endpoint)\"},{\"line\":115,\"text\":\"\\t{\"},{\"line\":116,\"text\":\"\\t\\treturn md5($endpoint);\"},{\"line\":117,\"text\":\"\\t}\"},{\"line\":118,\"text\":\"\"},{\"line\":119,\"text\":\"\\tpublic function isValidEndpoint(string $endpoint): bool\"},{\"line\":120,\"text\":\"\\t{\"}],\"line\":114,\"text\":\"\\tpublic function getEndpointHash($endpoint)\"},{\"context\":[{\"line\":117,\"text\":\"\\t}\"},{\"line\":118,\"text\":\"\"},{\"line\":119,\"text\":\"\\tpublic function isValidEndpoint(string $endpoint): bool\"},{\"line\":120,\"text\":\"\\t{\"},{\"line\":121,\"text\":\"\\t\\tif (!preg_match('#https?://#i', $endpoint) || strlen($endpoint) > 2048)\"},{\"line\":122,\"text\":\"\\t\\t{\"},{\"line\":123,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":124,\"text\":\"\\t\\t}\"},{\"line\":125,\"text\":\"\"}],\"line\":119,\"text\":\"\\tpublic function isValidEndpoint(string $endpoint): bool\"},{\"context\":[{\"line\":141,\"text\":\"\\t * @return list\"},{\"line\":142,\"text\":\"\\t */\"},{\"line\":143,\"text\":\"\\tpublic function getInvalidEndpoints(): array\"},{\"line\":144,\"text\":\"\\t{\"},{\"line\":145,\"text\":\"\\t\\treturn [\"},{\"line\":146,\"text\":\"\\t\\t\\t'https://android.googleapis.com/gcm/send', // GCM\"},{\"line\":147,\"text\":\"\\t\\t\\t'https://permanently-removed.invalid/fcm/send', // Chrome (XF-234461)\"},{\"line\":148,\"text\":\"\\t\\t];\"},{\"line\":149,\"text\":\"\\t}\"}],\"line\":143,\"text\":\"\\tpublic function getInvalidEndpoints(): array\"},{\"context\":[{\"line\":144,\"text\":\"\\t{\"},{\"line\":145,\"text\":\"\\t\\treturn [\"},{\"line\":146,\"text\":\"\\t\\t\\t'https://android.googleapis.com/gcm/send', // GCM\"},{\"line\":147,\"text\":\"\\t\\t\\t'https://permanently-removed.invalid/fcm/send', // Chrome (XF-234461)\"},{\"line\":148,\"text\":\"\\t\\t];\"},{\"line\":149,\"text\":\"\\t}\"},{\"line\":150,\"text\":\"}\"}],\"line\":146,\"text\":\"\\t\\t\\t'https://android.googleapis.com/gcm/send', // GCM\"},{\"context\":[{\"line\":145,\"text\":\"\\t\\treturn [\"},{\"line\":146,\"text\":\"\\t\\t\\t'https://android.googleapis.com/gcm/send', // GCM\"},{\"line\":147,\"text\":\"\\t\\t\\t'https://permanently-removed.invalid/fcm/send', // Chrome (XF-234461)\"},{\"line\":148,\"text\":\"\\t\\t];\"},{\"line\":149,\"text\":\"\\t}\"},{\"line\":150,\"text\":\"}\"}],\"line\":147,\"text\":\"\\t\\t\\t'https://permanently-removed.invalid/fcm/send', // Chrome (XF-234461)\"}],\"path\":\"/var/www/forums/newfi/public/src/XF/Repository/UserPushRepository.php\",\"present\":true,\"sha256\":\"19cd962e33aa63af754b4c72953d8545e197183e93e6e834e3d71d823cd0b6c6\"},\"xfrm_alert_handler\":{\"bytes\":280,\"matches\":[{\"context\":[{\"line\":5,\"text\":\"use XF\\\\Alert\\\\AbstractHandler;\"},{\"line\":6,\"text\":\"\"},{\"line\":7,\"text\":\"class ResourceItem extends AbstractHandler\"},{\"line\":8,\"text\":\"{\"},{\"line\":9,\"text\":\"\\tpublic function getEntityWith(): array\"},{\"line\":10,\"text\":\"\\t{\"},{\"line\":11,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":12,\"text\":\"\"},{\"line\":13,\"text\":\"\\t\\treturn [\"}],\"line\":7,\"text\":\"class ResourceItem extends AbstractHandler\"},{\"context\":[{\"line\":7,\"text\":\"class ResourceItem extends AbstractHandler\"},{\"line\":8,\"text\":\"{\"},{\"line\":9,\"text\":\"\\tpublic function getEntityWith(): array\"},{\"line\":10,\"text\":\"\\t{\"},{\"line\":11,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":12,\"text\":\"\"},{\"line\":13,\"text\":\"\\t\\treturn [\"},{\"line\":14,\"text\":\"\\t\\t\\t'Category',\"},{\"line\":15,\"text\":\"\\t\\t\\t\\\"Category.Permissions|{$visitor->permission_combination_id}\\\",\"}],\"line\":9,\"text\":\"\\tpublic function getEntityWith(): array\"}],\"path\":\"/var/www/forums/newfi/public/src/addons/XFRM/Alert/ResourceItem.php\",\"present\":true,\"sha256\":\"6c57bdaba8e5fa2a943222faf41c1f7acf9ffedc36427018707944226d7225a3\"},\"xfrm_alert_templates\":{\"bytes\":244652,\"matches\":[{\"context\":[{\"line\":778,\"text\":\"