Skip to content

Commit

Permalink
Merge pull request #53 from Sadzurami/feat/better-items-filtering
Browse files Browse the repository at this point in the history
Add support for looting items by appid and tags
  • Loading branch information
yakikotori authored Jan 30, 2024
2 parents f008145 + 81f9ab1 commit 09b1f59
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 36 deletions.
32 changes: 32 additions & 0 deletions BotLooter/Looting/LootClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,38 @@ public async Task<LootResult> TryLoot(TradeOfferUrl tradeOfferUrl, Configuration
}
}

if (configuration.LootOnlyItemsWithAppids.Count > 0)
{
foreach (var description in inventoryData.Descriptions.Where(d => d.Appid == 753 && !configuration.LootOnlyItemsWithAppids.Contains(d.MarketFeeApp)))
{
filteredOut.Add(description.Classid);
}
}

if (configuration.IgnoreItemsWithAppids.Count > 0)
{
foreach (var description in inventoryData.Descriptions.Where(d => d.Appid == 753 && configuration.IgnoreItemsWithAppids.Contains(d.MarketFeeApp)))
{
filteredOut.Add(description.Classid);
}
}

if (configuration.LootOnlyItemsWithTags.Count > 0)
{
foreach (var description in inventoryData.Descriptions.Where(d => !d.Tags.Any(t => configuration.LootOnlyItemsWithTags.Contains(t.LocalizedTagName))))
{
filteredOut.Add(description.Classid);
}
}

if (configuration.IgnoreItemsWithTags.Count > 0)
{
foreach (var description in inventoryData.Descriptions.Where(d => d.Tags.Any(t => configuration.IgnoreItemsWithTags.Contains(t.LocalizedTagName))))
{
filteredOut.Add(description.Classid);
}
}

var notFilteredOutAssets = inventoryData.Assets.Where(a => !filteredOut.Contains(a.Classid));

assets.AddRange(notFilteredOutAssets);
Expand Down
5 changes: 5 additions & 0 deletions BotLooter/Resources/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ public class Configuration

public List<string> LootOnlyItemsWithNames { get; set; } = new();
public List<string> IgnoreItemsWithNames { get; set; } = new();
public List<int> LootOnlyItemsWithAppids { get; set; } = new();
public List<int> IgnoreItemsWithAppids { get; set; } = new();

public List<string> LootOnlyItemsWithTags { get; set; } = new();
public List<string> IgnoreItemsWithTags { get; set; } = new();

