Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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