mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 07:20:45 +00:00
* wip * copy polugin files * wip type changes * refactor: improve Twitch plugin code quality and fix all tests - Extract client manager registry for centralized lifecycle management - Refactor to use early returns and reduce mutations - Fix status check logic for clientId detection - Add comprehensive test coverage for new modules - Remove tests for unimplemented features (index.test.ts, resolver.test.ts) - Fix mock setup issues in test suite (149 tests now passing) - Improve error handling with errorResponse helper in actions.ts - Normalize token handling to eliminate duplication Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * use accountId * delete md file * delte tsconfig * adjust log level * fix probe logic * format * fix monitor * code review fixes * format * no mutation * less mutation * chain debug log * await authProvider setup * use uuid * use spread * fix tests * update docs and remove bot channel fallback * more readme fixes * remove comments + fromat * fix tests * adjust access control logic * format * install * simplify config object * remove duplicate log tags + log received messages * update docs * update tests * format * strip markdown in monitor * remove strip markdown config, enabled by default * default requireMention to true * fix store path arg * fix multi account id + add unit test * fix multi account id + add unit test * make channel required and update docs * remove whisper functionality * remove duplicate connect log * update docs with convert twitch link * make twitch message processing non blocking * schema consistent casing * remove noisy ignore log * use coreLogger --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
79 lines
2.3 KiB
TypeScript
79 lines
2.3 KiB
TypeScript
/**
|
|
* Twitch-specific utility functions
|
|
*/
|
|
|
|
/**
|
|
* Normalize Twitch channel names.
|
|
*
|
|
* Removes the '#' prefix if present, converts to lowercase, and trims whitespace.
|
|
* Twitch channel names are case-insensitive and don't use the '#' prefix in the API.
|
|
*
|
|
* @param channel - The channel name to normalize
|
|
* @returns Normalized channel name
|
|
*
|
|
* @example
|
|
* normalizeTwitchChannel("#TwitchChannel") // "twitchchannel"
|
|
* normalizeTwitchChannel("MyChannel") // "mychannel"
|
|
*/
|
|
export function normalizeTwitchChannel(channel: string): string {
|
|
const trimmed = channel.trim().toLowerCase();
|
|
return trimmed.startsWith("#") ? trimmed.slice(1) : trimmed;
|
|
}
|
|
|
|
/**
|
|
* Create a standardized error message for missing target.
|
|
*
|
|
* @param provider - The provider name (e.g., "Twitch")
|
|
* @param hint - Optional hint for how to fix the issue
|
|
* @returns Error object with descriptive message
|
|
*/
|
|
export function missingTargetError(provider: string, hint?: string): Error {
|
|
return new Error(`Delivering to ${provider} requires target${hint ? ` ${hint}` : ""}`);
|
|
}
|
|
|
|
/**
|
|
* Generate a unique message ID for Twitch messages.
|
|
*
|
|
* Twurple's say() doesn't return the message ID, so we generate one
|
|
* for tracking purposes.
|
|
*
|
|
* @returns A unique message ID
|
|
*/
|
|
export function generateMessageId(): string {
|
|
return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;
|
|
}
|
|
|
|
/**
|
|
* Normalize OAuth token by removing the "oauth:" prefix if present.
|
|
*
|
|
* Twurple doesn't require the "oauth:" prefix, so we strip it for consistency.
|
|
*
|
|
* @param token - The OAuth token to normalize
|
|
* @returns Normalized token without "oauth:" prefix
|
|
*
|
|
* @example
|
|
* normalizeToken("oauth:abc123") // "abc123"
|
|
* normalizeToken("abc123") // "abc123"
|
|
*/
|
|
export function normalizeToken(token: string): string {
|
|
return token.startsWith("oauth:") ? token.slice(6) : token;
|
|
}
|
|
|
|
/**
|
|
* Check if an account is properly configured with required credentials.
|
|
*
|
|
* @param account - The Twitch account config to check
|
|
* @returns true if the account has required credentials
|
|
*/
|
|
export function isAccountConfigured(
|
|
account: {
|
|
username?: string;
|
|
accessToken?: string;
|
|
clientId?: string;
|
|
},
|
|
resolvedToken?: string | null,
|
|
): boolean {
|
|
const token = resolvedToken ?? account?.accessToken;
|
|
return Boolean(account?.username && token && account?.clientId);
|
|
}
|