convokit
Version:
A flexible TypeScript framework for ingesting, processing, and exporting chat/conversation data for LLM training and analysis.
135 lines • 4.54 kB
JavaScript
import { ProviderRegistry, getConfig, loadConfig } from '../index.js';
// Ensure configuration is loaded before defining provider logic that might depend on it.
await loadConfig();
function checkIfCompatible(chat_data) {
// Check that the input (chat_data) conforms to the type of DiscordData
if (!chat_data || typeof chat_data !== 'object') {
return false;
}
if (!chat_data.guild || typeof chat_data.guild !== 'object') {
return false;
}
if (!chat_data.channel || typeof chat_data.channel !== 'object') {
return false;
}
if (!chat_data.dateRange || typeof chat_data.dateRange !== 'object') {
return false;
}
if (!chat_data.exportedAt || typeof chat_data.exportedAt !== 'string') {
return false;
}
if (!Array.isArray(chat_data.messages)) {
return false;
}
if (typeof chat_data.messageCount !== 'number') {
return false;
}
if (chat_data.messages.length !== chat_data.messageCount) {
return false;
}
for (const message of chat_data.messages) {
if (!message || typeof message !== 'object') {
return false;
}
if (!message.author || typeof message.author !== 'object') {
return false;
}
if (!message.attachments || !Array.isArray(message.attachments)) {
return false;
}
if (!message.embeds || !Array.isArray(message.embeds)) {
return false;
}
if (!message.stickers || !Array.isArray(message.stickers)) {
return false;
}
if (!message.reactions || !Array.isArray(message.reactions)) {
return false;
}
if (!message.mentions || !Array.isArray(message.mentions)) {
return false;
}
if (!message.inlineEmojis || !Array.isArray(message.inlineEmojis)) {
return false;
}
}
return true;
}
function getSenderAndReceiverInfo(chat_data) {
const expectedSenderName = chat_data.channel.name;
let senderId = null;
let receiverId = null;
let receiverName = null;
for (const message of chat_data.messages) {
if (message.author.name === expectedSenderName || message.author.nickname === expectedSenderName) {
senderId = message.author.id;
}
if (message.author.name !== expectedSenderName && message.author.nickname !== expectedSenderName) {
receiverId = message.author.id;
receiverName = message.author.name;
}
}
return { sender: {
id: senderId,
name: expectedSenderName,
}, receiver: {
id: receiverId,
name: receiverName,
} };
}
function convertToConvoKitFormat(chat_data) {
let conversationId = chat_data.channel.id;
if (getConfig().anonymizeProviderConversationIds) {
conversationId = crypto.randomUUID().replace(/-/g, '').slice(0, 16);
}
const { sender, receiver } = getSenderAndReceiverInfo(chat_data);
const messages = chat_data.messages.map((message) => ({
timestamp: new Date(message.timestamp),
message: message.content,
author: {
id: message.author.id,
name: message.author.name,
nickname: message.author.nickname || null,
}
}));
const metadata = {
conversationId: conversationId,
exportedAt: new Date(chat_data.exportedAt),
messageCount: chat_data.messageCount,
messageSenderId: sender.id || null,
messageSenderName: chat_data.channel.name,
messageReceiverId: receiver.id || null,
messageReceiverName: receiver.name || null,
providerId: 'discord',
};
return {
metadata,
messages,
};
}
export const ProviderInfo = {
name: "Discord (DiscordChatExporter)",
description: "Discord chat data exported using DiscordChatExporter. Will read from the Discord_ChatExporter folder.",
version: "1.0.0",
author: "ConvoKit",
InputDataInfo: {
fileExtension: ".json",
directoryName: "Discord",
}
};
export class Provider {
Data = null;
constructor(chat_data) {
this.Data = chat_data;
}
ProviderInfo = ProviderInfo;
Test() {
return checkIfCompatible(this.Data);
}
Convert() {
return convertToConvoKitFormat(this.Data);
}
}
// Self-register the provider
ProviderRegistry.register('discord', Provider, ProviderInfo);
//# sourceMappingURL=discord.js.map