basic message fetching
parent
602c8cc2c9
commit
bcf00e1cd7
|
@ -0,0 +1,12 @@
|
||||||
|
# Exclude jsii outdir and build output
|
||||||
|
dist
|
||||||
|
*.js
|
||||||
|
*.d.ts
|
||||||
|
|
||||||
|
.jsii
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
obj/
|
||||||
|
|
||||||
|
tsconfig.json
|
||||||
|
tsconfig.tsbuildinfo
|
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
# Exclude typescript source and config
|
||||||
|
*.ts
|
||||||
|
tsconfig.json
|
||||||
|
|
||||||
|
# Include javascript files and typescript declarations
|
||||||
|
!*.js
|
||||||
|
!*.d.ts
|
||||||
|
|
||||||
|
# Exclude jsii outdir
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Include .jsii and .jsii.gz
|
||||||
|
!.jsii
|
||||||
|
!.jsii.gz
|
|
@ -0,0 +1,17 @@
|
||||||
|
# Pewcans
|
||||||
|
|
||||||
|
Pretty Easy Wrapper for Two Cans & String API for version 1.68.
|
||||||
|
|
||||||
|
Typescript module that can also be used in Python, .NET, and Java using
|
||||||
|
[jsii](https://github.com/aws/jsii).
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```py
|
||||||
|
from pewcans import Client
|
||||||
|
|
||||||
|
client = Client("AUTH COOKIE HERE")
|
||||||
|
res = client.messages.folder_view()
|
||||||
|
for msg in res.messages:
|
||||||
|
print(msg.preview)
|
||||||
|
```
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,43 @@
|
||||||
|
{
|
||||||
|
"name": "pewcans",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Pretty easy wrapper for Two Cans & String API",
|
||||||
|
"scripts": {
|
||||||
|
"build": "jsii --strict",
|
||||||
|
"dist": "jsii --strict && jsii-pacmak",
|
||||||
|
"clean": "rm -r dist obj || true",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"repository": {
|
||||||
|
"url": "https://github.com/humanoidsandvichdispenser/pew.git"
|
||||||
|
},
|
||||||
|
"main": "obj/index.js",
|
||||||
|
"types": "obj/index.d.ts",
|
||||||
|
"author": {
|
||||||
|
"name": "HumanoidSandvichDispenser",
|
||||||
|
"email": "humanoidsandvichdispenser@gmail.com"
|
||||||
|
},
|
||||||
|
"license": "GPL-3.0-only",
|
||||||
|
"jsii": {
|
||||||
|
"excludeTypescript": ["*.test.ts"],
|
||||||
|
"versionFormat": "full",
|
||||||
|
"outdir": "dist",
|
||||||
|
"tsc": {
|
||||||
|
"outDir": "obj",
|
||||||
|
"rootDir": "src"
|
||||||
|
},
|
||||||
|
"targets": {
|
||||||
|
"python": {
|
||||||
|
"distName": "pewcans",
|
||||||
|
"module": "pewcans"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"stability": "experimental",
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.8.4",
|
||||||
|
"jsii": "^5.2.14",
|
||||||
|
"jsii-pacmak": "^1.90.0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,113 @@
|
||||||
|
import { MessagesModule } from "./messages";
|
||||||
|
|
||||||
|
export interface MethodCall {
|
||||||
|
readonly fn: string;
|
||||||
|
readonly payload: { [key: string]: any };
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TCJSONResponse {
|
||||||
|
readonly ok: boolean;
|
||||||
|
readonly loginId: string;
|
||||||
|
readonly responses: TCResponse[];
|
||||||
|
readonly profiles: TCProfile[];
|
||||||
|
readonly auth: string;
|
||||||
|
readonly ver: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TCResponse {
|
||||||
|
readonly ok: boolean;
|
||||||
|
readonly profiles: TCProfile[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: move this to another file
|
||||||
|
|
||||||
|
export interface TCUser {
|
||||||
|
readonly id?: string;
|
||||||
|
readonly anon?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TCProfile {
|
||||||
|
readonly id: string;
|
||||||
|
readonly name: string;
|
||||||
|
readonly online: number;
|
||||||
|
readonly avatar: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Client for Two Cans & String API.
|
||||||
|
*/
|
||||||
|
export class Client {
|
||||||
|
static readonly BASE_URI = "https://twocansandstring.com/api";
|
||||||
|
static readonly VERSION = "1.68"
|
||||||
|
|
||||||
|
#messages: MessagesModule;
|
||||||
|
|
||||||
|
public get messages(): MessagesModule {
|
||||||
|
return this.#messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public auth: string;
|
||||||
|
|
||||||
|
public constructor(auth: string) {
|
||||||
|
this.auth = auth;
|
||||||
|
|
||||||
|
// init modules
|
||||||
|
this.#messages = new MessagesModule(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls an API method.
|
||||||
|
* @param methodName The name of the API method to call.
|
||||||
|
* @param args The arguments to pass to the API method.
|
||||||
|
*/
|
||||||
|
public async call<T extends TCResponse>(
|
||||||
|
methodName: string, args: { [key: string]: any }
|
||||||
|
): Promise<T>
|
||||||
|
{
|
||||||
|
let methodCall: MethodCall = {
|
||||||
|
fn: methodName,
|
||||||
|
payload: args,
|
||||||
|
};
|
||||||
|
|
||||||
|
let body = {
|
||||||
|
auth: this.auth,
|
||||||
|
requests: [ methodCall ],
|
||||||
|
};
|
||||||
|
|
||||||
|
let res = await this.fetch(body);
|
||||||
|
|
||||||
|
if (res?.ok) {
|
||||||
|
let methodRes = res.responses[0];
|
||||||
|
return {
|
||||||
|
...methodRes,
|
||||||
|
profiles: res.profiles,
|
||||||
|
} as T;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
ok: false,
|
||||||
|
} as T;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async fetch(body: any): Promise<TCJSONResponse | undefined> {
|
||||||
|
let req = {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Cookie": "twocansandstring_com_auth2=" + this.auth,
|
||||||
|
"User-Agent": "pewcans",
|
||||||
|
},
|
||||||
|
body: JSON.stringify(body),
|
||||||
|
};
|
||||||
|
|
||||||
|
let res = await fetch(Client.BASE_URI, req);
|
||||||
|
|
||||||
|
if (!res.ok) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let json: TCJSONResponse = await res.json() as TCJSONResponse;
|
||||||
|
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
// hi
|
||||||
|
|
||||||
|
//export * from "./test";
|
||||||
|
export * from "./messages";
|
||||||
|
export * from "./module";
|
||||||
|
export * from "./client";
|
|
@ -0,0 +1,34 @@
|
||||||
|
import { Module } from "./module";
|
||||||
|
import { TCResponse, TCUser } from "./client";
|
||||||
|
|
||||||
|
export interface FolderViewResponse extends TCResponse {
|
||||||
|
readonly hasMore: boolean;
|
||||||
|
readonly hasPrevious: boolean;
|
||||||
|
readonly messages: MessagePreview[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MessagePreview {
|
||||||
|
readonly id: string;
|
||||||
|
readonly subject: string;
|
||||||
|
readonly preview: string;
|
||||||
|
readonly time: number;
|
||||||
|
readonly users: TCUser[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export class MessagesModule extends Module {
|
||||||
|
public async folderView(folder = "inbox", page = 1): Promise<FolderViewResponse> {
|
||||||
|
let ret = await this.client.call<FolderViewResponse>(
|
||||||
|
"messages.folderview",
|
||||||
|
{
|
||||||
|
folder,
|
||||||
|
page,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
|
throw 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { Client } from "./client";
|
||||||
|
|
||||||
|
export class Module {
|
||||||
|
#client: Client;
|
||||||
|
|
||||||
|
protected get client(): Client {
|
||||||
|
return this.#client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public constructor(client: Client) {
|
||||||
|
this.#client = client;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue