Compare commits

..

4 Commits

Author SHA1 Message Date
Chris Plaatjes
8461afd08f Fixed runner repo links
Some checks failed
Push Docker image to registries
2023-03-20 20:14:41 -04:00
Chris Plaatjes
30d4c41eee Added repo auth
Some checks failed
Push Docker image to registries
2023-03-20 20:11:22 -04:00
Chris Plaatjes
fadc678ac3 Fixed pipeline trigger
Some checks failed
Push Docker image to registries
2023-03-20 20:01:52 -04:00
Chris Plaatjes
9b06a629f0 Added gitea runner 2023-03-20 19:58:20 -04:00
7 changed files with 47 additions and 244 deletions

View File

@ -0,0 +1,36 @@
# .gitea/workflows/build.yaml
name: Publish Docker image
on:
push:
branches: [main]
jobs:
push_to_registry:
name: Push Docker image to registries
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
with:
token: ${{ secrets.GITEA_TOKEN }}
- name: Login to DockerHub
uses: https://github.com/docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Login to Gitea registry
uses: https://github.com/docker/login-action@v2
with:
registry: git.kizaing.ca
username: ${{ gitea.actor }}
password: ${{ secrets.GITEA_TOKEN }}
- name: Build and push Docker image
uses: https://github.com/docker/build-push-action@v4
with:
context: .
push: true
tags: git.kizaing.ca/kizaing/teletok:latest, kizaing

View File

@ -1,46 +0,0 @@
using System;
using Sodium;
namespace TeleTok
{
public class CryptographyService
{
public string ToHexString(byte[] input)
{
var hexString = BitConverter.ToString(input);
string result = hexString.Replace("-", "");
return result.ToLower();
}
public byte[] GenerateLoginDigest()
{
long now = DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000;
var message = $"login:{now / 1000 / (5 * 60)}";
return GenericHash.Hash(message, (byte[]?) null, 32);
}
public KeyPair GenerateEd25519KeyPair(string seed)
{
byte[] hash = GenericHash.Hash(seed, (byte[]?) null, 32);
return PublicKeyAuth.GenerateKeyPair(hash);
}
public string GenerateHexSignature(byte[] loginDigest, byte[] secretKey)
{
byte[] signature = PublicKeyAuth.SignDetached(loginDigest, secretKey);
return ToHexString(signature);
}
public string GenerateHexId(byte[] publicKey)
{
byte[] hash = GenericHash.Hash(publicKey, null, publicKey.Length);
return ToHexString(hash);
}
}
}

View File

@ -1,114 +0,0 @@
using System;
using System.Configuration;
using Matrix.Sdk;
using Matrix.Sdk.Core.Domain.MatrixRoom;
using Matrix.Sdk.Core.Domain.RoomEvent;
using Matrix.Sdk.Core.Infrastructure.Dto.Room.Create;
using Sodium;
namespace TeleTok
{
public class MatrixListener
{
private static readonly CryptographyService CryptographyService = new();
public record LoginRequest(Uri BaseAddress, string Username, string Password, string DeviceId);
public async Task RunListener()
{
var factory = new MatrixClientFactory();
var anotherFactory = new MatrixClientFactory();
IMatrixClient client = factory.Create();
IMatrixClient anotherClient = anotherFactory.Create();
client.OnMatrixRoomEventsReceived += (sender, eventArgs) =>
{
foreach (BaseRoomEvent roomEvent in eventArgs.MatrixRoomEvents)
{
if (roomEvent is not TextMessageEvent textMessageEvent)
continue;
(string roomId, string senderUserId, string message) = textMessageEvent;
if (client.UserId != senderUserId)
TeleTok.LogMessage($"RoomId: {roomId} received message from {senderUserId}: {message}.");
}
};
anotherClient.OnMatrixRoomEventsReceived += (sender, eventArgs) =>
{
foreach (BaseRoomEvent roomEvent in eventArgs.MatrixRoomEvents)
{
if (roomEvent is not TextMessageEvent textMessageEvent)
continue;
(string roomId, string senderUserId, string message) = textMessageEvent;
if (anotherClient.UserId != senderUserId)
TeleTok.LogMessage($"RoomId: {roomId} received message from {senderUserId}: {message}.");
}
};
(Uri matrixNodeAddress, string username, string password, string deviceId) = CreateLoginRequest();
await client.LoginAsync(matrixNodeAddress, username, password, deviceId);
LoginRequest request2 = CreateLoginRequest();
await anotherClient.LoginAsync(request2.BaseAddress, request2.Username, request2.Password, request2.DeviceId);
if(client.IsLoggedIn)
{
TeleTok.LogMessage($"client.IsLoggedIn: {client.IsLoggedIn}");
TeleTok.LogMessage($"client.IsSyncing: {client.IsSyncing}");
}
client.Start();
anotherClient.Start();
CreateRoomResponse createRoomResponse = await client.CreateTrustedPrivateRoomAsync(new[]
{
anotherClient.UserId
});
await anotherClient.JoinTrustedPrivateRoomAsync(createRoomResponse.RoomId);
var spin = new SpinWait();
while(anotherClient.JoinedRooms.Length ==0)
spin.SpinOnce();
await client.SendMessageAsync(createRoomResponse.RoomId, "Hello");
await anotherClient.SendMessageAsync(anotherClient.JoinedRooms[0].Id, ", ");
await client.SendMessageAsync(createRoomResponse.RoomId, "World");
await anotherClient.SendMessageAsync(anotherClient.JoinedRooms[0].Id, "!");
TeleTok.LogMessage($"client.IsLoggedIn: {client.IsLoggedIn}");
TeleTok.LogMessage($"client.IsSyncing: {client.IsSyncing}");
Console.ReadLine();
client.Stop();
anotherClient.Stop();
Console.WriteLine($"client.IsLoggedIn: {client.IsLoggedIn}");
Console.WriteLine($"client.IsSyncing: {client.IsSyncing}");
}
private static LoginRequest CreateLoginRequest()
{
var seed = Guid.NewGuid().ToString();
KeyPair keyPair = CryptographyService.GenerateEd25519KeyPair(seed);
byte[] loginDigest = CryptographyService.GenerateLoginDigest();
string hexSignature = CryptographyService.GenerateHexSignature(loginDigest, keyPair.PrivateKey);
string publicKeyHex = CryptographyService.ToHexString(keyPair.PublicKey);
string hexId = CryptographyService.GenerateHexId(keyPair.PublicKey);
var password = $"ed:{hexSignature}:{publicKeyHex}";
string deviceId = publicKeyHex;
LoginRequest loginRequest = new LoginRequest(TeleTok.mAddress, TeleTok.mBotUser, TeleTok.mBotPass, deviceId);
return loginRequest;
}
}
}

