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