openclaw-github-trending 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/dist/cli.d.ts +0 -2
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/models/service.types.d.ts +0 -87
- package/dist/models/service.types.d.ts.map +0 -1
- package/dist/models/service.types.js +0 -3
- package/dist/models/service.types.js.map +0 -1
- package/dist/services/trending.service.d.ts +0 -29
- package/dist/services/trending.service.d.ts.map +0 -1
- package/dist/services/trending.service.js +0 -306
- package/dist/services/trending.service.js.map +0 -1
package/package.json
CHANGED
package/dist/cli.d.ts
DELETED
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Service layer parameters for executing GitHub trending workflow
|
|
3
|
-
*/
|
|
4
|
-
export interface ServiceParams {
|
|
5
|
-
/**
|
|
6
|
-
* Time period for trending repositories
|
|
7
|
-
*/
|
|
8
|
-
since: 'daily' | 'weekly' | 'monthly';
|
|
9
|
-
/**
|
|
10
|
-
* Channels to push to (supports multiple channels)
|
|
11
|
-
*/
|
|
12
|
-
channels: ('feishu' | 'email')[];
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Service layer result structure
|
|
16
|
-
*/
|
|
17
|
-
export interface ServiceResult {
|
|
18
|
-
/**
|
|
19
|
-
* Overall success status (at least one channel succeeded)
|
|
20
|
-
*/
|
|
21
|
-
success: boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Number of repositories that were pushed (new + re-pushed)
|
|
24
|
-
*/
|
|
25
|
-
pushedCount: number;
|
|
26
|
-
/**
|
|
27
|
-
* Number of newly seen repositories
|
|
28
|
-
*/
|
|
29
|
-
newCount: number;
|
|
30
|
-
/**
|
|
31
|
-
* Number of already seen repositories
|
|
32
|
-
*/
|
|
33
|
-
seenCount: number;
|
|
34
|
-
/**
|
|
35
|
-
* Total number of repositories found
|
|
36
|
-
*/
|
|
37
|
-
totalCount: number;
|
|
38
|
-
/**
|
|
39
|
-
* Results for each channel push attempt
|
|
40
|
-
*/
|
|
41
|
-
pushResults: {
|
|
42
|
-
/**
|
|
43
|
-
* Channel name (feishu or email)
|
|
44
|
-
*/
|
|
45
|
-
channel: string;
|
|
46
|
-
/**
|
|
47
|
-
* Push success status
|
|
48
|
-
*/
|
|
49
|
-
success: boolean;
|
|
50
|
-
/**
|
|
51
|
-
* Message ID from the channel (if applicable)
|
|
52
|
-
*/
|
|
53
|
-
messageId?: string;
|
|
54
|
-
/**
|
|
55
|
-
* Error message if push failed
|
|
56
|
-
*/
|
|
57
|
-
error?: string;
|
|
58
|
-
}[];
|
|
59
|
-
/**
|
|
60
|
-
* Timestamp of execution
|
|
61
|
-
*/
|
|
62
|
-
timestamp: string;
|
|
63
|
-
/**
|
|
64
|
-
* Human-readable success message
|
|
65
|
-
*/
|
|
66
|
-
message?: string;
|
|
67
|
-
/**
|
|
68
|
-
* Error message if execution failed
|
|
69
|
-
*/
|
|
70
|
-
error?: string;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Storage interface for history persistence
|
|
74
|
-
*/
|
|
75
|
-
export interface StorageInterface {
|
|
76
|
-
get(key: string): Promise<any>;
|
|
77
|
-
set(key: string, value: any): Promise<void>;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Logger interface for consistent logging
|
|
81
|
-
*/
|
|
82
|
-
export interface LoggerInterface {
|
|
83
|
-
info(msg: string, ...args: any[]): void;
|
|
84
|
-
warn(msg: string, ...args: any[]): void;
|
|
85
|
-
error(msg: string, ...args: any[]): void;
|
|
86
|
-
}
|
|
87
|
-
//# sourceMappingURL=service.types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.types.d.ts","sourceRoot":"","sources":["../../src/models/service.types.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAEtC;;OAEG;IACH,QAAQ,EAAE,CAAC,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,WAAW,EAAE;QACX;;WAEG;QACH,OAAO,EAAE,MAAM,CAAC;QAEhB;;WAEG;QACH,OAAO,EAAE,OAAO,CAAC;QAEjB;;WAEG;QACH,SAAS,CAAC,EAAE,MAAM,CAAC;QAEnB;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;IAEJ;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;CAC1C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.types.js","sourceRoot":"","sources":["../../src/models/service.types.ts"],"names":[],"mappings":""}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { OpenClawGlobalConfig } from '../core/config';
|
|
2
|
-
import { PluginConfig } from '../models/config';
|
|
3
|
-
import { StorageInterface, LoggerInterface, ServiceParams, ServiceResult } from '../models/service.types';
|
|
4
|
-
/**
|
|
5
|
-
* TrendingService - Core business logic service for GitHub trending workflow
|
|
6
|
-
*
|
|
7
|
-
* This service encapsulates the complete business flow:
|
|
8
|
-
* 1. Fetch trending repositories
|
|
9
|
-
* 2. Categorize using history
|
|
10
|
-
* 3. Generate AI summaries
|
|
11
|
-
* 4. Push to channels
|
|
12
|
-
* 5. Update history
|
|
13
|
-
*
|
|
14
|
-
* It is a stateless service - all dependencies are injected via parameters.
|
|
15
|
-
*/
|
|
16
|
-
export declare class TrendingService {
|
|
17
|
-
/**
|
|
18
|
-
* Execute the complete GitHub trending workflow
|
|
19
|
-
*
|
|
20
|
-
* @param params - Business parameters (already validated)
|
|
21
|
-
* @param config - Valid plugin configuration
|
|
22
|
-
* @param storage - OpenClaw storage interface
|
|
23
|
-
* @param logger - Logger interface for consistent logging
|
|
24
|
-
* @param openclawConfig - OpenClaw global configuration (optional)
|
|
25
|
-
* @returns Structured execution result
|
|
26
|
-
*/
|
|
27
|
-
static execute(params: ServiceParams, config: PluginConfig, storage: StorageInterface, logger: LoggerInterface, openclawConfig?: OpenClawGlobalConfig): Promise<ServiceResult>;
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=trending.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trending.service.d.ts","sourceRoot":"","sources":["../../src/services/trending.service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG1G;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAC1B;;;;;;;;;OASG;WACU,OAAO,CAClB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,oBAAoB,GACpC,OAAO,CAAC,aAAa,CAAC;CAmT1B"}
|
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TrendingService = void 0;
|
|
4
|
-
const history_1 = require("../core/history");
|
|
5
|
-
const fetcher_1 = require("../core/fetcher");
|
|
6
|
-
const summarizer_1 = require("../core/summarizer");
|
|
7
|
-
const feishu_1 = require("../channels/feishu");
|
|
8
|
-
const email_1 = require("../channels/email");
|
|
9
|
-
const config_1 = require("../core/config");
|
|
10
|
-
/**
|
|
11
|
-
* TrendingService - Core business logic service for GitHub trending workflow
|
|
12
|
-
*
|
|
13
|
-
* This service encapsulates the complete business flow:
|
|
14
|
-
* 1. Fetch trending repositories
|
|
15
|
-
* 2. Categorize using history
|
|
16
|
-
* 3. Generate AI summaries
|
|
17
|
-
* 4. Push to channels
|
|
18
|
-
* 5. Update history
|
|
19
|
-
*
|
|
20
|
-
* It is a stateless service - all dependencies are injected via parameters.
|
|
21
|
-
*/
|
|
22
|
-
class TrendingService {
|
|
23
|
-
/**
|
|
24
|
-
* Execute the complete GitHub trending workflow
|
|
25
|
-
*
|
|
26
|
-
* @param params - Business parameters (already validated)
|
|
27
|
-
* @param config - Valid plugin configuration
|
|
28
|
-
* @param storage - OpenClaw storage interface
|
|
29
|
-
* @param logger - Logger interface for consistent logging
|
|
30
|
-
* @param openclawConfig - OpenClaw global configuration (optional)
|
|
31
|
-
* @returns Structured execution result
|
|
32
|
-
*/
|
|
33
|
-
static async execute(params, config, storage, logger, openclawConfig) {
|
|
34
|
-
try {
|
|
35
|
-
// 1. Initialize history manager
|
|
36
|
-
const historyManager = new history_1.HistoryManager();
|
|
37
|
-
if (storage) {
|
|
38
|
-
const historyData = await storage.get('github-trending-history');
|
|
39
|
-
if (historyData) {
|
|
40
|
-
historyManager.importData(historyData);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// 2. Resolve AI configuration
|
|
44
|
-
const aiConfig = config_1.ConfigManager.getAIConfig(config, openclawConfig);
|
|
45
|
-
if (!aiConfig.apiKey) {
|
|
46
|
-
logger.error('AI API key not found');
|
|
47
|
-
return {
|
|
48
|
-
success: false,
|
|
49
|
-
pushedCount: 0,
|
|
50
|
-
newCount: 0,
|
|
51
|
-
seenCount: 0,
|
|
52
|
-
totalCount: 0,
|
|
53
|
-
pushResults: [],
|
|
54
|
-
timestamp: new Date().toISOString(),
|
|
55
|
-
error: 'AI API key is required. Please configure it in plugin settings, OpenClaw global config, or environment variables (OPENAI_API_KEY or ANTHROPIC_API_KEY).'
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
logger.info(`Using AI provider: ${aiConfig.provider}, model: ${aiConfig.model}`);
|
|
59
|
-
// 3. Fetch trending repositories
|
|
60
|
-
logger.info(`Fetching GitHub trending repositories (${params.since})`);
|
|
61
|
-
const fetcher = new fetcher_1.GitHubFetcher(config);
|
|
62
|
-
const repositories = await fetcher.fetchTrending(params.since);
|
|
63
|
-
// 4. Categorize repositories into new entries and continuous chart-toppers
|
|
64
|
-
const historyConfig = {
|
|
65
|
-
enabled: config?.history?.enabled ?? true,
|
|
66
|
-
star_threshold: config?.history?.star_threshold ?? 100
|
|
67
|
-
};
|
|
68
|
-
const { newEntries, continuousChartToppers, alreadySeen } = historyManager.categorizeRepositories(repositories, historyConfig);
|
|
69
|
-
const shouldPush = [...newEntries, ...continuousChartToppers.map(item => item.repo)];
|
|
70
|
-
logger.info(`Found ${repositories.length} repos, ${shouldPush.length} to push (${newEntries.length} new, ${continuousChartToppers.length} continuous)`);
|
|
71
|
-
// Log detailed repository information
|
|
72
|
-
logger.info('Detailed repository list:');
|
|
73
|
-
repositories.forEach((repo, index) => {
|
|
74
|
-
logger.info(` ${index + 1}. ${repo.full_name}`);
|
|
75
|
-
logger.info(` Stars: ${repo.stars.toLocaleString()} | Description: ${repo.description || 'N/A'}`);
|
|
76
|
-
});
|
|
77
|
-
logger.info('Categorization results:');
|
|
78
|
-
if (newEntries.length > 0) {
|
|
79
|
-
logger.info(` 🆕 New entries (${newEntries.length}) - Will generate AI summary:`);
|
|
80
|
-
newEntries.forEach((repo, idx) => {
|
|
81
|
-
logger.info(` ${idx + 1}. ${repo.full_name} (${repo.stars} stars)`);
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
if (continuousChartToppers.length > 0) {
|
|
85
|
-
logger.info(` 🔥 Continuous chart-toppers (${continuousChartToppers.length}) - Use cached brief intro:`);
|
|
86
|
-
continuousChartToppers.forEach(({ repo, history }, idx) => {
|
|
87
|
-
const starsDiff = repo.stars - history.last_stars;
|
|
88
|
-
logger.info(` ${idx + 1}. ${repo.full_name} (${repo.stars} stars, +${starsDiff} since last, pushed ${history.push_count} times)`);
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
if (alreadySeen.length > 0) {
|
|
92
|
-
logger.info(` ⏭️ Already seen (${alreadySeen.length}) - Skipped:`);
|
|
93
|
-
alreadySeen.forEach((repo, idx) => {
|
|
94
|
-
const history = historyManager.getProject(repo.full_name);
|
|
95
|
-
const starsDiff = repo.stars - (history?.last_stars || 0);
|
|
96
|
-
logger.info(` ${idx + 1}. ${repo.full_name} (${repo.stars} stars, +${starsDiff} since last)`);
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
// 5. Generate AI summaries ONLY for new entries
|
|
100
|
-
const summarizer = new summarizer_1.AISummarizer(aiConfig);
|
|
101
|
-
const maxWorkers = config_1.ConfigManager.getMaxWorkers(config);
|
|
102
|
-
const aiSummaries = new Map();
|
|
103
|
-
logger.info(`Generating AI summaries for ${newEntries.length} new entries with ${maxWorkers} workers...`);
|
|
104
|
-
// Process new entries in batches with concurrency control
|
|
105
|
-
for (let i = 0; i < newEntries.length; i += maxWorkers) {
|
|
106
|
-
const batch = newEntries.slice(i, i + maxWorkers);
|
|
107
|
-
logger.info(`[Batch ${Math.floor(i / maxWorkers) + 1}/${Math.ceil(newEntries.length / maxWorkers)}] Processing ${batch.length} new repositories...`);
|
|
108
|
-
const batchResults = await Promise.allSettled(batch.map(async (repo) => {
|
|
109
|
-
try {
|
|
110
|
-
logger.info(` 📖 [${repo.full_name}] Fetching README...`);
|
|
111
|
-
const readmeContent = await fetcher.fetchReadme(repo.full_name);
|
|
112
|
-
let summary = '';
|
|
113
|
-
if (readmeContent) {
|
|
114
|
-
const readmePreview = readmeContent.substring(0, 100).replace(/\n/g, ' ').trim();
|
|
115
|
-
logger.info(` ✓ README found (${readmeContent.length} chars), preview: "${readmePreview}..."`);
|
|
116
|
-
logger.info(` 🤖 [${repo.full_name}] Generating AI summary from README...`);
|
|
117
|
-
const startTime = Date.now();
|
|
118
|
-
summary = await summarizer.summarizeReadme(repo.full_name, readmeContent);
|
|
119
|
-
const duration = Date.now() - startTime;
|
|
120
|
-
logger.info(` ✓ Summary generated (${summary.length} chars) in ${duration}ms`);
|
|
121
|
-
if (summary) {
|
|
122
|
-
logger.info(` 📝 [${repo.full_name}] Summary: ${summary.substring(0, 100)}...`);
|
|
123
|
-
aiSummaries.set(repo.full_name, summary);
|
|
124
|
-
repo.ai_summary = summary;
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
logger.warn(` ⚠ [${repo.full_name}] Summary is empty`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
logger.warn(` ✗ No README found for ${repo.full_name}`);
|
|
132
|
-
logger.info(` 🤖 [${repo.full_name}] Generating AI summary from metadata...`);
|
|
133
|
-
const startTime = Date.now();
|
|
134
|
-
summary = await summarizer.generateSummary(repo);
|
|
135
|
-
const duration = Date.now() - startTime;
|
|
136
|
-
logger.info(` ✓ Summary generated (${summary.length} chars) in ${duration}ms`);
|
|
137
|
-
if (summary) {
|
|
138
|
-
logger.info(` 📝 [${repo.full_name}] Summary: ${summary.substring(0, 100)}...`);
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
logger.warn(` ⚠ [${repo.full_name}] Summary is empty`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return { ...repo, ai_summary: summary };
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
logger.error(` ❌ [${repo.full_name}] Failed to generate summary: ${error}`);
|
|
148
|
-
return { ...repo, ai_summary: '' };
|
|
149
|
-
}
|
|
150
|
-
}));
|
|
151
|
-
// Collect results from this batch
|
|
152
|
-
for (const result of batchResults) {
|
|
153
|
-
if (result.status === 'fulfilled') {
|
|
154
|
-
reposWithSummary.push(result.value);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
// 6. Push to channels
|
|
159
|
-
const seenWithSummary = alreadySeen.map(r => ({
|
|
160
|
-
...r,
|
|
161
|
-
ai_summary: historyManager.getProject(r.full_name)?.ai_summary || ''
|
|
162
|
-
}));
|
|
163
|
-
const pushResults = [];
|
|
164
|
-
for (const targetChannel of params.channels) {
|
|
165
|
-
try {
|
|
166
|
-
if (targetChannel === 'feishu') {
|
|
167
|
-
const webhookUrl = config?.channels?.feishu?.webhook_url;
|
|
168
|
-
if (!webhookUrl) {
|
|
169
|
-
logger.warn('Feishu webhook URL not configured, skipping');
|
|
170
|
-
pushResults.push({ channel: 'feishu', success: false, error: 'Webhook URL not configured' });
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
logger.info(`Pushing ${reposWithSummary.length} repos to Feishu...`);
|
|
174
|
-
const result = await feishu_1.FeishuChannel.push(webhookUrl, reposWithSummary, seenWithSummary, params.since);
|
|
175
|
-
if (!result) {
|
|
176
|
-
logger.error('FeishuChannel.push returned undefined!');
|
|
177
|
-
pushResults.push({ channel: 'feishu', success: false, error: 'Push returned undefined' });
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
pushResults.push({
|
|
181
|
-
channel: 'feishu',
|
|
182
|
-
success: result.success,
|
|
183
|
-
messageId: result.messageId,
|
|
184
|
-
error: result.error || undefined
|
|
185
|
-
});
|
|
186
|
-
if (result.success) {
|
|
187
|
-
logger.info(`✅ Feishu push successful!`);
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
logger.error(`❌ Feishu push failed: ${result.error || 'Unknown error'}`);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
else if (targetChannel === 'email') {
|
|
194
|
-
const emailTo = config?.channels?.email?.recipient || config?.channels?.email?.sender;
|
|
195
|
-
if (!emailTo) {
|
|
196
|
-
logger.warn('Email recipient not configured, skipping');
|
|
197
|
-
pushResults.push({ channel: 'email', success: false, error: 'Recipient not configured' });
|
|
198
|
-
continue;
|
|
199
|
-
}
|
|
200
|
-
if (!config?.channels?.email) {
|
|
201
|
-
logger.warn('Email SMTP configuration missing, skipping');
|
|
202
|
-
pushResults.push({ channel: 'email', success: false, error: 'SMTP configuration missing' });
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
if (!config.channels.email.password) {
|
|
206
|
-
logger.warn('Email SMTP password missing, skipping');
|
|
207
|
-
pushResults.push({ channel: 'email', success: false, error: 'SMTP password not configured' });
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
logger.info(`Sending email...`);
|
|
211
|
-
logger.info(` From: ${config.channels.email.sender}`);
|
|
212
|
-
logger.info(` To: ${emailTo}`);
|
|
213
|
-
logger.info(` Subject: GitHub Trending ${params.since === 'daily' ? 'Daily' : params.since === 'weekly' ? 'Weekly' : 'Monthly'}`);
|
|
214
|
-
logger.info(` Repositories: ${reposWithSummary.length} new + ${alreadySeen.length} seen`);
|
|
215
|
-
const result = await email_1.EmailChannel.send({
|
|
216
|
-
from: config.channels.email.sender,
|
|
217
|
-
to: emailTo,
|
|
218
|
-
subject: `GitHub ${params.since === 'daily' ? '今日' : params.since === 'weekly' ? '本周' : '本月'}热榜推送`,
|
|
219
|
-
smtp: {
|
|
220
|
-
host: config.channels.email.smtp_host || 'smtp.qq.com',
|
|
221
|
-
port: config.channels.email.smtp_port || 587,
|
|
222
|
-
secure: false,
|
|
223
|
-
auth: {
|
|
224
|
-
user: config.channels.email.sender,
|
|
225
|
-
pass: config.channels.email.password
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}, reposWithSummary, seenWithSummary, params.since);
|
|
229
|
-
pushResults.push({
|
|
230
|
-
channel: 'email',
|
|
231
|
-
success: result.success,
|
|
232
|
-
messageId: result.messageId,
|
|
233
|
-
error: result.error || undefined
|
|
234
|
-
});
|
|
235
|
-
if (result.success) {
|
|
236
|
-
logger.info(`Email sent successfully! Message ID: ${result.messageId || 'N/A'}`);
|
|
237
|
-
logger.info(`Check inbox: ${emailTo}`);
|
|
238
|
-
if (emailTo === config.channels.email.sender) {
|
|
239
|
-
logger.warn(`Email was sent to sender (self). To send to others, set EMAIL_TO in .env`);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
logger.error(`Failed to send email: ${result.error || 'Unknown error'}`);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
catch (error) {
|
|
248
|
-
logger.error(`Failed to push to ${targetChannel}: ${error}`);
|
|
249
|
-
pushResults.push({
|
|
250
|
-
channel: targetChannel,
|
|
251
|
-
success: false,
|
|
252
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// 7. Update history
|
|
257
|
-
historyManager.markPushed(reposWithSummary);
|
|
258
|
-
if (storage) {
|
|
259
|
-
await storage.set('github-trending-history', historyManager.exportData());
|
|
260
|
-
}
|
|
261
|
-
// 8. Return result
|
|
262
|
-
const successCount = pushResults.filter(r => r.success).length;
|
|
263
|
-
const failedChannels = pushResults.filter(r => !r.success).map(r => r.channel);
|
|
264
|
-
logger.info('Execution completed', {
|
|
265
|
-
successCount,
|
|
266
|
-
failedCount: failedChannels.length,
|
|
267
|
-
totalChannels: params.channels.length,
|
|
268
|
-
pushedCount: reposWithSummary.length,
|
|
269
|
-
newCount: newlySeen.length,
|
|
270
|
-
seenCount: alreadySeen.length
|
|
271
|
-
});
|
|
272
|
-
return {
|
|
273
|
-
success: successCount > 0,
|
|
274
|
-
pushedCount: reposWithSummary.length,
|
|
275
|
-
newCount: newlySeen.length,
|
|
276
|
-
seenCount: alreadySeen.length,
|
|
277
|
-
totalCount: repositories.length,
|
|
278
|
-
pushResults,
|
|
279
|
-
timestamp: new Date().toISOString(),
|
|
280
|
-
message: successCount === params.channels.length
|
|
281
|
-
? `成功推送到所有 ${successCount} 个通道`
|
|
282
|
-
: successCount > 0
|
|
283
|
-
? `部分成功:${successCount}/${params.channels.length} 个通道推送成功,失败通道:${failedChannels.join(', ')}`
|
|
284
|
-
: `所有通道推送失败:${failedChannels.join(', ')}`
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
catch (error) {
|
|
288
|
-
logger.error('Execution failed', {
|
|
289
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
290
|
-
stack: error instanceof Error ? error.stack : undefined
|
|
291
|
-
});
|
|
292
|
-
return {
|
|
293
|
-
success: false,
|
|
294
|
-
pushedCount: 0,
|
|
295
|
-
newCount: 0,
|
|
296
|
-
seenCount: 0,
|
|
297
|
-
totalCount: 0,
|
|
298
|
-
pushResults: [],
|
|
299
|
-
timestamp: new Date().toISOString(),
|
|
300
|
-
error: error instanceof Error ? error.message : 'Unknown error'
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
exports.TrendingService = TrendingService;
|
|
306
|
-
//# sourceMappingURL=trending.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trending.service.js","sourceRoot":"","sources":["../../src/services/trending.service.ts"],"names":[],"mappings":"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"}
|