blob: aa47ddfe8dab620b40aaa1f6799ff040e030535f [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';
Samuel Shuert835c71f2021-09-03 15:49:26 -05007import Header from '../../Components/Header'
pineafanc540da92021-09-03 20:33:36 +01008
9class RSMV extends Component {
10
11 constructor(props) {
12 super(props);
13 this.v = false;
14 this.state = {
pineafan07dd8612021-09-04 10:25:32 +010015 captchaComplete: false,
16 clicked: false
pineafanc540da92021-09-03 20:33:36 +010017 }
18 }
19
20 async handleVerificationSuccess(cls, token) {
21 const chk = await Axios.put('/api/rsmv/verifyTkn', { tkn: token.toString() })
22 if(chk.data.success == true) {
pineafan9793cf72021-09-04 10:19:38 +010023 this.setState({
24 captchaComplete: true
25 })
pineafanc540da92021-09-03 20:33:36 +010026 return cls.v = true;
27 } else {
28 return;
29 }
pineafanc540da92021-09-03 20:33:36 +010030 }
31
32 async componentDidMount() {
33 this.setState({
34 cores: window.navigator.hardwareConcurrency,
35 userAgent: window.navigator.userAgent,
36 platform: window.navigator.platform,
37 language: window.navigator.language,
38 memory: window.navigator.deviceMemory,
39 })
40 }
41
42 async submitForm(cls) {
pineafan07dd8612021-09-04 10:25:32 +010043 if ( cls.state.clicked ) {
44 return
45 }
46 cls.setState({
47 clicked: true
48 })
pineafanc540da92021-09-03 20:33:36 +010049 if (!cls.v) {
50 return Router.push('/rsmv/failure','/rsmv')
51 }
52 let code = await Axios.post('/api/rsmv/complete', {
53 uid:cls.props.uID,
54 rid:cls.props.rID,
55 gid:cls.props.gID,
56 code:cls.props.code
57 });
58 console.log(code.status)
59 if (code.status === 200 ) return Router.push('/rsmv/success','/rsmv')
60 else return Router.push('/rsmv/failure','/rsmv')
61 }
62
63 render() {
64 return <>
Samuel Shuert835c71f2021-09-03 15:49:26 -050065 <Header
pineafanf97734b2021-11-23 21:11:00 +000066 name={
67 <>
68 <img alt="Server icon" style={{borderRadius: "50%", height: "64px", width: "auto"}} src={this.props.guild_icon_url} />
69 <br />
70 {this.props.guild_name}
71 </>
72 }
pineafan4f9cf4d2021-10-24 09:02:30 +010073 nameOverwrite="Verify"
Samuel Shuert835c71f2021-09-03 15:49:26 -050074 subtext={` ${this.props.memberCount} members`}
75 gradient={["F27878", "D96B6B"]}
pineafana841c762021-11-14 21:21:04 +000076 wave="web/waves/header/rsm"
Samuel Shuert835c71f2021-09-03 15:49:26 -050077 buttons={[]}
78 />
79 <div id="start">
80 <div className={Styles.center}>
81 <p className={Styles.text}>Complete the check below to join {this.props.guild_name}</p>
pineafanc540da92021-09-03 20:33:36 +010082 <HCaptcha
83 id="Captchas mitigate problems"
84 sitekey="85074411-fa13-4d9b-b901-53095c6d1fc6"
85 onVerify={token => this.handleVerificationSuccess(this, token)}
pineafanf97734b2021-11-23 21:11:00 +000086 theme={this.theme ? "light" : "dark"}
pineafanc540da92021-09-03 20:33:36 +010087 />
pineafan9793cf72021-09-04 10:19:38 +010088 <button type="button" className={Styles.button + " " + (this.state.captchaComplete ? Styles.buttonComplete : null)} onClick={(success) => this.submitForm(this)}>Proceed</button>
Samuel Shuert835c71f2021-09-03 15:49:26 -050089 <p className={Styles.text}>
90 This is an automatic check performed by RSM.
91 By clicking Proceed, you will be given the <code>{this.props.role_name}</code> role in <code>{this.props.guild_name}</code>.
pineafanc540da92021-09-03 20:33:36 +010092 </p>
Samuel Shuert835c71f2021-09-03 15:49:26 -050093 <br />
94 <p>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>.</p>
pineafanc540da92021-09-03 20:33:36 +010095 </div>
96 </div>
97 </>
98 }
99}
100
101export default RSMV;
102export async function getServerSideProps(ctx) {
103 if(!ctx.query.code) {
104 return {
105 redirect: {
pineafanbb7efa42021-09-04 10:05:06 +0100106 destination: '/rsmv/failure',
pineafanc540da92021-09-03 20:33:36 +0100107 permanent: true
108 }
109 }
110 }
111 let code = await Axios.post('http://localhost:3000/api/rsmv/validate', {code:ctx.query.code});
112 let headers = ctx.req.headers;
113 if (code.status != 200 ) {
114 return {
115 redirect: {
pineafanbb7efa42021-09-04 10:05:06 +0100116 destination: '/rsmv/failure',
pineafanc540da92021-09-03 20:33:36 +0100117 permanent: true
118 }
119 }
120 }
121 return {
122 props: {
pineafan4f9cf4d2021-10-24 09:02:30 +0100123 uID: code.data.user,
124 rID: code.data.role,
125 role_name: code.data.role_name,
126 gID: code.data.guild,
127 guild_name: code.data.guild_name,
128 guild_icon_url: code.data.guild_icon_url,
129 memberCount: code.data.guild_size,
pineafanc540da92021-09-03 20:33:36 +0100130 headers: headers,
131 code: ctx.query.code
132 }
133 }
134}