Skip to content

Commit

Permalink
Merge pull request #25 from xmtp-labs/rygine/updates
Browse files Browse the repository at this point in the history
Update types
  • Loading branch information
rygine authored Jun 12, 2024
2 parents 5893454 + 7cddc95 commit d0caaab
Show file tree
Hide file tree
Showing 13 changed files with 296 additions and 2,059 deletions.
54 changes: 0 additions & 54 deletions packages/botkit/src/content-types/Bot.ts

This file was deleted.

61 changes: 61 additions & 0 deletions packages/botkit/src/content-types/BotMessage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { ContentCodec, ContentTypeId, EncodedContent } from "@xmtp/xmtp-js";
import { CommandGroup, Metadata, User } from "../helpers/types";

export const ContentTypeBotMessage = new ContentTypeId({
authorityId: "xmtp.org",
typeId: "bot",
versionMajor: 1,
versionMinor: 0,
});

export type BotMessageMetadata = {
users?: User[];
commands?: CommandGroup[];
};

export type BotMessage = {
receivers: string[];
content: string;
metadata?: BotMessageMetadata;
};

export class BotMessageCodec implements ContentCodec<BotMessage> {
get contentType() {
return ContentTypeBotMessage;
}

encode(message: BotMessage) {
const { receivers, content, metadata } = message; // Include receivers in the destructuring

return {
type: this.contentType,
parameters: {},
content: new TextEncoder().encode(
JSON.stringify({ receivers, content, metadata }), // Include receivers in the JSON string
),
};
}

decode(encodedContent: EncodedContent): BotMessage {
const decodedContent = new TextDecoder().decode(encodedContent.content);

try {
const message = JSON.parse(decodedContent) as BotMessage;
const { receivers, content, metadata } = message;
return { receivers, content, metadata };
} catch (e) {
return {
receivers: [],
content: "",
};
}
}

fallback() {
return undefined;
}

shouldPush() {
return false;
}
}
41 changes: 23 additions & 18 deletions packages/botkit/src/content-types/Silent.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// @ts-nocheck
import { ContentTypeId } from "@xmtp/xmtp-js";
import { ContentCodec, ContentTypeId, EncodedContent } from "@xmtp/xmtp-js";
import { Metadata } from "../helpers/types";