View File

@ -10,91 +10,26 @@ namespace TeleTok
.AddJsonFile("config.json", true)
.Build();
// Value to see what bot mode to run in
public static string botMode = config.GetSection("TeleTokConf:botMode").Value;
// Telegram bot config
public static string token = config.GetSection("TeleTokConf:token").Value;
public static string ptInstance = config.GetSection("TeleTokConf:ptInstance").Value;
// Matrix bot config
public static string matrixAddress = config.GetSection("TeleTokConf:matrixAddress").Value;
public static Uri mAddress;
public static string mBotUser = config.GetSection("TeleTokConf:mBotUser").Value;
public static string mBotPass = config.GetSection("TeleTokConf:mBotPass").Value;
public static string ptInstance = config.GetSection("TeleTokConf:proxitokInstance").Value;
static async Task Main(string[] args)
{
//Checks to see what mode to run the bot in
LogMessage($"The current running config is: \n Bot Mode: {botMode} \n Telegram Token: {token} \n ProxiTok Instance: {ptInstance} \n Matrix Homeserver: {matrixAddress} \n Matrix Bot User: {mBotUser}");
if(botMode == "telegram")
{
//Checks if the config json data is valid
if(!ConfigCheck(token))
if(token == "" || token == null || token == "INSERT TOKEN HERE")
{
LogMessage("Telegram bot token is invalid! Exiting...");
}
else if(!ConfigCheck(ptInstance))
else if(ptInstance == "" || ptInstance == null || ptInstance == "PROXITOK INSTANCE URL")
{
LogMessage("Proxitok instance is invalid! Exiting...");
}
else
{
TelegramListener tListener = new TelegramListener();
TelegramListener listener = new TelegramListener();
LogMessage("Now listening...");
tListener.RunListener();
}
}
else if(botMode == "matrix")
{
//Checks if the config json data is valid
if(Uri.IsWellFormedUriString(matrixAddress, UriKind.Absolute))
{
mAddress = new Uri(matrixAddress);
}
else
{
LogMessage("Matrix server address is not a valid URL! Exiting...");
}
if(!ConfigCheck(mBotUser))
{
LogMessage("Matrix bot username is invalid! Exiting...");
}
else if(!ConfigCheck(mBotPass))
{
LogMessage("Matrix bot password is invalid! Exiting...");
}
else
{
MatrixListener mListener = new MatrixListener();
LogMessage("Now listening...");
await mListener.RunListener();
}
}
else
{
LogMessage("Bot mode is not configured! Enter either \'telegram\' or \'matrix\'");
}
}
public static bool ConfigCheck(string confItem)
{
if(confItem == "" || confItem == null
|| confItem == "INSERT TOKEN HERE"
|| confItem == "PROXITOK INSTANCE URL"
|| confItem == "SYNAPSE SERVER URL"
|| confItem == "MATRIX BOT USERNAMEL"
|| confItem == "MATRIX BOT PASSWORD")
{
return false;
}
else
{
return true;
listener.RunListener();
}
}

View File

@ -1,5 +1,3 @@
[![Build Status](https://ci.kizaing.ca/api/badges/kizaing/TeleTok/status.svg)](https://ci.kizaing.ca/kizaing/TeleTok)
# TeleTok Telegram Bot
This bot will monitor any chats for TikTok links that are posted, and then will run the link through a [ProxiTok](https://github.com/pablouser1/ProxiTok) instance to generate a download link. The resulting video file will then get directly uploaded directly to your chat.

View File

@ -8,10 +8,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Matrix.Sdk" Version="1.0.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
<PackageReference Include="Sodium.Core" Version="1.3.3" />
<PackageReference Include="Telegram.Bot" Version="17.0.0" />
<PackageReference Include="Telegram.Bot.Extensions.Polling" Version="1.0.2" />
</ItemGroup>

View File

@ -1,10 +1,6 @@
{
"TeleTokConf": {
"botMode": "telegram",
"token": "INSERT TOKEN HERE",
"ptInstance": "PROXITOK INSTANCE URL",
"matrixAddress": "SYNAPSE SERVER URL",
"mBotUser": "MATRIX BOT USERNAME",
"mBotPass": "MATRIX BOT PASSWORD"
"proxitokInstance": "PROXITOK INSTANCE URL"
}
}