Bringing over stuff from the test files.

This commit is contained in:
iamBadgers
2025-08-03 15:26:37 -07:00
parent d66c671a91
commit b3548db874
9 changed files with 4234 additions and 3 deletions

17
src/module.json Normal file
View File

@@ -0,0 +1,17 @@
{
"id": "testmodule",
"title": "Foundry TS",
"description": "A simple module using Typescript",
"authors": [
{
"name": "Josh Matthews",
"email": "josh@bringingfire.com"
}
],
"version": "1.0.0",
"compatibility": {
"minimum": "9",
"verified": "10"
},
"esmodules": ["scripts/module.js"]
}

View File

@@ -0,0 +1,62 @@
// @generated by protobuf-ts 2.11.0
// @generated from protobuf file "character.proto" (syntax proto3)
// tslint:disable
import type { RpcTransport } from "@protobuf-ts/runtime-rpc";
import type { ServiceInfo } from "@protobuf-ts/runtime-rpc";
import { CharacterManager } from "./character";
import type { ListCharacterResponse } from "./character";
import type { ListCharacterRequest } from "./character";
import type { GetCharacterRequest } from "./character";
import { stackIntercept } from "@protobuf-ts/runtime-rpc";
import type { Character } from "./character";
import type { CreateCharacterRequest } from "./character";
import type { UnaryCall } from "@protobuf-ts/runtime-rpc";
import type { RpcOptions } from "@protobuf-ts/runtime-rpc";
/**
* @generated from protobuf service CharacterManager
*/
export interface ICharacterManagerClient {
/**
* @generated from protobuf rpc: createCharacter
*/
createCharacter(input: CreateCharacterRequest, options?: RpcOptions): UnaryCall<CreateCharacterRequest, Character>;
/**
* @generated from protobuf rpc: getCharacter
*/
getCharacter(input: GetCharacterRequest, options?: RpcOptions): UnaryCall<GetCharacterRequest, Character>;
/**
* @generated from protobuf rpc: listCharacters
*/
listCharacters(input: ListCharacterRequest, options?: RpcOptions): UnaryCall<ListCharacterRequest, ListCharacterResponse>;
}
/**
* @generated from protobuf service CharacterManager
*/
export class CharacterManagerClient implements ICharacterManagerClient, ServiceInfo {
typeName = CharacterManager.typeName;
methods = CharacterManager.methods;
options = CharacterManager.options;
constructor(private readonly _transport: RpcTransport) {
}
/**
* @generated from protobuf rpc: createCharacter
*/
createCharacter(input: CreateCharacterRequest, options?: RpcOptions): UnaryCall<CreateCharacterRequest, Character> {
const method = this.methods[0], opt = this._transport.mergeOptions(options);
return stackIntercept<CreateCharacterRequest, Character>("unary", this._transport, method, opt, input);
}
/**
* @generated from protobuf rpc: getCharacter
*/
getCharacter(input: GetCharacterRequest, options?: RpcOptions): UnaryCall<GetCharacterRequest, Character> {
const method = this.methods[1], opt = this._transport.mergeOptions(options);
return stackIntercept<GetCharacterRequest, Character>("unary", this._transport, method, opt, input);
}
/**
* @generated from protobuf rpc: listCharacters
*/
listCharacters(input: ListCharacterRequest, options?: RpcOptions): UnaryCall<ListCharacterRequest, ListCharacterResponse> {
const method = this.methods[2], opt = this._transport.mergeOptions(options);
return stackIntercept<ListCharacterRequest, ListCharacterResponse>("unary", this._transport, method, opt, input);
}
}

402
src/proto/character.ts Normal file
View File

