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
168 changes: 168 additions & 0 deletions TBot/Model/AutoFarmBlacklist.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
using TBot.Ogame.Infrastructure.Models;

namespace TBot.Model {
public enum BlacklistReason {
HasFleet,
HasDefense,
LowResources,
ManuallyAdded
}

public class BlacklistedTarget {
public Coordinate Coordinate { get; set; }
public BlacklistReason Reason { get; set; }
public DateTime BlacklistedAt { get; set; }
public DateTime ExpiresAt { get; set; }

public BlacklistedTarget() {
}

public BlacklistedTarget(Coordinate coordinate, BlacklistReason reason, DateTime expiresAt) {
Coordinate = coordinate;
Reason = reason;
BlacklistedAt = DateTime.UtcNow;
ExpiresAt = expiresAt;
}

public bool IsExpired() {
return DateTime.UtcNow >= ExpiresAt;
}
}

public class AutoFarmBlacklist {
private List<BlacklistedTarget> _blacklistedTargets;
private readonly object _lock = new object();
private string _filePath;

public AutoFarmBlacklist() {
_blacklistedTargets = new List<BlacklistedTarget>();
}

public AutoFarmBlacklist(string filePath) {
string dataFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data");
if (!Directory.Exists(dataFolder)) {
Directory.CreateDirectory(dataFolder);
}
_filePath = Path.Combine(dataFolder, filePath);
_blacklistedTargets = new List<BlacklistedTarget>();
LoadFromFile();
}

public void AddTarget(Coordinate coordinate, BlacklistReason reason, int hoursUntilReset) {
lock (_lock) {
_blacklistedTargets.RemoveAll(t => t.Coordinate.Galaxy == coordinate.Galaxy
&& t.Coordinate.System == coordinate.System
&& t.Coordinate.Position == coordinate.Position);

DateTime expiresAt = DateTime.UtcNow.AddHours(hoursUntilReset);
_blacklistedTargets.Add(new BlacklistedTarget(coordinate, reason, expiresAt));
SaveToFile();
}
}

public bool IsBlacklisted(Coordinate coordinate) {
lock (_lock) {
CleanupExpiredTargets();

return _blacklistedTargets.Any(t =>
t.Coordinate.Galaxy == coordinate.Galaxy
&& t.Coordinate.System == coordinate.System
&& t.Coordinate.Position == coordinate.Position);
}
}

public BlacklistedTarget GetBlacklistedTarget(Coordinate coordinate) {
lock (_lock) {
CleanupExpiredTargets();

return _blacklistedTargets.FirstOrDefault(t =>
t.Coordinate.Galaxy == coordinate.Galaxy
&& t.Coordinate.System == coordinate.System
&& t.Coordinate.Position == coordinate.Position);
}
}

public void RemoveTarget(Coordinate coordinate) {
lock (_lock) {
_blacklistedTargets.RemoveAll(t =>
t.Coordinate.Galaxy == coordinate.Galaxy
&& t.Coordinate.System == coordinate.System
&& t.Coordinate.Position == coordinate.Position);
}
SaveToFile();
}

public void ClearAll() {
lock (_lock) {
_blacklistedTargets.Clear();
}
SaveToFile();
}

public int GetBlacklistedCount() {
lock (_lock) {
CleanupExpiredTargets();
return _blacklistedTargets.Count;
}
}

public List<BlacklistedTarget> GetAllBlacklisted() {
lock (_lock) {
CleanupExpiredTargets();
return new List<BlacklistedTarget>(_blacklistedTargets);
}
}

private void CleanupExpiredTargets() {
_blacklistedTargets.RemoveAll(t => t.IsExpired());
}

public void ManualCleanup() {
lock (_lock) {
CleanupExpiredTargets();
}
}
private void LoadFromFile() {
if (string.IsNullOrEmpty(_filePath) || !File.Exists(_filePath)) {
return;
}

try {
string json = File.ReadAllText(_filePath);
var loaded = JsonConvert.DeserializeObject<List<BlacklistedTarget>>(json);
if (loaded != null) {
lock (_lock) {
_blacklistedTargets = loaded;
CleanupExpiredTargets();
}
}
} catch (Exception) {
lock (_lock) {
_blacklistedTargets = new List<BlacklistedTarget>();
}
}
}

private void SaveToFile() {
if (string.IsNullOrEmpty(_filePath)) {
return;
}

List<BlacklistedTarget> snapshot;
lock (_lock) {
snapshot = _blacklistedTargets.ToList();
}

try {
string json = JsonConvert.SerializeObject(snapshot, Formatting.Indented);
File.WriteAllText(_filePath, json);
} catch (Exception) {
}
}
}
}
Loading