193 lines
8.2 KiB
Plaintext
193 lines
8.2 KiB
Plaintext
@model LittleShop.DTOs.BotDto
|
|
|
|
@{
|
|
ViewData["Title"] = $"Edit Bot - {Model.Name}";
|
|
var settingsJson = ViewData["BotSettings"] as string ?? "{}";
|
|
}
|
|
|
|
<h1>Edit Bot Settings</h1>
|
|
|
|
<hr />
|
|
|
|
@if (TempData["Error"] != null)
|
|
{
|
|
<div class="alert alert-danger alert-dismissible fade show" role="alert">
|
|
@TempData["Error"]
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
</div>
|
|
}
|
|
|
|
<form asp-action="Edit" method="post">
|
|
@Html.AntiForgeryToken()
|
|
<div class="row">
|
|
<div class="col-md-8">
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0">Bot Information</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<dl class="row">
|
|
<dt class="col-sm-3">Name</dt>
|
|
<dd class="col-sm-9">@Model.Name</dd>
|
|
|
|
<dt class="col-sm-3">Type</dt>
|
|
<dd class="col-sm-9">@Model.Type</dd>
|
|
|
|
<dt class="col-sm-3">Bot ID</dt>
|
|
<dd class="col-sm-9"><code>@Model.Id</code></dd>
|
|
</dl>
|
|
|
|
<div class="mb-3">
|
|
<label for="status" class="form-label">Status</label>
|
|
<select name="status" id="status" class="form-select">
|
|
<option value="1" selected="@(Model.Status == LittleShop.Enums.BotStatus.Active)">Active</option>
|
|
<option value="2" selected="@(Model.Status == LittleShop.Enums.BotStatus.Inactive)">Inactive</option>
|
|
<option value="3" selected="@(Model.Status == LittleShop.Enums.BotStatus.Suspended)">Suspended</option>
|
|
<option value="4" selected="@(Model.Status == LittleShop.Enums.BotStatus.Maintenance)">Maintenance</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0">💰 Payment Wallets</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p class="text-muted">Configure cryptocurrency wallet addresses for direct payments. These are used as fallback when payment gateway is unavailable.</p>
|
|
@{
|
|
var wallets = new Dictionary<string, string>();
|
|
try
|
|
{
|
|
var settings = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, System.Text.Json.JsonElement>>(@settingsJson);
|
|
if (settings != null && settings.ContainsKey("wallets"))
|
|
{
|
|
wallets = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, string>>(settings["wallets"].GetRawText()) ?? new Dictionary<string, string>();
|
|
}
|
|
}
|
|
catch { }
|
|
|
|
var supportedCurrencies = new[] {
|
|
new { Code = "BTC", Name = "Bitcoin", Placeholder = "bc1q... or 1... or 3..." },
|
|
new { Code = "XMR", Name = "Monero", Placeholder = "4... (primary address)" },
|
|
new { Code = "LTC", Name = "Litecoin", Placeholder = "ltc1q... or L... or M..." },
|
|
new { Code = "DOGE", Name = "Dogecoin", Placeholder = "D..." },
|
|
new { Code = "ETH", Name = "Ethereum", Placeholder = "0x..." },
|
|
new { Code = "ZEC", Name = "Zcash", Placeholder = "t1... or zs1..." },
|
|
new { Code = "DASH", Name = "Dash", Placeholder = "X..." }
|
|
};
|
|
}
|
|
|
|
<form asp-action="UpdateWallets" asp-route-id="@Model.Id" method="post" id="walletsForm">
|
|
@Html.AntiForgeryToken()
|
|
@foreach (var currency in supportedCurrencies)
|
|
{
|
|
<div class="mb-3">
|
|
<label for="wallet_@currency.Code" class="form-label">
|
|
<strong>@currency.Code</strong> - @currency.Name
|
|
</label>
|
|
<input type="text"
|
|
name="wallets[@currency.Code]"
|
|
id="wallet_@currency.Code"
|
|
class="form-control font-monospace"
|
|
placeholder="@currency.Placeholder"
|
|
value="@(wallets.ContainsKey(currency.Code) ? wallets[currency.Code] : "")" />
|
|
</div>
|
|
}
|
|
|
|
<div class="alert alert-info">
|
|
<strong>Note:</strong> Only configured wallets will be available as payment options. Leave blank to disable direct payments for that cryptocurrency.
|
|
</div>
|
|
|
|
<button type="submit" class="btn btn-primary w-100">
|
|
<i class="bi bi-wallet2"></i> Save Wallet Addresses
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="mb-0">Bot Configuration (JSON)</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="mb-3">
|
|
<label for="settingsJson" class="form-label">Settings</label>
|
|
<textarea name="settingsJson" id="settingsJson" class="form-control font-monospace" rows="20">@settingsJson</textarea>
|
|
<small class="text-muted">Edit the JSON configuration for this bot. Be careful to maintain valid JSON format.</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
<h5 class="mb-0">Configuration Template</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<p class="small">Example configuration structure:</p>
|
|
<pre class="bg-light p-2 small"><code>{
|
|
"Telegram": {
|
|
"BotToken": "YOUR_BOT_TOKEN",
|
|
"WebhookUrl": "",
|
|
"AdminChatId": ""
|
|
},
|
|
"Privacy": {
|
|
"Mode": "strict",
|
|
"RequirePGP": false,
|
|
"EnableTor": false
|
|
},
|
|
"Features": {
|
|
"EnableQRCodes": true,
|
|
"EnableVoiceSearch": false
|
|
},
|
|
"Cryptocurrencies": [
|
|
"BTC", "XMR", "USDT"
|
|
]
|
|
}</code></pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="mb-0">Actions</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<button type="submit" class="btn btn-primary w-100 mb-2">
|
|
<i class="bi bi-save"></i> Save Changes
|
|
</button>
|
|
<a asp-action="Details" asp-route-id="@Model.Id" class="btn btn-secondary w-100">
|
|
Cancel
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
|
|
@section Scripts {
|
|
<script>
|
|
// Pretty print JSON on load
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
var textarea = document.getElementById('settingsJson');
|
|
try {
|
|
var json = JSON.parse(textarea.value);
|
|
textarea.value = JSON.stringify(json, null, 2);
|
|
} catch (e) {
|
|
console.error('Invalid JSON:', e);
|
|
}
|
|
});
|
|
|
|
// Validate JSON before submit
|
|
document.querySelector('form').addEventListener('submit', function(e) {
|
|
var textarea = document.getElementById('settingsJson');
|
|
try {
|
|
JSON.parse(textarea.value);
|
|
} catch (error) {
|
|
e.preventDefault();
|
|
alert('Invalid JSON format: ' + error.message);
|
|
}
|
|
});
|
|
</script>
|
|
} |