@@ -0,0 +1,402 @@
// @generated by protobuf-ts 2.11.0
// @generated from protobuf file "character.proto" (syntax proto3)
// tslint:disable
import { ServiceType } from "@protobuf-ts/runtime-rpc";
import { WireType } from "@protobuf-ts/runtime";
import type { BinaryWriteOptions } from "@protobuf-ts/runtime";
import type { IBinaryWriter } from "@protobuf-ts/runtime";
import type { BinaryReadOptions } from "@protobuf-ts/runtime";
import type { IBinaryReader } from "@protobuf-ts/runtime";
import { UnknownFieldHandler } from "@protobuf-ts/runtime";
import type { PartialMessage } from "@protobuf-ts/runtime";
import { reflectionMergePartial } from "@protobuf-ts/runtime";
import { MessageType } from "@protobuf-ts/runtime";
/**
* @generated from protobuf message Empty
*/
export interface Empty {
}
/**
* @generated from protobuf message Character
*/
export interface Character {
/**
* @generated from protobuf field: string PlayerName = 1
*/
playerName: string;
/**
* @generated from protobuf field: string CharacterName = 2
*/
characterName: string;
/**
* @generated from protobuf field: repeated string CharacterAlias = 3
*/
characterAlias: string[];
/**
* @generated from protobuf field: string Version = 4
*/
version: string;
/**
* @generated from protobuf field: string SourceTable = 5
*/
sourceTable: string;
/**
* @generated from protobuf field: string Json = 6
*/
json: string;
}
/**
* @generated from protobuf message CreateCharacterRequest
*/
export interface CreateCharacterRequest {
/**
* @generated from protobuf field: Character characterData = 1
*/
characterData?: Character;
}
/**
* @generated from protobuf message GetCharacterRequest
*/
export interface GetCharacterRequest {
}
/**
* @generated from protobuf message ListCharacterRequest
*/
export interface ListCharacterRequest {
/**
* @generated from protobuf field: string PlayerName = 1
*/
playerName: string;
/**
* @generated from protobuf field: string CharacterName = 2
*/
characterName: string;
}
/**
* @generated from protobuf message ListCharacterResponse
*/
export interface ListCharacterResponse {
/**
* @generated from protobuf field: repeated Character characters = 1
*/
characters: Character[];
}
// @generated message type with reflection information, may provide speed optimized methods
class Empty$Type extends MessageType<Empty> {
constructor() {
super("Empty", []);
}
override create(value?: PartialMessage<Empty>): Empty {
const message = globalThis.Object.create((this.messagePrototype!));
if (value !== undefined)
reflectionMergePartial<Empty>(this, message, value);
return message;
}
override internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Empty): Empty {
let message = target ?? this.create(), end = reader.pos + length;
while (reader.pos < end) {
let [fieldNo, wireType] = reader.tag();
switch (fieldNo) {
default:
let u = options.readUnknownField;
if (u === "throw")
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
let d = reader.skip(wireType);
if (u !== false)
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
}
}
return message;
}
override internalBinaryWrite(message: Empty, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
return writer;
}
}
/**
* @generated MessageType for protobuf message Empty
*/
export const Empty = new Empty$Type();
// @generated message type with reflection information, may provide speed optimized methods
class Character$Type extends MessageType<Character> {
constructor() {
super("Character", [
{ no: 1, name: "PlayerName", kind: "scalar", jsonName: "PlayerName", T: 9 /*ScalarType.STRING*/ },
{ no: 2, name: "CharacterName", kind: "scalar", jsonName: "CharacterName", T: 9 /*ScalarType.STRING*/ },
{ no: 3, name: "CharacterAlias", kind: "scalar", jsonName: "CharacterAlias", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ },
{ no: 4, name: "Version", kind: "scalar", jsonName: "Version", T: 9 /*ScalarType.STRING*/ },
{ no: 5, name: "SourceTable", kind: "scalar", jsonName: "SourceTable", T: 9 /*ScalarType.STRING*/ },
{ no: 6, name: "Json", kind: "scalar", jsonName: "Json", T: 9 /*ScalarType.STRING*/ }
]);
}
override create(value?: PartialMessage<Character>): Character {
const message = globalThis.Object.create((this.messagePrototype!));
message.playerName = "";
message.characterName = "";
message.characterAlias = [];
message.version = "";
message.sourceTable = "";
message.json = "";
if (value !== undefined)
reflectionMergePartial<Character>(this, message, value);
return message;
}
override internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Character): Character {
let message = target ?? this.create(), end = reader.pos + length;
while (reader.pos < end) {
let [fieldNo, wireType] = reader.tag();
switch (fieldNo) {
case /* string PlayerName */ 1:
message.playerName = reader.string();
break;
case /* string CharacterName */ 2:
message.characterName = reader.string();
break;
case /* repeated string CharacterAlias */ 3:
message.characterAlias.push(reader.string());
break;
case /* string Version */ 4:
message.version = reader.string();
break;
case /* string SourceTable */ 5:
message.sourceTable = reader.string();
break;
case /* string Json */ 6:
message.json = reader.string();
break;
default:
let u = options.readUnknownField;
if (u === "throw")
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
let d = reader.skip(wireType);
if (u !== false)
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
}
}
return message;
}
override internalBinaryWrite(message: Character, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
/* string PlayerName = 1; */
if (message.playerName !== "")
writer.tag(1, WireType.LengthDelimited).string(message.playerName);
/* string CharacterName = 2; */
if (message.characterName !== "")
writer.tag(2, WireType.LengthDelimited).string(message.characterName);
/* repeated string CharacterAlias = 3; */
for (let i = 0; i < message.characterAlias.length; i++)
writer.tag(3, WireType.LengthDelimited).string(message.characterAlias[i]);
/* string Version = 4; */
if (message.version !== "")
writer.tag(4, WireType.LengthDelimited).string(message.version);
/* string SourceTable = 5; */
if (message.sourceTable !== "")
writer.tag(5, WireType.LengthDelimited).string(message.sourceTable);
/* string Json = 6; */
if (message.json !== "")
writer.tag(6, WireType.LengthDelimited).string(message.json);
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
return writer;
}
}
/**
* @generated MessageType for protobuf message Character
*/
export const Character = new Character$Type();
// @generated message type with reflection information, may provide speed optimized methods
class CreateCharacterRequest$Type extends MessageType<CreateCharacterRequest> {
constructor() {
super("CreateCharacterRequest", [
{ no: 1, name: "characterData", kind: "message", T: () => Character }
]);
}
override create(value?: PartialMessage<CreateCharacterRequest>): CreateCharacterRequest {
const message = globalThis.Object.create((this.messagePrototype!));
if (value !== undefined)
reflectionMergePartial<CreateCharacterRequest>(this, message, value);
return message;
}
override internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: CreateCharacterRequest): CreateCharacterRequest {
let message = target ?? this.create(), end = reader.pos + length;
while (reader.pos < end) {
let [fieldNo, wireType] = reader.tag();
switch (fieldNo) {
case /* Character characterData */ 1:
message.characterData = Character.internalBinaryRead(reader, reader.uint32(), options, message.characterData);
break;
default:
let u = options.readUnknownField;
if (u === "throw")
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
let d = reader.skip(wireType);
if (u !== false)
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
}
}
return message;
}
override internalBinaryWrite(message: CreateCharacterRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
/* Character characterData = 1; */
if (message.characterData)
Character.internalBinaryWrite(message.characterData, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
return writer;
}
}
/**
* @generated MessageType for protobuf message CreateCharacterRequest
*/
export const CreateCharacterRequest = new CreateCharacterRequest$Type();
// @generated message type with reflection information, may provide speed optimized methods
class GetCharacterRequest$Type extends MessageType<GetCharacterRequest> {
constructor() {
super("GetCharacterRequest", []);
}
override create(value?: PartialMessage<GetCharacterRequest>): GetCharacterRequest {
const message = globalThis.Object.create((this.messagePrototype!));
if (value !== undefined)
reflectionMergePartial<GetCharacterRequest>(this, message, value);
return message;
}
override internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetCharacterRequest): GetCharacterRequest {
let message = target ?? this.create(), end = reader.pos + length;
while (reader.pos < end) {
let [fieldNo, wireType] = reader.tag();
switch (fieldNo) {
default:
let u = options.readUnknownField;
if (u === "throw")
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
let d = reader.skip(wireType);
if (u !== false)
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
}
}
return message;
}
override internalBinaryWrite(message: GetCharacterRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
return writer;
}
}
/**
* @generated MessageType for protobuf message GetCharacterRequest
*/
export const GetCharacterRequest = new GetCharacterRequest$Type();
// @generated message type with reflection information, may provide speed optimized methods
class ListCharacterRequest$Type extends MessageType<ListCharacterRequest> {
constructor() {
super("ListCharacterRequest", [
{ no: 1, name: "PlayerName", kind: "scalar", jsonName: "PlayerName", T: 9 /*ScalarType.STRING*/ },
{ no: 2, name: "CharacterName", kind: "scalar", jsonName: "CharacterName", T: 9 /*ScalarType.STRING*/ }
]);
}
override create(value?: PartialMessage<ListCharacterRequest>): ListCharacterRequest {
const message = globalThis.Object.create((this.messagePrototype!));
message.playerName = "";
message.characterName = "";
if (value !== undefined)
reflectionMergePartial<ListCharacterRequest>(this, message, value);
return message;
}
override internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListCharacterRequest): ListCharacterRequest {
let message = target ?? this.create(), end = reader.pos + length;
while (reader.pos < end) {
let [fieldNo, wireType] = reader.tag();
switch (fieldNo) {
case /* string PlayerName */ 1:
message.playerName = reader.string();
break;
case /* string CharacterName */ 2:
message.characterName = reader.string();
break;
default:
let u = options.readUnknownField;
if (u === "throw")
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
let d = reader.skip(wireType);
if (u !== false)
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
}
}
return message;
}
override internalBinaryWrite(message: ListCharacterRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
/* string PlayerName = 1; */
if (message.playerName !== "")
writer.tag(1, WireType.LengthDelimited).string(message.playerName);
/* string CharacterName = 2; */
if (message.characterName !== "")
writer.tag(2, WireType.LengthDelimited).string(message.characterName);
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
return writer;
}
}
/**
* @generated MessageType for protobuf message ListCharacterRequest
*/
export const ListCharacterRequest = new ListCharacterRequest$Type();
// @generated message type with reflection information, may provide speed optimized methods
class ListCharacterResponse$Type extends MessageType<ListCharacterResponse> {
constructor() {
super("ListCharacterResponse", [
{ no: 1, name: "characters", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => Character }
]);
}
override create(value?: PartialMessage<ListCharacterResponse>): ListCharacterResponse {
const message = globalThis.Object.create((this.messagePrototype!));
message.characters = [];
if (value !== undefined)
reflectionMergePartial<ListCharacterResponse>(this, message, value);
return message;
}
override internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListCharacterResponse): ListCharacterResponse {
let message = target ?? this.create(), end = reader.pos + length;
while (reader.pos < end) {
let [fieldNo, wireType] = reader.tag();
switch (fieldNo) {
case /* repeated Character characters */ 1:
message.characters.push(Character.internalBinaryRead(reader, reader.uint32(), options));
break;
default:
let u = options.readUnknownField;
if (u === "throw")
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
let d = reader.skip(wireType);
if (u !== false)
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
}
}
return message;
}
override internalBinaryWrite(message: ListCharacterResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
/* repeated Character characters = 1; */
for (let i = 0; i < message.characters.length; i++)
Character.internalBinaryWrite(message.characters[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join();
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
return writer;
}
}
/**
* @generated MessageType for protobuf message ListCharacterResponse
*/
export const ListCharacterResponse = new ListCharacterResponse$Type();
/**
* @generated ServiceType for protobuf service CharacterManager
*/
export const CharacterManager = new ServiceType("CharacterManager", [
{ name: "createCharacter", options: {}, I: CreateCharacterRequest, O: Character },
{ name: "getCharacter", options: {}, I: GetCharacterRequest, O: Character },
{ name: "listCharacters", options: {}, I: ListCharacterRequest, O: ListCharacterResponse }
]);

View File

@@ -0,0 +1,20 @@
<section>
<header class="flex-header">
<h1>
Dog Browser
</h1>
<button
type="button"
class="module-control"
title="Fetch random dog photo"
data-action="randomize-dog"
>
<i class="fas fa-random fa-fw"></i>
</button>
</header>
</section>
<section>
<p>
🐶
</p>
</section>

View File

@@ -0,0 +1,21 @@
<section>
<header class="flex-header">
<h1>
Create Character
</h1>
<input/>
<button
type="button"
class="module-control"
title="Fetch random dog photo"
data-action="randomize-dog"
>
<i class="fas fa-random fa-fw"></i>
</button>
</header>
</section>
<section>
<p>
🐶
</p>
</section>

View File

@@ -0,0 +1,13 @@
import { id as moduleId } from "../../module.json";
export default class DogBrowser extends Application {
static override get defaultOptions(): ApplicationOptions {
return foundry.utils.mergeObject(super.defaultOptions, {
id: "dog-browser",
title: "Dog Browser",
template: `modules/${moduleId}/templates/CharacterBrowser.hbs`,
width: 720,
height: 720,
}) as ApplicationOptions;
}
}

View File

@@ -0,0 +1,13 @@
import { id as moduleId } from "../../module.json";
export default class DogBrowser extends Application {
static override get defaultOptions(): ApplicationOptions {
return foundry.utils.mergeObject(super.defaultOptions, {
id: "dog-browser",
title: "Dog Browser",
template: `modules/${moduleId}/templates/NewCharacter.hbs`,
width: 720,
height: 720,
}) as ApplicationOptions;
}
}

45
src/ts/module.ts Normal file
View File

@@ -0,0 +1,45 @@
import { CharacterManagerClient } from "../proto/character.client";
import { GetCharacterRequest } from '../proto/character'
import { GrpcWebFetchTransport } from '@protobuf-ts/grpcweb-transport'
import { ModuleData } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/packages.mjs";
import { id as moduleId } from "../module.json";
import DogBrowser from "./apps/NewCharacter";
interface MyModule extends Game.ModuleData<ModuleData> {
dogBrowser: DogBrowser;
}
let module: MyModule;
Hooks.once("init", async () => {
console.log("hello world!");
const client = new CharacterManagerClient(
new GrpcWebFetchTransport({
baseUrl: 'http://localhost/api',
format: 'binary',
}),
);
console.log("Potato");
let request = GetCharacterRequest.fromJson({
})
console.log("Potato");
let a = await client.getCharacter(request).then((res) => {
console.log(res)
return res
})
console.log(a.response)
console.log("Potato");
console.log(`Initializing ${moduleId}`);
module = (game as Game).modules.get(moduleId) as MyModule;
module.dogBrowser = new DogBrowser();
module.dogBrowser.render(true);
});