blob: 0c7262872144c062d9aa76a2582be899a89a01fc [file] [log] [blame]
pineafanc540da92021-09-03 20:33:36 +01001import { Component } from 'react';
2import Styles from '../../styles/rsmv/rsmv.module.css'
Samuel Shuert835c71f2021-09-03 15:49:26 -05003import HCaptcha from 'react-hcaptcha';
pineafanc540da92021-09-03 20:33:36 +01004import Axios from 'axios';
5import Router from 'next/router';
6import React from 'react';
pineafan3b0852d2022-05-06 20:39:59 +01007import Header from '../../Components/Header';
pineafanc540da92021-09-03 20:33:36 +01008
pineafane0283a82022-02-13 10:05:56 +00009import { AutoLayout, Panel, Title, Subtitle, Text, Divider } from '../../Components/Panels';
10import { List, ListItem, Code } from '../../Components/Texttools';
pineafanc540da92021-09-03 20:33:36 +010011class RSMV extends Component {
12
13 constructor(props) {
14 super(props);
15 this.v = false;
16 this.state = {
pineafan07dd8612021-09-04 10:25:32 +010017 captchaComplete: false,
18 clicked: false
pineafanc540da92021-09-03 20:33:36 +010019 }
20 }
21
22 async handleVerificationSuccess(cls, token) {
23 const chk = await Axios.put('/api/rsmv/verifyTkn', { tkn: token.toString() })
pineafan9babd752022-10-21 21:47:52 +010024 if(chk.data.success === true) {
pineafan9793cf72021-09-04 10:19:38 +010025 this.setState({
26 captchaComplete: true
27 })
pineafanc540da92021-09-03 20:33:36 +010028 return cls.v = true;
29 } else {
30 return;
31 }
pineafanc540da92021-09-03 20:33:36 +010032 }
33
34 async componentDidMount() {
35 this.setState({
36 cores: window.navigator.hardwareConcurrency,
37 userAgent: window.navigator.userAgent,
38 platform: window.navigator.platform,
39 language: window.navigator.language,
40 memory: window.navigator.deviceMemory,
41 })
42 }
43
44 async submitForm(cls) {
pineafan07dd8612021-09-04 10:25:32 +010045 if ( cls.state.clicked ) {
46 return
47 }
48 cls.setState({
49 clicked: true
50 })
pineafanc540da92021-09-03 20:33:36 +010051 if (!cls.v) {
52 return Router.push('/rsmv/failure','/rsmv')
53 }
54 let code = await Axios.post('/api/rsmv/complete', {
55 uid:cls.props.uID,
56 rid:cls.props.rID,
57 gid:cls.props.gID,
58 code:cls.props.code
59 });
pineafanc540da92021-09-03 20:33:36 +010060 if (code.status === 200 ) return Router.push('/rsmv/success','/rsmv')
61 else return Router.push('/rsmv/failure','/rsmv')
62 }
63
64 render() {
65 return <>
Samuel Shuert835c71f2021-09-03 15:49:26 -050066 <Header
pineafanff3d4522022-05-06 19:51:02 +010067 name="Verify"
68 customImage={this.props.guild_icon_url}
pineafan46270162022-02-13 12:06:17 +000069 subtext={`${this.props.memberCount} members`}
Samuel Shuert835c71f2021-09-03 15:49:26 -050070 gradient={["F27878", "D96B6B"]}
pineafana841c762021-11-14 21:21:04 +000071 wave="web/waves/header/rsm"
Samuel Shuert835c71f2021-09-03 15:49:26 -050072 buttons={[]}
PineaFana465f352023-02-05 16:45:01 +000073 season={this.props.season}
Samuel Shuert835c71f2021-09-03 15:49:26 -050074 />
pineafane0283a82022-02-13 10:05:56 +000075 <AutoLayout>
76 <Panel>
77 <Text>Complete the check below to join {this.props.guild_name}</Text>
pineafan46270162022-02-13 12:06:17 +000078 <div style={{height: "125px"}}>
79 <HCaptcha
80 id="Captchas mitigate problems"
81 sitekey="85074411-fa13-4d9b-b901-53095c6d1fc6"
82 onVerify={token => this.handleVerificationSuccess(this, token)}
83 theme={this.theme ? "light" : "dark"}
84 />
85 </div>
pineafan9793cf72021-09-04 10:19:38 +010086 <button type="button" className={Styles.button + " " + (this.state.captchaComplete ? Styles.buttonComplete : null)} onClick={(success) => this.submitForm(this)}>Proceed</button>
pineafan46270162022-02-13 12:06:17 +000087 <List colour="F27878">
pineafane0283a82022-02-13 10:05:56 +000088 <ListItem>This is an automatic check performed by RSM.</ListItem>
89 <ListItem>By clicking Proceed, you will be given the <code>{this.props.role_name}</code> role in <code>{this.props.guild_name}</code>.</ListItem>
PineaFan41418622023-10-14 21:36:48 +010090 <ListItem>For the full list of data stored by RSM, please check <a href="https://clickscodes.github.io/policies/rsm#verification">Here</a></ListItem>
pineafane0283a82022-02-13 10:05:56 +000091 </List>
pineafan3b0852d2022-05-06 20:39:59 +010092 <Text>You can add RSM to your server by inviting it <a href="https://discord.com/api/oauth2/authorize?client_id=715989276382462053&permissions=121295465718&scope=bot%20applications.commands">here</a>.</Text>
pineafane0283a82022-02-13 10:05:56 +000093 </Panel>
94 </AutoLayout>
pineafanc540da92021-09-03 20:33:36 +010095 </>
96 }
97}
98
99export default RSMV;
100export async function getServerSideProps(ctx) {
101 if(!ctx.query.code) {
102 return {
103 redirect: {
pineafanbb7efa42021-09-04 10:05:06 +0100104 destination: '/rsmv/failure',
pineafanc540da92021-09-03 20:33:36 +0100105 permanent: true
106 }
107 }
108 }
109 let code = await Axios.post('http://localhost:3000/api/rsmv/validate', {code:ctx.query.code});
110 let headers = ctx.req.headers;
pineafan9babd752022-10-21 21:47:52 +0100111 if (code.status !== 200 ) {
pineafanc540da92021-09-03 20:33:36 +0100112 return {
113 redirect: {
pineafanbb7efa42021-09-04 10:05:06 +0100114 destination: '/rsmv/failure',
pineafanc540da92021-09-03 20:33:36 +0100115 permanent: true
116 }
117 }
118 }
119 return {
120 props: {
pineafan4f9cf4d2021-10-24 09:02:30 +0100121 uID: code.data.user,
122 rID: code.data.role,
123 role_name: code.data.role_name,
124 gID: code.data.guild,
125 guild_name: code.data.guild_name,
126 guild_icon_url: code.data.guild_icon_url,
127 memberCount: code.data.guild_size,
pineafanc540da92021-09-03 20:33:36 +0100128 headers: headers,
129 code: ctx.query.code
130 }
131 }
132}