export const ContentTypeSilent = new ContentTypeId({
authorityId: "xmtp.org",
Expand All @@ -8,42 +8,47 @@ export const ContentTypeSilent = new ContentTypeId({
versionMinor: 0,
});

export class SilentCodec {
export type SilentMetadata = {
type: "access" | "ping";
access?: boolean;
} & Metadata;

export type Silent = {
metadata?: SilentMetadata;
};

export class SilentCodec implements ContentCodec<Silent> {
get contentType() {
return ContentTypeSilent;
}

encode(silent) {
const { content, metadata } = silent;
encode(silent: Silent) {
const { metadata } = silent;

return {
type: ContentTypeSilent,
type: this.contentType,
parameters: {},
content: new TextEncoder().encode(JSON.stringify({ content, metadata })),
content: new TextEncoder().encode(JSON.stringify({ metadata })),
};
}

decode(encodedContent) {
decode(encodedContent: EncodedContent): Silent {
const decodedContent = new TextDecoder().decode(encodedContent.content);

try {
const silent = JSON.parse(decodedContent);
const { content, metadata } = silent;
return { content, metadata };
const silent = JSON.parse(decodedContent) as Silent;
const { metadata } = silent;
return { metadata };
} catch (e) {
const parameters = encodedContent.parameters;
return {
content: decodedContent,
metadata: parameters.metadata,
};
return {};
}
}

fallback(content) {
fallback() {
return undefined;
}

shouldPush(content) {
shouldPush() {
return false;
}
}
10 changes: 0 additions & 10 deletions packages/botkit/src/gm.ts

This file was deleted.

64 changes: 33 additions & 31 deletions packages/botkit/src/helpers/context.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
import { ContentTypeSilent } from "../content-types/Silent.js";
import { Conversation, DecodedMessage } from "@xmtp/xmtp-js";
import { ContentTypeSilent, Silent } from "../content-types/Silent.js";
import HandlerContext from "../lib/handlerContext.js";
import { Metadata } from "./types.js";

export async function grantAccess(conversation: any, metadata: any) {
// Add group member
await conversation.send(
{
content: "",
metadata: {
type: "access",
...metadata,
},
},
{
contentType: ContentTypeSilent,
export async function grantAccess(
conversation: Conversation,
metadata?: Metadata,
) {
const content: Silent = {
metadata: {
type: "access",
...metadata,
},
);
};
// Add group member
await conversation.send(content, {
contentType: ContentTypeSilent,
});
}

export async function ping(
conversation: any,
metadata: any,
conversation: Conversation,
accessHandler: boolean,
metadata?: Metadata,
) {
// Send a ping with access handler status
let content = {
content: "",
let content: Silent = {
metadata: {
type: "ping",
access: accessHandler,
Expand All @@ -35,24 +37,24 @@ export async function ping(
});
}

export function handleSilentMessage(
message: any,
context: any,
accessHandler?: (context: any) => Promise<boolean>,
export async function handleSilentMessage(
message: DecodedMessage,
context: HandlerContext,
accessHandler?: (context: HandlerContext) => Promise<boolean>,
) {
// Handle silent messages and populate context based on message type
if (message.contentType.sameAs(ContentTypeSilent)) {
if (message.content.metadata.type === "access" && accessHandler) {
return accessHandler(context).then((accept) => {
if (accept) {
return grantAccess(message.conversation, message.content.metadata);
}
});
} else if (message.content.metadata.type === "ping") {
const messageContent = message.content as Silent;
if (messageContent.metadata?.type === "access" && accessHandler) {
const accept = await accessHandler(context);
if (accept) {
return grantAccess(message.conversation, messageContent.metadata);
}
} else if (messageContent.metadata?.type === "ping") {
return ping(
message.conversation,
message.content.metadata,
!!accessHandler,
(await accessHandler?.(context)) ?? false,
messageContent.metadata,
);
}
}
Expand Down
6 changes: 5 additions & 1 deletion packages/botkit/src/helpers/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export interface CommandParamConfig {
export interface CommandConfig {
command: string;
description: string;
params: { [param: string]: CommandParamConfig };
params: Record<string, CommandParamConfig>;
}

export interface CommandGroup {
Expand All @@ -29,4 +29,8 @@ export interface CommandGroup {
export interface User {
username: string;
address: string;
tokens: number;
}

export type MetadataValue = string | number | boolean;
export type Metadata = Record<string, MetadataValue | MetadataValue[]>;
2 changes: 1 addition & 1 deletion packages/botkit/src/lib-mls/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Wallet } from "ethers";
import { ReactionCodec } from "../content-types/Reaction.js";
import { ReplyCodec } from "../content-types/Reply.js";
import { SilentCodec } from "../content-types/Silent.js";
import { BotMessageCodec } from "../content-types/Bot.js";
import { BotMessageCodec } from "../content-types/BotMessage.js";
import { Client, ClientOptions, XmtpEnv } from "@xmtp/mls-client";

export const mlsClient = async (
Expand Down
2 changes: 1 addition & 1 deletion packages/botkit/src/lib-mls/handlerContext.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Conversation, DecodedMessage } from "@xmtp/mls-client";
import { ContentTypeBotMessage } from "../content-types/Bot.js";
import { ContentTypeBotMessage } from "../content-types/BotMessage.js";
import { ContentTypeText } from "@xmtp/xmtp-js";
import { ContentTypeSilent } from "../content-types/Silent.js";

Expand Down
10 changes: 5 additions & 5 deletions packages/botkit/src/lib-mls/runner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { extractCommandValues } from "../helpers/commands.js";
import { handleSilentMessage } from "../helpers/context.js";
import { ClientOptions, Conversation } from "@xmtp/mls-client";
import { mlsClient } from "./client.js";
import { ContentTypeBotMessage } from "../content-types/Bot.js";
import { ContentTypeBotMessage } from "../content-types/BotMessage.js";
import { ContentTypeText } from "@xmtp/xmtp-js";
import { User } from "../helpers/types";

Expand Down Expand Up @@ -87,10 +87,10 @@ export const runGroup = async (
address,
);

if (message.contentType.sameAs(ContentTypeSilent)) {
await handleSilentMessage(message, context, accessHandler);
continue;
}
// if (message.contentType.sameAs(ContentTypeSilent)) {
// await handleSilentMessage(message, context, accessHandler);
// continue;
// }

await handler(context);
} catch (e) {
Expand Down
6 changes: 3 additions & 3 deletions packages/botkit/src/lib/client.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Client as XmtpClient } from "@xmtp/xmtp-js";
import { Client as XmtpClient, XmtpEnv } from "@xmtp/xmtp-js";
import { Wallet } from "ethers";
import { GrpcApiClient } from "@xmtp/grpc-api-client";
import { ReactionCodec } from "../content-types/Reaction.js";
import { ReplyCodec } from "../content-types/Reply.js";
import { SilentCodec } from "../content-types/Silent.js";
import { BotMessageCodec } from "../content-types/Bot.js";
import { BotMessageCodec } from "../content-types/BotMessage.js";

export default async function xmtpClient(
newBotConfig = {},
Expand All @@ -26,7 +26,7 @@ export default async function xmtpClient(
}

const defaultConfig = {
env: env as any,
env: env as XmtpEnv,
apiClientFactory: GrpcApiClient.fromOptions as any,
codecs: [
new ReactionCodec(),
Expand Down
11 changes: 6 additions & 5 deletions packages/botkit/src/lib/handlerContext.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { ContentTypeBotMessage } from "../content-types/Bot.js";
import {
BotMessage,
ContentTypeBotMessage,
} from "../content-types/BotMessage.js";
import { Conversation } from "@xmtp/xmtp-js";
import { MessageAbstracted } from "../helpers/types";
import { CommandGroup, User } from "../helpers/types";
Expand Down Expand Up @@ -38,15 +41,13 @@ export default class HandlerContext {
const { typeId } = this.message;

if (typeId == "silent") return;
const botMessage = {
sender: this.message.senderAddress,
const content: BotMessage = {
receivers: receivers,
content: message,
metadata: { ...this.context },
reference: messageId,
};

await this.conversation.send(botMessage, {
await this.conversation.send(content, {
contentType: ContentTypeBotMessage,
});
}
Expand Down
Loading

0 comments on commit d0caaab

Please sign in to comment.