Skip to content

Commit 243b967

Browse files
committed
Allow changing port number of competitive companion (Fixes #42)
Also allow disabling/enabling listening to competitive companion
1 parent 5629872 commit 243b967

File tree

3 files changed

+81
-13
lines changed

3 files changed

+81
-13
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ Required files (naming scheme can be configured in settings):
158158
- `askForWhichFile` (default: `false`): Ask for which file to write testcase onto, even when a file is currently opened and only a single problem has been received
159159
- `includePattern` (default: `**/*`): Glob pattern to filter in the included files for asking prompt
160160
- `excludePattern` (default: *empty*): Glob pattern to filter out the included files for asking prompt
161+
- `port` (default: *1327*): Port number to listen from Competitive Companion
161162
</details>
162163

163164
---

package.json

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,12 @@
157157
{
158158
"title": "Competitive Companion",
159159
"properties": {
160+
"fastolympiccoding.port": {
161+
"type": "number",
162+
"default": 1327,
163+
"minimum": 1024,
164+
"description": "Port number to listen for Competitive Companion"
165+
},
160166
"fastolympiccoding.openSelectedFiles": {
161167
"type": "boolean",
162168
"default": true,
@@ -220,7 +226,17 @@
220226
"command": "fastolympiccoding.insertFileTemplate",
221227
"title": "Insert File Template",
222228
"category": "Fast Olympic Coding"
223-
}
229+
},
230+
{
231+
"command": "fastolympiccoding.listenForCompetitiveCompanion",
232+
"title": "Listen for Competitive Companion",
233+
"category": "Fast Olympic Coding"
234+
},
235+
{
236+
"command": "fastolympiccoding.stopCompetitiveCompanion",
237+
"title": "Stop Competitive Companion",
238+
"category": "Fast Olympic Coding"
239+
}
224240
],
225241
"keybindings": [
226242
{

src/extension.ts

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import StressViewProvider from './views/stress/provider/StressViewProvider';
1111

1212
let judgeViewProvider: JudgeViewProvider;
1313
let stressViewProvider: StressViewProvider;
14+
let competitiveCompanionServer: http.Server | undefined = undefined;
15+
16+
let competitiveCompanionStatusItem: vscode.StatusBarItem;
1417

1518
function registerViewProviders(context: vscode.ExtensionContext): void {
1619
judgeViewProvider = new JudgeViewProvider(context);
@@ -176,12 +179,29 @@ function registerCommands(context: vscode.ExtensionContext): void {
176179
},
177180
),
178181
);
182+
183+
context.subscriptions.push(
184+
vscode.commands.registerCommand(
185+
'fastolympiccoding.listenForCompetitiveCompanion',
186+
() => listenForCompetitiveCompanion(),
187+
),
188+
);
189+
context.subscriptions.push(
190+
vscode.commands.registerCommand(
191+
'fastolympiccoding.stopCompetitiveCompanion',
192+
() => stopCompetitiveCompanion(),
193+
),
194+
);
179195
}
180196

181197
function listenForCompetitiveCompanion() {
198+
if (competitiveCompanionServer !== undefined) {
199+
return;
200+
}
201+
182202
let problemDatas: IProblem[] = [];
183203
let cnt = 0;
184-
const server = http.createServer((req, res) => {
204+
competitiveCompanionServer = http.createServer((req, res) => {
185205
if (req.method !== 'POST') {
186206
res.end();
187207
return;
@@ -194,7 +214,7 @@ function listenForCompetitiveCompanion() {
194214
});
195215
req.on('end', () => {
196216
void (async () => {
197-
res.end();
217+
res.end(() => req.socket.unref());
198218

199219
problemDatas.push(JSON.parse(ccData) as IProblem);
200220
if (problemDatas.length === 0) {
@@ -296,25 +316,56 @@ function listenForCompetitiveCompanion() {
296316
})();
297317
});
298318
});
299-
server.listen(1327);
319+
320+
competitiveCompanionServer.once('connection', (socket) => {
321+
socket.unref();
322+
});
323+
competitiveCompanionServer.once('listening', () => {
324+
competitiveCompanionStatusItem.show();
325+
});
326+
competitiveCompanionServer.once('error', (error) =>
327+
vscode.window.showErrorMessage(
328+
`Competitive Companion listener error: ${error}`,
329+
),
330+
);
331+
competitiveCompanionServer.once('close', () => {
332+
competitiveCompanionServer = undefined;
333+
competitiveCompanionStatusItem.hide();
334+
});
335+
336+
const config = vscode.workspace.getConfiguration('fastolympiccoding');
337+
// biome-ignore lint/style/noNonNullAssertion: Default value provided by VSCode
338+
const port = config.get<number>('port')!;
339+
competitiveCompanionServer.listen(port);
300340
}
301341

302-
function addActiveStatus(context: vscode.ExtensionContext): void {
303-
const statusItem = vscode.window.createStatusBarItem(
304-
'fastolympiccoding.active',
342+
function stopCompetitiveCompanion() {
343+
if (competitiveCompanionServer === undefined) {
344+
return;
345+
}
346+
347+
competitiveCompanionServer.close();
348+
}
349+
350+
function createCompetitiveCompanionStatus(context: vscode.ExtensionContext) {
351+
const competitiveCompanionStatus = vscode.window.createStatusBarItem(
352+
'fastolympiccoding.listeningForCompetitiveCompanion',
305353
vscode.StatusBarAlignment.Left,
306354
);
307-
statusItem.name = 'Fast Olympic Coding Indicator';
308-
statusItem.text = '$(zap)';
309-
statusItem.tooltip = 'Fast Olympic Coding is Active';
310-
statusItem.show();
311-
context.subscriptions.push(statusItem);
355+
competitiveCompanionStatus.name = 'Competitive Companion Indicator';
356+
competitiveCompanionStatus.text = '$(zap)';
357+
competitiveCompanionStatus.tooltip = 'Listening For Competitive Companion';
358+
competitiveCompanionStatus.hide();
359+
context.subscriptions.push(competitiveCompanionStatus);
360+
361+
return competitiveCompanionStatus;
312362
}
313363

314364
export function activate(context: vscode.ExtensionContext): void {
315365
registerViewProviders(context);
316366
registerCommands(context);
317367
registerDocumentContentProviders(context);
318368
listenForCompetitiveCompanion();
319-
addActiveStatus(context);
369+
370+
competitiveCompanionStatusItem = createCompetitiveCompanionStatus(context);
320371
}

0 commit comments

Comments
 (0)