public static async Task<(Configuration? Config, string Message)> TryLoadFromFile(string? filePath = null)
{
Expand Down
3 changes: 3 additions & 0 deletions BotLooter/Steam/Contracts/Responses/InventoryResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ public class Description
[JsonProperty("market_hash_name")]
public string MarketHashName { get; set; }

[JsonProperty("market_fee_app")]
public int MarketFeeApp { get; set; }

[JsonProperty("market_actions")]
public List<MarketAction> MarketActions { get; set; }

Expand Down
167 changes: 131 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,118 +15,132 @@ BotLooter.Config.json

```json
{
"LootThreadCount": 1,
"ProxiesFilePath": "proxies.txt",

"AskForApproval": true,
"ExitOnFinish": false,

"LootTradeOfferUrl": "",

"AccountsFilePath": "",
"IgnoreAccountsFilePath": "",
"SecretsDirectoryPath": "",
"SteamSessionsDirectoryPath": "",

"SuccessfulLootsExportFilePath": "",

"DelayBetweenAccountsSeconds": 30,
"DelayInventoryEmptySeconds": 10,

"Inventories": [
"440/2"
],

"IgnoreMarketable": false,
"IgnoreNotMarketable": false,

"LootOnlyItemsWithNames": [
"Mann Co. Supply Crate Key",
"Tour of Duty Ticket",
],
"LootThreadCount": 1,
"ProxiesFilePath": "proxies.txt",

"IgnoreItemsWithNames": [
"The Frying Pan"
]
"AskForApproval": true,
"ExitOnFinish": false,

"LootTradeOfferUrl": "",

"AccountsFilePath": "",
"IgnoreAccountsFilePath": "",
"SecretsDirectoryPath": "",
"SteamSessionsDirectoryPath": "",

"SuccessfulLootsExportFilePath": "",

"DelayBetweenAccountsSeconds": 30,
"DelayInventoryEmptySeconds": 10,

"Inventories": ["440/2", "753/6", "730/2"],

"IgnoreMarketable": false,
"IgnoreNotMarketable": false,

"LootOnlyItemsWithNames": ["Mann Co. Supply Crate Key"],
"IgnoreItemsWithNames": ["The Frying Pan"],

"LootOnlyItemsWithAppIds": [351940],
"IgnoreItemsWithAppIds": [12345],

"LootOnlyItemsWithTags": ["Trading Card", "Booster Pack"],
"IgnoreItemsWithTags": ["Profile Background"]
}
```

---

### `"LootTradeOfferUrl"`

Cсылка на трейд оффер, на который будут отправляться предметы.
\
Для работы необходимо скопировать полную актуальную ссылку. Пример.

- `"https://steamcommunity.com/tradeoffer/new/?partner=9639579492&token=2ix22Ruv2"`

---

### `"SecretsDirectoryPath"`

Путь к папке с МаФайлами.

---

### `"AccountsFilePath"`

Путь к файлу с аккаунтами формата login:password

---

### `"SteamSessionsDirectoryPath"`

Путь к папке с файлами .steamsession.
\
Так же можно часть аккаунтов загружать из МаФайлов, а часть из .steamsession файлов.
\
Создать такие файлы можно с помощью https://github.com/Sadzurami/steam-sessions-creator
Создать такие файлы можно с помощью <https://github.com/Sadzurami/steam-sessions-creator>

---

### `"IgnoreAccountsFilePath"`

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

- При значении `""` файл не используется
- Если указать одинаковое значение для этого параметра и `"SuccessfulLootsExportFilePath"` - это поможет избежать повторного лутания одних и тех же аккаунтов.

---

### `"ProxiesFilePath"`

Путь к файлу с прокси. Пример.

- `"http://username:[email protected]:25565"`
- `"http://192.168.1.80:8080"`

---

### `"SuccessfulLootsExportFilePath"`

Путь к файлу, в который будут записываться логины ботов, которые были успешно залутаны.

- При значении `""` файл не используется

---

### `"DelayBetweenAccountsSeconds"`

Задержка при успешном и ошибочном лутаниях.
\
Указывается в секундах.

---

### `"DelayInventoryEmptySeconds"`

Задержка при пустом инвентаре.
\
Указывается в секундах.

---

### `"AskForApproval"`

- `true` - Будет требоваться подтверждение нажатием любой клавиши.
- `false` - 5 секундное ожидание без подтверждения начала работы.

---

### `"ExitOnFinish"`

- `true` - Программа сама закроется через 5 секунд после завершения работы.
- `false` - Программа будет ждать нажатия `ctrl + c` для закрытия.

---

### `"LootThreadCount"`

Максимальное количество потоков для лутания.
\
Не может быть больше количества прокси.
Expand All @@ -136,16 +150,19 @@ Cсылка на трейд оффер, на который будут отпр
---

### `"Inventories"`

Список инвентарей для лутания. Можно указывать один или несколько.
\
Формат `"appId/contextId"`

Некоторые известные инвентари:

- `"730/2"` - CS:GO
- `"753/6"` - Steam Community
- `"440/2"` - TF2

Пример, который будет лутать все 3 вышеперчисленные инвентаря.

```json
"Inventories": [
"730/2",
Expand All @@ -157,22 +174,26 @@ Cсылка на трейд оффер, на который будут отпр
---

### `"IgnoreNotMarketable"`

- `true` - Предметы, которые невозможно продать будут игнорироваться.
- `false` - Значение по умолчанию.

---

### `"IgnoreMarketable"`

- `true` - Предметы, которые возможно продать будут игнорироваться.
- `false` - Значение по умолчанию.

---

### `"LootOnlyItemsWithNames"`
Список предметов, которые будут лутаться.

Список предметов, которые будут лутаться, отфильтрованные по имени.
Если список пустой, то будут лутаться все предметы.

Пример, который будет лутать только TF2 ключи и билеты.

```json
"LootOnlyItemsWithNames": [
"Mann Co. Supply Crate Key",
Expand All @@ -183,10 +204,11 @@ Cсылка на трейд оффер, на который будут отпр
---

### `"IgnoreItemsWithNames"`
Список предметов, которые будут игнорироваться.
Если список пустой, то никакие предметы не будут игнорироваться.

Список предметов, которые будут игнорироваться, отфильтрованные по имени.

Пример, который будет игнорировать только сковородки.

```json
"IgnoreItemsWithNames": [
"The Frying Pan"
Expand All @@ -195,6 +217,69 @@ Cсылка на трейд оффер, на который будут отпр

---

### `"LootOnlyItemsWithAppIds"`

**Применяется только к инвентарям Steam Community (`753/6`)**

Список предметов, которые будут лутаться, отфильтрованные по appId.

Пример, который будет лутать только предметы из игры The Descendant.

```json
"LootOnlyItemsWithAppIds": [
351940
]
```

---

### `"IgnoreItemsWithAppIds"`

**Применяется только к инвентарям Steam Community (`753/6`)**

Список предметов, которые будут игнорироваться, отфильтрованные по appId.

Пример, который будет игнорировать предметы из игры The Descendant.

```json
"IgnoreItemsWithAppIds": [
351940
]
```

---

### `"LootOnlyItemsWithTags"`

Список предметов, которые будут лутаться, отфильтрованные по тегу.

Пример, который будет лутать только карточки, бустеры и гемы.

```json
"LootOnlyItemsWithTags": [
"Trading Card",
"Booster Pack",
"Gems"
]
```

---

### `"IgnoreItemsWithTags"`

Список предметов, которые будут игнорироваться, отфильтрованные по тегу.

Пример, который будет игнорировать фоны профиля.

```json

"IgnoreItemsWithTags": [
"Profile Background"
]
```

---

## Коммандная строка

### `--config-file-path (-c)`
Expand All @@ -209,21 +294,31 @@ Cсылка на трейд оффер, на который будут отпр
---

## Замечания

Особенности работы, подсказки и ответы на некоторые вопросы.

### Пути

Пути в конфиге можно указать как локальные, так и полные.
\
В случае написания с бекслешем необходимо заменять `\` на `\\` примеры:

- `"C:\\Users\\BestUser\\Desktop\\SSF\\secrets"`
- `".\\secrets"`
- `"secrets"`
- `"accounts.txt"`
- `"./accounts.txt"`

### Названия предметов для фильтров

Название предметов необходимо указывать на английском языке.
Если предмет был переименован, нужно указывать его основное название.

### Теги

Название тегов необходимо указывать на английском языке.
Найти теги можно нажав на предмет в инвентаре, они будут в самом низу.

## Примеры

![Скриншот работы софта](Assets/Screenshot.png)

0 comments on commit 09b1f59

Please sign in to comment.