- Регистрация
- 23 Дек 2024
- Сообщения
- 256
- Реакции
- 126
- Баллы
- 62
И так господа, появилась потребность управлять сервером удалено, и я остановился на телеграмме, вообще суть этого метода не принципиальна откуда управлять, можно и с сайта и телеграмма и как угодно.
Результат чтобы не тратить ваше время зря:
Давайте начнем, создаем бота для телеграмма, бот у меня написан на Java, подключил я еще JDBC чтоб обращаться к базе данных игроков и так же обновлять им информацию, если с банами вопросов нет, все элементарно, человек написал /ban email days , мы распарсили и внесли изменения в БД в таблице users, то что делать если мы хотим что то более интересное, вызывать например создание машины, спавн конкретной вещи или еще какие то действия прям на сервере?
Код не лучший но думаю для гайда пойдет, главное смысл донести)
Тут нам на помощь приходит вторая таблица, создаем значит таблицу
Дальше нам понадобятся 2 класса для коннекта к БД) можете посмотреть гайды от Mip&Pesok, тот же код, от них брал
Результат чтобы не тратить ваше время зря:
Давайте начнем, создаем бота для телеграмма, бот у меня написан на Java, подключил я еще JDBC чтоб обращаться к базе данных игроков и так же обновлять им информацию, если с банами вопросов нет, все элементарно, человек написал /ban email days , мы распарсили и внесли изменения в БД в таблице users, то что делать если мы хотим что то более интересное, вызывать например создание машины, спавн конкретной вещи или еще какие то действия прям на сервере?
Код не лучший но думаю для гайда пойдет, главное смысл донести)
Тут нам на помощь приходит вторая таблица, создаем значит таблицу
Код:
Код:
create table public.commands_queue
(
id serial
primary key,
name_command varchar(255),
arg1 varchar(255),
arg2 varchar(255),
arg3 integer,
arg4 integer,
finish boolean default false,
sender varchar(255),
time varchar
);
Создаем сущность на серверсайде
Код:
public class commandsQueue
{
[Column("id")]
public int Id { get; set; }
[Column("name_command")]
public string NameCommand { get; set; }
[Column("arg1")]
public string Arg1 { get; set; }
[Column("arg2")]
public string Arg2 { get; set; }
[Column("arg3")]
public int Arg3 { get; set; }
[Column("arg4")]
public int Arg4 { get; set; }
[Column("finish")]
public bool Finish { get; set; }
[Column("sender")]
public string Sender { get; set; }
[Column("time")]
public string time { get; set; }
public commandsQueue()
{
}
}
Дальше нам понадобятся 2 класса для коннекта к БД) можете посмотреть гайды от Mip&Pesok, тот же код, от них брал
Код:
C#:
public class CommandsConfiguration : IEntityTypeConfiguration <commandsQueue>
{
public void Configure(EntityTypeBuilder<commandsQueue> builder)
{
try {
builder.HasKey(x => x.Id);
} catch (Exception e) {
NAPI.Util.ConsoleOutput(DateTime.Now + $" Ошибка{e.Message} \n" +
$" Сборка {e.Source} Stack: \n" + e.StackTrace);
}
}
}
C#:
public class DatabaseConCommands : DbContext
{
public DbSet<commandsQueue> commands_queue { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder OptionsBuilder)
{
try {
var connString = new NpgsqlConnectionStringBuilder()
{
Host = "localhost",
Port = 5432,
Database = "darkstar",
Username = "postgres",
Password = "postgres",
ConvertInfinityDateTime = true,
IncludeErrorDetails = true
};
OptionsBuilder.UseNpgsql(connString.ConnectionString)
.LogTo(str => Debug.WriteLine(str), new[] {RelationalEventId.CommandExecuted})
.EnableSensitiveDataLogging();
} catch (Exception e) {
NAPI.Util.ConsoleOutput(DateTime.Now + $" Ошибка{e.Message} \n" +
$" Сборка {e.Source} Stack: \n" + e.StackTrace);
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
try {
modelBuilder.ApplyConfiguration(new CommandsConfiguration());
}
catch (Exception e) {
NAPI.Util.ConsoleOutput(DateTime.Now + $" Ошибка{e.Message} \n" +
$" Сборка {e.Source} Stack: \n" + e.StackTrace);
}
}
}
В нашем боте мы значит отправляем команду например /vehicle socialId hashName , он добавляет эту строку в БД, в игре сейчас мы будем считывать каждые например 5 секунд команду у которой finished = false, после проводим манипуляции че там надо, создать машину или телепортировать и затем finished = true, дабы второй раз не выполнилась данная команда и записываем изменения)
Код:
[ServerEvent(Event.ResourceStart)]
public async void OnResourceStart()
{
while (true)
{
await Task.Delay(5000);
newCommand();
}
}
Код:
public bool newCommand()
{
using (var db = new DatabaseConCommands())
{
commandsQueue? cmd = (commandsQueue) db.commands_queue.FirstOrDefault(x => x.Finish == false);
if (cmd == null)
{
return false;
}
switch (cmd.NameCommand)
{
case "ban":
Console.WriteLine($"Player get ban social {cmd.Arg1} on day {cmd.Arg3} time send: {cmd.time} sender: {cmd.Sender}");
break;
case "kick":
Console.WriteLine($"Player was kicked");
break;
case "mute":
Console.WriteLine($"Player get mute social");
break;
case "vehicle":
var vPlayer = NAPI.Pools.GetAllPlayers()
.FirstOrDefault(x => x.SocialClubId == Decimal.Parse(cmd.Arg1));
if (vPlayer != null)
{
NAPI.Task.Run(() =>
{
var veh =NAPI.Vehicle.CreateVehicle(NAPI.Util.GetHashKey(cmd.Arg2), vPlayer.Position, 0, 255, 255,
"COLD");
vPlayer.SetIntoVehicle(veh.Handle, 0);
});
}
break;
case "give":
Console.WriteLine($"Player get item");
break;
case "teleport":
Console.WriteLine($"Player was teleported");
break;
default:
break;
}
cmd.Finish = true;
db.SaveChanges();
return true;
}
}