Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Random Github Repository Generator

A website that give you random GitHub repository to get inspired
A website that gives you random GitHub repositories to get inspired

<img src="https://rayanestaszewski.fr/assets/rgr.png"/>

Expand Down
21 changes: 12 additions & 9 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 1 addition & 8 deletions src/app.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,7 @@
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="manifest" href="/site.webmanifest" />
<meta name="msapplication-TileColor" content="#da532c" />
<meta name="theme-color" content="#ffffff" />

<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta name="theme-color" content="#161b22" />
<base href="/" />

<meta
Expand All @@ -22,10 +19,6 @@

<title>Random Github Repository Generator | Get inspired</title>

<meta
name="description"
content="A website that give you random GitHub repository to get inspired"
/>
<meta
name="keywords"
content="random, github, repository, repo, generator, theme, stars, code, project"
Expand Down
8 changes: 4 additions & 4 deletions src/lib/fetchExtensions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import fetch, { Headers } from 'node-fetch';
import Variables from '../routes/api/globalVariables.js';
import Variables from '$api/globalVariables.js';
import ApiKeys from './server/apiKeys.js';

export async function fetchGithubApi(
Expand All @@ -23,13 +23,13 @@ export async function fetchGithubApi(
if (!response.ok) {
if (Variables.processAddingRepos === false) return null;

// Try again in 5 second
// Try again in 5 seconds
currentRetry += 1;
console.log('Request failed. Retrying in 5 seconds...');
await new Promise((resolve) => setTimeout(resolve, 5000));
return fetchGithubApi(apiUrl, currentRetry + 1);
return fetchGithubApi(apiUrl, currentRetry);
} else return await response.text();
}

return null!;
return null;
}
4 changes: 2 additions & 2 deletions src/lib/server/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// place files you want to import through the `$lib` alias in this folder.
import Repo from '$lib/models/Repo.ts';
import Topic from '$lib/models/Topic.ts';
import Repo from '$lib/models/Repo.js';
import Topic from '$lib/models/Topic.js';
import { Sequelize } from '@sequelize/core';

import fs from 'fs';
Expand Down
148 changes: 72 additions & 76 deletions src/lib/server/repoAdder.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import Topic from '$lib/models/Topic.ts';
import Topic from '$lib/models/Topic.js';
import { Op } from '@sequelize/core';
import Variables from '../../routes/api/globalVariables.js';
import { fetchGithubApi } from '../fetchExtensions.js';
import Repo from '$lib/models/Repo.ts';
import Variables from '$api/globalVariables.js';
import { fetchGithubApi } from '$lib/fetchExtensions.js';
import Repo from '$lib/models/Repo.js';

