add reg, hw will use imei instead of token
This commit is contained in:
parent
7b52bb9da9
commit
e15bdc192a
@ -4,6 +4,60 @@ import { IsValidUUID } from '../lib/uuid';
|
||||
import { Status } from '../lib/status';
|
||||
import { Wrap } from '../lib/wrapper';
|
||||
|
||||
async function CMDBind(env: Env, chat_id: number, text: string): Promise<Response> {
|
||||
const uuid = text.split('CMD:BIND:')[1];
|
||||
|
||||
// validate uuid
|
||||
if (!IsValidUUID(uuid)) {
|
||||
await new Bot(env.TG_BOT_TOKEN).send(chat_id, '[BOT] Invalid UUID (1)');
|
||||
return Wrap(Status.BadRequest, 'Invalid UUID (1)');
|
||||
}
|
||||
|
||||
// NOTE: since KV is eventually consistent, these checks might not be correct
|
||||
|
||||
// check if chat_id is already bounded to uuid
|
||||
if ((await env.KV.get(`C:${chat_id}`)) !== null) {
|
||||
await new Bot(env.TG_BOT_TOKEN).send(chat_id, '[BOT] Already Bounded');
|
||||
return Wrap(Status.OK, 'Already bounded');
|
||||
}
|
||||
|
||||
// check if uuid is already bounded to chat_id
|
||||
if ((await env.KV.get(`U:${uuid}`)) !== null) {
|
||||
await new Bot(env.TG_BOT_TOKEN).send(chat_id, '[BOT] Invalid UUID (2)');
|
||||
return Wrap(Status.OK, 'Invalid UUID (2)');
|
||||
}
|
||||
|
||||
// bind
|
||||
await env.KV.put(`U:${uuid}`, chat_id.toString());
|
||||
await env.KV.put(`C:${chat_id}`, uuid);
|
||||
|
||||
await new Bot(env.TG_BOT_TOKEN).send(chat_id, '[BOT] Bind Success');
|
||||
return Wrap(Status.OK, 'Bind Success');
|
||||
}
|
||||
|
||||
async function CMDUnbind(env: Env, chat_id: number, text: string): Promise<Response> {
|
||||
// check if chat_id is bounded
|
||||
const uuid = await env.KV.get(`C:${chat_id}`);
|
||||
if (uuid === null) {
|
||||
await new Bot(env.TG_BOT_TOKEN).send(chat_id, '[BOT] Not Bounded');
|
||||
return Wrap(Status.OK, 'Not bounded');
|
||||
}
|
||||
|
||||
// unbind
|
||||
await env.KV.delete(`U:${uuid}`);
|
||||
await env.KV.delete(`C:${chat_id}`);
|
||||
|
||||
await new Bot(env.TG_BOT_TOKEN).send(chat_id, '[BOT] Unbind Success');
|
||||
return Wrap(Status.OK, 'Unbind Success');
|
||||
}
|
||||
|
||||
type CMDHandler = (env: Env, chat_id: number, text: string) => Promise<Response>;
|
||||
const cmd: { [prefix: string]: CMDHandler } = {
|
||||
'CMD:BIND:': CMDBind,
|
||||
'CMD:UNBIND': CMDUnbind,
|
||||
// TODO: CMD:SEND:
|
||||
};
|
||||
|
||||
export async function FuncHook(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
||||
if (request.method !== 'POST') return Wrap(Status.BadRequest, 'Only POST method is allowed');
|
||||
|
||||
@ -18,25 +72,11 @@ export async function FuncHook(request: Request, env: Env, ctx: ExecutionContext
|
||||
|
||||
console.debug(`[Hook] ${chat_id} ${text}`);
|
||||
|
||||
if (text.startsWith('BIND:')) {
|
||||
const uuid = text.split(':')[1];
|
||||
if (!IsValidUUID(uuid)) return Wrap(Status.BadRequest, 'Invalid UUID');
|
||||
await env.KV.put(uuid, chat_id.toString());
|
||||
await new Bot(env.TG_BOT_TOKEN).send(chat_id, '[BOT] Bind Success');
|
||||
return Wrap(Status.OK, 'Bind successfully');
|
||||
for (const prefix in cmd) {
|
||||
if (text.startsWith(prefix)) {
|
||||
return cmd[prefix](env, chat_id, text);
|
||||
}
|
||||
|
||||
if (text.startsWith('UNBIND:')) {
|
||||
const uuid = text.split(':')[1];
|
||||
if (!IsValidUUID(uuid)) return Wrap(Status.BadRequest, 'Invalid UUID');
|
||||
await env.KV.delete(uuid);
|
||||
await new Bot(env.TG_BOT_TOKEN).send(chat_id, '[BOT] Unbind Success');
|
||||
return Wrap(Status.OK, 'Unbind successfully');
|
||||
}
|
||||
|
||||
// TODO: Handle "SEND:" command
|
||||
|
||||
// TODO: Handle Cited Message (Text or Voice) with command
|
||||
|
||||
return Wrap(Status.OK, 'Nothing Executed');
|
||||
}
|
||||
|
@ -1,18 +1,20 @@
|
||||
import { Bot } from '../lib/bot';
|
||||
import { Env } from '../index';
|
||||
import { IsValidUUID } from '../lib/uuid';
|
||||
import { Status } from '../lib/status';
|
||||
import { Wrap } from '../lib/wrapper';
|
||||
|
||||
export async function FuncPush(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
||||
if (request.method !== 'POST') return Wrap(Status.BadRequest, 'Only POST method is allowed');
|
||||
|
||||
const token = request.headers.get('X-Auth-Token');
|
||||
if (!token) return Wrap(Status.BadRequest, 'Missing X-Auth-Token header');
|
||||
if (!IsValidUUID(token)) return Wrap(Status.BadRequest, 'Invalid Token');
|
||||
const imei = request.headers.get('X-Auth-Token');
|
||||
if (!imei) return Wrap(Status.BadRequest, 'Missing X-Auth-Token header');
|
||||
if (imei.length < 15 || imei.length > 17) return Wrap(Status.BadRequest, 'Invalid Token (1)');
|
||||
|
||||
const chat_id = await env.KV.get(token);
|
||||
if (!chat_id) return Wrap(Status.BadRequest, 'Invalid Token');
|
||||
const uuid = await env.KV.get(`I:${imei}`);
|
||||
if (!uuid) return Wrap(Status.BadRequest, 'Invalid Token (2)');
|
||||
|
||||
const chat_id = await env.KV.get(`U:${uuid}`);
|
||||
if (!chat_id) return Wrap(Status.BadRequest, 'Invalid Token (3)');
|
||||
|
||||
const bot = new Bot(env.TG_BOT_TOKEN);
|
||||
const message = await request.text();
|
||||
|
18
src/func/reg.ts
Normal file
18
src/func/reg.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { Env } from '../index';
|
||||
import { GenUUID } from '../lib/uuid';
|
||||
import { Status } from '../lib/status';
|
||||
import { Wrap } from '../lib/wrapper';
|
||||
|
||||
export async function FuncReg(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
||||
if (request.method !== 'POST') return Wrap(Status.BadRequest, 'Only POST method is allowed');
|
||||
|
||||
const imei = await request.text();
|
||||
if (!imei || imei.length < 15 || imei.length > 17) return Wrap(Status.BadRequest, 'Invalid IMEI');
|
||||
|
||||
const token = await env.KV.get(`I:${imei}`);
|
||||
if (token) return Wrap(Status.OK, token);
|
||||
|
||||
const new_token = GenUUID();
|
||||
await env.KV.put(`I:${imei}`, new_token);
|
||||
return Wrap(Status.OK, new_token);
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
import { NotFound } from './lib/wrapper';
|
||||
import { FuncPush } from './func/push';
|
||||
import { FuncHook } from './func/hook';
|
||||
import { FuncReg } from './func/reg';
|
||||
|
||||
export interface Env {
|
||||
KV: KVNamespace;
|
||||
@ -14,6 +15,7 @@ export type Handler = (request: Request, env: Env, ctx: ExecutionContext) => Pro
|
||||
const routes: { [page: string]: Handler } = {
|
||||
'/push': FuncPush,
|
||||
'/hook': FuncHook,
|
||||
'/reg': FuncReg,
|
||||
};
|
||||
|
||||
export default {
|
||||
|
Loading…
Reference in New Issue
Block a user