Files
redirect/Redirects.cs
2026-06-20 05:56:22 -05:00

186 lines
6.2 KiB
C#

using System.Text.Json.Serialization;
class Redirect
{
private static Dictionary<string,IRedirect> redirects = new Dictionary<string, IRedirect>
{
// CrossLang Shell
{"crosslang-shell",Gitea("https://git.tesses.org/","tesses50/crosslangextras","ShellPackage.crvm",true)},
// TessesFramework
{"tessesframework",Std("https://git.tesses.org/tesses50/tessesframework")},
{"tf-tools-win32",TF("tessesframework-tools-x86-windows-gnu.zip")},
{"tf-tools-win64",TF("tessesframework-tools-x86_64-windows-gnu.zip")},
{"tf-linux-i386",TFR("tessesframework-@TAG@-386.tar.gz")},
{"tf-linux-amd64",TFR("tessesframework-@TAG@-amd64.tar.gz")},
{"tf-linux-arm64",TFR("tessesframework-@TAG@-arm64.tar.gz")},
{"tf-linux-arm7",TFR("tessesframework-@TAG@-arm7.tar.gz")},
{"tf-linux-powerpc",TFR("tessesframework-@TAG@-powerpc.tar.gz")},
{"tf-linux-riscv64",TFR("tessesframework-@TAG@-riscv64.tar.gz")},
// CrossLang
{"crosslang",Std("https://git.tesses.org/tesses50/crosslang")},
{"cl-portable-win32",CL("crosslang-win32-portable.exe")},
{"cl-portable-win64",CL("crosslang-win64-portable.exe")},
{"cl-setup-win32",CL("crosslang-win32-setup.exe")},
{"cl-setup-win64",CL("crosslang-win64-setup.exe")},
{"cl-linux-i386",CLR("crossslang-@TAG@-386.tar.gz")},
{"cl-linux-amd64",CLR("crossslang-@TAG@-amd64.tar.gz")},
{"cl-linux-arm64",CLR("crossslang-@TAG@-arm64.tar.gz")},
{"cl-linux-arm7",CLR("crossslang-@TAG@-arm7.tar.gz")},
{"cl-linux-powerpc",CLR("crossslang-@TAG@-powerpc.tar.gz")},
{"cl-linux-riscv64",CLR("crossslang-@TAG@-riscv64.tar.gz")},
};
private static IRedirect Std(string url)
{
return new StdRedirect(url);
}
private static IRedirect Gitea(string giteaServer, string giteaProject, string file, bool prerelease = false)
{
return new GiteaReleaseRedirect(giteaServer,giteaProject,file,prerelease);
}
private static IRedirect GiteaR(string giteaServer, string giteaProject, string file, bool prerelease = false)
{
return new GiteaReleaseRedirect(giteaServer,giteaProject,file,prerelease);
}
private static IRedirect TF(string filename)
{
return Gitea(
"https://git.tesses.org/",
"tesses50/tessesframework",
filename,
true
);
}
private static IRedirect TFR(string filename)
{
return GiteaR(
"https://git.tesses.org/",
"tesses50/tessesframework",
filename,
true
);
}
private static IRedirect CL(string filename)
{
return Gitea(
"https://git.tesses.org/",
"tesses50/crosslang",
filename,
true
);
}
private static IRedirect CLR(string filename)
{
return GiteaR(
"https://git.tesses.org/",
"tesses50/crosslang",
filename,
true
);
}
public static async Task<string?> HandleRedirectAsync(string redir)
{
if(redirects.ContainsKey(redir))
return await redirects[redir].RedirectAsync();
return null;
}
}
interface IRedirect
{
public Task<string?> RedirectAsync();
}
public class StdRedirect(string url) : IRedirect
{
public async Task<string?> RedirectAsync()
{
return await Task.FromResult(url);
}
}
public class GiteaReleaseRedirect(string giteaServer, string giteaProject, string file, bool prerelease = false) : IRedirect
{
private static HttpClient client =new HttpClient();
public async Task<string?> RedirectAsync()
{
// https://git.tesseslanguage.com/api/v1/repos/tesses50/crosslang/releases?pre-release=true&limit=1
var resp = await client.GetFromJsonAsync<List<_release>>($"{giteaServer.TrimEnd('/')}/api/v1/repos/{System.Web.HttpUtility.UrlPathEncode(giteaProject)}/releases?pre-release={(prerelease ? "true":"false")}&limit=1");
if(resp is not null)
{
var resp2 = resp.FirstOrDefault();
if(resp2 is not null)
{
foreach(var item in resp2.Assets)
{
if(item.Name == file)
return item.Url;
}
}
}
return null;
}
private class _release
{
[JsonPropertyName("assets")]
public List<_asset> Assets {get;set;}=new List<_asset>();
public class _asset
{
[JsonPropertyName("name")]
public string Name {get;set;}="";
[JsonPropertyName("browser_download_url")]
public string Url {get;set;}="";
}
}
}
public class GiteaReleaseWithVersionInNameRedirect(string giteaServer, string giteaProject, string file, bool prerelease = false) : IRedirect
{
private static HttpClient client =new HttpClient();
public async Task<string?> RedirectAsync()
{
// https://git.tesseslanguage.com/api/v1/repos/tesses50/crosslang/releases?pre-release=true&limit=1
var resp = await client.GetFromJsonAsync<List<_release>>($"{giteaServer.TrimEnd('/')}/api/v1/repos/{System.Web.HttpUtility.UrlPathEncode(giteaProject)}/releases?pre-release={(prerelease ? "true":"false")}&limit=1");
if(resp is not null)
{
var resp2 = resp.FirstOrDefault();
if(resp2 is not null)
{
string name = file.Replace("@TAG@", resp2.TagName);
Console.WriteLine(name);
foreach(var item in resp2.Assets)
{
if(item.Name == name)
return item.Url;
}
}
}
return null;
}
private class _release
{
[JsonPropertyName("tag_name")]
public string TagName {get;set;} = "";
[JsonPropertyName("assets")]
public List<_asset> Assets {get;set;}=new List<_asset>();
public class _asset
{
[JsonPropertyName("name")]
public string Name {get;set;}="";
[JsonPropertyName("browser_download_url")]
public string Url {get;set;}="";
}
}
}