hi coded
diff --git a/pages/api/rsmv/complete.js b/pages/api/rsmv/complete.js
new file mode 100644
index 0000000..3259967
--- /dev/null
+++ b/pages/api/rsmv/complete.js
@@ -0,0 +1,17 @@
+import Axios from 'axios';
+
+export default async (req, res) => {
+    let code = await Axios.post('http://localhost:3000/api/rsmv/validate', {code:req.body.code});
+    if (code.status != 200) {
+        return res.send(404);
+    }
+    if (code.data.user  != req.body.uid) return res.send(401)
+    if (code.data.guild != req.body.gid) return res.send(401)
+    if (code.data.role  != req.body.rid) return res.send(401)
+
+    let secret = "slwu0rZV5W6WdmGtgI16du8Ar2tQGMr3Q9dE6u3poKiVODNV9SweaA3buawgkTmTuITXDWOUpBcTFA0qWrUvoshi1JB180WOFwA7"
+    let resp = await Axios.get(
+        `http://192.168.102.5:10000/role/gid/${req.body.gid}/rid/${req.body.rid}/user/${req.body.uid}/secret/${secret}/code/${req.body.code}`
+    )
+    return res.send(resp.status);
+}
diff --git a/pages/api/rsmv/validate.js b/pages/api/rsmv/validate.js
new file mode 100644
index 0000000..7359a68
--- /dev/null
+++ b/pages/api/rsmv/validate.js
@@ -0,0 +1,28 @@
+import MongoClient from 'mongodb';
+
+
+const url = 'mongodb://rsm:LJMy*orVFAATQ5PaX7EKXq74&HCDFaLE@192.168.101.2:27017/rsm';
+const db = 'rsm';
+const collection = 'rsmv-tokens'
+
+export default (req, res) => {
+    return new Promise((resolve, reject) => {
+        MongoClient.connect(url, async function(err, client) {
+            let db_response = await client.db(db).collection(collection).findOne({code: req.body.code});
+
+            if (!db_response) return resolve(res.status(404).end());
+            if (db_response.timestamp + (1800) >= Date.now()) return resolve(res.status(410));
+
+            let props = {
+                user: db_response.user,
+                role: db_response.role,
+                role_name: db_response.role_name,
+                guild: db_response.guild,
+                guild_name: db_response.guild_name,
+                guild_icon_url: db_response.guild_icon_url,
+                guild_size: db_response.guild_size
+            }
+            return resolve(res.status(200).send(props));
+        })
+    })
+}
\ No newline at end of file
diff --git a/pages/api/rsmv/verifyTkn.js b/pages/api/rsmv/verifyTkn.js
new file mode 100644
index 0000000..7e9d06f
--- /dev/null
+++ b/pages/api/rsmv/verifyTkn.js
@@ -0,0 +1,12 @@
+import Axios from 'axios';
+import qs from 'querystring';
+
+export default async (req, res) => {
+    const chk = await Axios.post('https://hcaptcha.com/siteverify', qs.stringify({
+            response: req.body.tkn,
+            secret: '0x19C699BFfce07b2a026121DE6702706BB2d51D6c',
+            sitekey: '85074411-fa13-4d9b-b901-53095c6d1fc6'
+        }))
+
+    return res.send({ success: chk.data.success });
+}
\ No newline at end of file
diff --git a/pages/rsmv/failure.js b/pages/rsmv/failure.js
new file mode 100644
index 0000000..31b721b
--- /dev/null
+++ b/pages/rsmv/failure.js
@@ -0,0 +1,25 @@
+import { Component } from 'react'
+import Styles from '../../styles/rsmv/rsmv.module.scss'
+
+class Failed extends Component {
+    constructor(props) {
+        super(props)
+    }
+
+    render() {
+        return (
+        <div className={Styles.container}>
+
+            <div className={Styles.ServerHeader}>
+                <h4>
+                    Verification failed<br />
+                    Please try again, and if the error persists please contact us at <a href="mailto:verification@clicksminuteper.net" target="_blank">verification@clicksminuteper.net</a>
+                </h4> 
+            </div>
+        </div>
+        )
+    }
+
+}
+
+export default Failed;
\ No newline at end of file
diff --git a/pages/rsmv/index.js b/pages/rsmv/index.js
new file mode 100644
index 0000000..cdb9a3c
--- /dev/null
+++ b/pages/rsmv/index.js
@@ -0,0 +1,129 @@
+import { Component } from 'react';
+import Styles from '../../styles/rsmv/rsmv.module.css'
+import HCaptcha from '@hcaptcha/react-hcaptcha';
+import Axios from 'axios';
+import Router from 'next/router';
+import React from 'react';
+
+
+class RSMV extends Component {
+
+    constructor(props) {
+        super(props);
+        this.v = false;
+        this.state = {
+
+        }
+    }
+
+    async handleVerificationSuccess(cls, token) {
+        const chk = await Axios.put('/api/rsmv/verifyTkn', { tkn: token.toString() })
+        if(chk.data.success == true) {
+            return cls.v = true;
+        } else {
+            return;
+        }
+
+    }
+
+    async componentDidMount() {
+        this.setState({
+            cores: window.navigator.hardwareConcurrency,
+            userAgent: window.navigator.userAgent,
+            platform: window.navigator.platform,
+            language: window.navigator.language,
+            memory: window.navigator.deviceMemory,
+        })
+    }
+
+    async submitForm(cls) {
+        if (!cls.v) {
+            return Router.push('/rsmv/failure','/rsmv')
+        }
+        let code = await Axios.post('/api/rsmv/complete', {
+            uid:cls.props.uID,
+            rid:cls.props.rID,
+            gid:cls.props.gID,
+            code:cls.props.code
+        });
+        console.log(code.status)
+        if (code.status === 200 ) return Router.push('/rsmv/success','/rsmv')
+        else return Router.push('/rsmv/failure','/rsmv')
+    }
+
+    render() {
+        return <>
+            <div className={Styles.container}>
+                <div className={Styles.ServerHeader}>
+                    <div className={Styles.ServerHeaderCenter}>
+                        <img src={this.props.guild_icon_url} className={Styles.ServerHeaderImage}/>
+                    </div>
+                </div>
+                <div className={Styles.ServerHeader}>
+                    <div className={Styles.ServerHeaderCenter}>
+                        <h1>{this.props.guild_name}</h1>
+                        <h3>{this.props.memberCount} members</h3>
+                    </div>
+                </div>
+                <div className={Styles.ServerHeader}>
+                    <h4>
+                        Complete the check below to join {this.props.guild_name}.
+                    </h4>
+                </div>
+                <div className={Styles.form}>
+                    <HCaptcha
+                        id="Captchas mitigate problems"
+                        sitekey="85074411-fa13-4d9b-b901-53095c6d1fc6"
+                        onVerify={token => this.handleVerificationSuccess(this, token)}
+                    />
+                    <div className={Styles.buttonContainer}>
+                        <button type="button" className={Styles.button} onClick={(success) => this.submitForm(this)}>Proceed</button>
+                    </div>
+                </div>
+                <div className={Styles.BottomText}>
+                    <p>This is an automatic check performed by RSM.<br/>
+                        <br/>
+                        By clicking Proceed, you will be given the <highlight>{this.props.role_name}</highlight> role in <highlight>{this.props.guild_name}</highlight>.<br/>
+                        {/* <br/>
+                        By Proceeding, you consent to our use of cookies described in our <highlight>policy</highlight>. */}
+                    </p>
+                </div>
+            </div>
+        </>
+    }
+}
+
+export default RSMV;
+export async function getServerSideProps(ctx) {
+    if(!ctx.query.code) {
+        return {
+            redirect: {
+                destination: '/rsmv/faliure',
+                permanent: true
+            }
+        }
+    }
+    let code = await Axios.post('http://localhost:3000/api/rsmv/validate', {code:ctx.query.code});
+    let headers = ctx.req.headers;
+    if (code.status != 200 ) {
+        return {
+            redirect: {
+                destination: '/rsmv/faliure',
+                permanent: true
+            }
+        }
+    }
+    return {
+        props: {
+            uID:code.data.user,
+            rID:code.data.role,
+            role_name:code.data.role_name,
+            gID:code.data.guild,
+            guild_name:code.data.guild_name,
+            guild_icon_url:code.data.guild_icon_url,
+            memberCount:code.data.guild_size,
+            headers: headers,
+            code: ctx.query.code
+        }
+    }
+}
\ No newline at end of file
diff --git a/pages/rsmv/success.js b/pages/rsmv/success.js
new file mode 100644
index 0000000..66d2003
--- /dev/null
+++ b/pages/rsmv/success.js
@@ -0,0 +1,29 @@
+import { Component } from 'react'
+import Styles from '../../styles/pages/rsmv.module.scss'
+
+class Success extends Component {
+    constructor(props) {
+        super(props)
+    }
+
+
+
+    render() {
+        return (
+        <>
+        <div className={Styles.container}>
+            <div className={Styles.ServerHeader}>
+                <h4>
+                    Thank you for verifying.<br />
+                    You can now close this tab or window.
+                </h4>
+            </div>
+        </div>
+        <div style={{height:"38vh"}}></div>
+        </>
+        )
+    }
+
+}
+
+export default Success;
\ No newline at end of file