Добро пожаловать на BlackSAMP - ФОРУМ

  • Приватные и секретные разделы доступны только зарегистрированным пользователям.

    Вся важная информация в нашем ТГ: t.me/gtablack

    На данном форуме запрещено публиковать контент нарушающий Российское законодательство, за это последует блокировка ФА.

Управление сервером с помощью ботов / сайта

Developer

Разработчик
SOFT TEAM
Регистрация
23 Дек 2024
Сообщения
256
Реакции
126
Баллы
62
И так господа, появилась потребность управлять сервером удалено, и я остановился на телеграмме, вообще суть этого метода не принципиальна откуда управлять, можно и с сайта и телеграмма и как угодно.

Результат чтобы не тратить ваше время зря:



Давайте начнем, создаем бота для телеграмма, бот у меня написан на 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;
}
}
 
Сверху Снизу