async function addReposLoop(specialLoop: boolean = false) {
let removedTopics: string[] = [];
Expand All @@ -19,89 +19,85 @@ async function addReposLoop(specialLoop: boolean = false) {
for (let page = 1; page <= 5; page++) {
tasks.push(
new Promise(async (resolve) => {
if (Variables.processAddingRepos) {
if (!Variables.processAddingRepos) {
await waitToContinue();
}
// Wait if adding repos is paused
if (!Variables.processAddingRepos) {
await waitToContinue();
}

if (!specialLoop || removedTopics.includes(topic.tag)) {
// Attend un temps aléatoire afin de ne pas avoir les mêmes réponses à chaque fois
const randomTime = Math.random() * 3000 + 500; // Random time between 0.5 and 3.5 seconds
await new Promise((resolve) => setTimeout(resolve, randomTime));
console.log('Waited ' + randomTime + 'ms...');
}
if (!specialLoop || removedTopics.includes(topic.tag)) {
// Wait a random time to avoid getting the same responses each time
const randomTime = Math.random() * 3000 + 500; // Random time between 0.5 and 3.5 seconds
await new Promise((resolve) => setTimeout(resolve, randomTime));
console.log('Waited ' + randomTime + 'ms...');
}

let numberOfAddedRepos = 0;
let numberOfAddedRepos = 0;

console.log('Adding repos for topic ' + topic.tag + ' on page ' + page);
console.log('Adding repos for topic ' + topic.tag + ' on page ' + page);

const url =
specialLoop && !removedTopics.includes(topic.tag)
? `https://api.github.com/search/repositories?q=${encodeURI(
topic.name
)}&sort=updated&per_page=100&page=${page}`
: `https://api.github.com/search/repositories?q=stars:>0&sort=updated&order=desc&per_page=100&page=1`;
const url =
specialLoop && !removedTopics.includes(topic.tag)
? `https://api.github.com/search/repositories?q=${encodeURI(
topic.name
)}&sort=updated&per_page=100&page=${page}`
: `https://api.github.com/search/repositories?q=stars:>0&sort=updated&order=desc&per_page=100&page=1`;

const json = await fetchGithubApi(url);
const json = await fetchGithubApi(url);

if (json !== null) {
const searchResult = JSON.parse(json);
for (let index = 0; index < searchResult.items.length; index++) {
const element = searchResult.items[index];
if (json !== null) {
const searchResult = JSON.parse(json);
for (let index = 0; index < searchResult.items.length; index++) {
const element = searchResult.items[index];

if (!Variables.processAddingRepos) {
await waitToContinue();
}
if (!Variables.processAddingRepos) {
await waitToContinue();
}

const repoId = element.id;
const star = element.stargazers_count ?? 0;
const tags = element.topics as string[];
const description = element.description ?? '';

if (description.trim() === '') continue; // pas de description, on passe

let formattedTopics = tags.join(',');

description.split(' ').forEach((word: string) => {
const lowerCaseWord = word.toLocaleLowerCase();
if (
formattedTopics.includes(',' + lowerCaseWord + ',') === false &&
topics.some(
(topic) =>
topic.name.toLowerCase() === lowerCaseWord || topic.tag === lowerCaseWord
)
) {
formattedTopics += formattedTopics.length !== 0 ? ',' : '' + lowerCaseWord;
}
});

if (formattedTopics.length > 0) {
formattedTopics = ',' + formattedTopics + ',';
formattedTopics = formattedTopics.replace(/,+/g, ','); // Remove duplicate commas
const repoId = element.id;
const star = element.stargazers_count ?? 0;
const tags = element.topics as string[];
const description = element.description ?? '';

if (description.trim() === '') continue; // No description, skip

let formattedTopics = tags.join(',');

description.split(' ').forEach((word: string) => {
const lowerCaseWord = word.toLocaleLowerCase();
if (
formattedTopics.includes(',' + lowerCaseWord + ',') === false &&
topics.some(
(topic) =>
topic.name.toLowerCase() === lowerCaseWord || topic.tag === lowerCaseWord
)
) {
formattedTopics += formattedTopics.length !== 0 ? ',' : '' + lowerCaseWord;
}
});

if (formattedTopics.length > 0) {
formattedTopics = ',' + formattedTopics + ',';
formattedTopics = formattedTopics.replace(/,+/g, ','); // Remove duplicate commas
}

if (repoId) {
// If it don't exist yet, create it
if ((await Repo.count({ where: { repoId: repoId } })) === 0) {
console.log(
//'Creating repo ' + repoId + ' : ' + formattedTopics + ' : ' + star + '...'
'+1'
);
Repo.create({
repoId: repoId,
star: star,
topics: formattedTopics
});
numberOfAddedRepos++;
}
if (repoId) {
// If it doesn't exist yet, create it
if ((await Repo.count({ where: { repoId: repoId } })) === 0) {
console.log('+1');
await Repo.create({
repoId: repoId,
star: star,
topics: formattedTopics
});
numberOfAddedRepos++;
}
}
}

console.log('Done adding repos for topic ' + topic.tag + ' on page ' + page);
console.log('Done adding repos for topic ' + topic.tag + ' on page ' + page);

if (numberOfAddedRepos === 0) {
removedTopics.push(topic.tag);
}
if (numberOfAddedRepos === 0) {
removedTopics.push(topic.tag);
}
}

Expand All @@ -113,7 +109,7 @@ async function addReposLoop(specialLoop: boolean = false) {
await Promise.all(tasks);
}

// Recalcul le nombre de repo pour chaque topic
// Recalculate the number of repos for each topic
for (let i = 0; i < topics.length; i++) {
const topic = topics[i];
const numberOfRepo = await Repo.count({
Expand All @@ -123,8 +119,8 @@ async function addReposLoop(specialLoop: boolean = false) {
}
}
});
topic.update({ numberOfRepo: numberOfRepo });
topic.save();
await topic.update({ numberOfRepo: numberOfRepo });
await topic.save();
}

Variables.specialLoopIndex += 1;
Expand Down
Loading
Loading