Весенняя уборка Steam 2020



Вы меня простите, но нафига? Там же одного IBotCommand за глаза, всё равно же заглушек на остальное налеплено?
Копипаста и лень. А IBotSteamClient чтобы напрямую лицензии добавлять через стимкит, мне так удобнее. Плагин одноразовый, качество кода здесь не особо важно...
 
Да я не про качество кода, я как раз про лень... много лишних телодвижений.
 
  • Like
Реакции: creative36rus и MegaXa
И как продажи? Нашел лошариков на покупку??
Ты знаешь, как это ни удивительно, но да. Я и здесь-то зарегился для этого, но вам уже посчастливилось. А если б раньше пришёл - то как знать чем бы всё обернулось)
 
Да я не про качество кода, я как раз про лень... много лишних телодвижений.
Код:
using System;
using System.Collections.Generic;
using System.Composition;
using System.Linq;
using System.Threading.Tasks;
using AngleSharp.Dom;
using ArchiSteamFarm;
using ArchiSteamFarm.Plugins;


namespace m4d0ne.SpringClean2020
{
   [Export(typeof(IPlugin))]
  internal sealed class SpringClean : IBotCommand
   {
  public string Name => nameof(SpringClean);

  public Version Version => typeof(SpringClean).Assembly.GetName().Version;

  private async Task<bool> JoinEvent(Bot bot)
  {
  return await bot.ArchiWebHandler.UrlPostWithSession("https://store.steampowered.com", "/springcleaning/ajaxoptintoevent");
  }

  private async Task<List<uint>> GetGamesToPlay(Bot bot)
  {
  List<uint> tasks = new List<uint>();
  IDocument eventPage = await bot.ArchiWebHandler.UrlGetToHtmlDocumentWithSession("https://store.steampowered.com", "/springcleaning");
  if (eventPage != null)
  {
  var taskNodes = eventPage.GetElementsByClassName("task_app_completed");
  foreach(var node in taskNodes)
  {
  string appID = node.GetAttributeValue("data-sg-appid");
  if(!string.IsNullOrEmpty(appID))
  {
  tasks.Add(uint.Parse(appID));
  }
  }
  }

  return tasks;
  }

     private async Task RequestMissingLicense(Bot bot, List<uint> apps) {
       List<uint> notOwned = new List<uint>();
       var ownedGames = await bot.ArchiWebHandler.GetMyOwnedGames();
       if (ownedGames != null) {
         notOwned = ownedGames.Where(x => !apps.Contains(x.Key)).ToDictionary(x => x.Key).Keys.ToList();
       } else {
         notOwned = apps;
       }

       if (notOwned.Count() > 0) {
         await bot.Commands.Response(ASF.GlobalConfig.SteamOwnerID, string.Format("ADDLICENSE {0} {1}", bot.BotName, string.Join(",", notOwned.Select(x => string.Format("app/{0}",x)))));
       }
     }

     private async Task<string> DoSpringClean(Bot bot)
  {
  bool joined = await JoinEvent(bot);
  if(joined)
  {
  List<uint> appsToPlay = await GetGamesToPlay(bot);
  if(appsToPlay.Count > 0)
  {
           await RequestMissingLicense(bot, appsToPlay);
  await bot.Actions.Play(appsToPlay);
  return bot.BotName + ": Ok";
  }
  else
  {
  return bot.BotName + ": No games to play!";
  }
  }

  return bot.BotName + ": Could not join event!";
  }

  public async Task<string> OnBotCommand(Bot bot, ulong steamID, string message, string[] args)
  {
  switch(args[0].ToUpperInvariant())
  {
  case "SPRINGCLEAN" when bot.HasPermission(steamID, BotConfig.EPermission.Operator):
  if(args.Count() > 1)
  {
  List<Bot> activeBots = Bot.GetBots(args[1]).Where(x => x.IsConnectedAndLoggedOn).ToList();
  int delayCnt = activeBots.Count();
  IList<string> result = await Utilities.InParallel(activeBots.Select( async x => { await Task.Delay(TimeSpan.FromSeconds(delayCnt * 30)); --delayCnt; return await DoSpringClean(x); }));
  return result.Count() > 0 ? string.Join(Environment.NewLine, result) : null;
  }
  else
  {
  return await DoSpringClean(bot);
  }
  default:
  return null;
  }
  }

  public void OnLoaded()
  {
  ASF.ArchiLogger.LogGenericInfo("SpringCleanPlugin loaded. Expect weird behaviour and unexpected consequences.");
  }
   }
}
Передавать по цепочке команды не так удобно, как работать со стимом напрямую... но, держи, почистил код и убрал "лишнее".

EDIT: билд забыл ... https://mega.nz/file/OH4BXCzS#fF3x_NfTBrqI7VOS6MErg1Vhz4svSSMeK4__AQJ2YW0
 
Последнее редактирование:
Код:
using System;
using System.Collections.Generic;
using System.Composition;
using System.Linq;
using System.Threading.Tasks;
using AngleSharp.Dom;
using ArchiSteamFarm;
using ArchiSteamFarm.Plugins;


namespace m4d0ne.SpringClean2020
{
   [Export(typeof(IPlugin))]
  internal sealed class SpringClean : IBotCommand
   {
  public string Name => nameof(SpringClean);

  public Version Version => typeof(SpringClean).Assembly.GetName().Version;

  private async Task<bool> JoinEvent(Bot bot)
  {
  return await bot.ArchiWebHandler.UrlPostWithSession("https://store.steampowered.com", "/springcleaning/ajaxoptintoevent");
  }

  private async Task<List<uint>> GetGamesToPlay(Bot bot)
  {
  List<uint> tasks = new List<uint>();
  IDocument eventPage = await bot.ArchiWebHandler.UrlGetToHtmlDocumentWithSession("https://store.steampowered.com", "/springcleaning");
  if (eventPage != null)
  {
  var taskNodes = eventPage.GetElementsByClassName("task_app_completed");
  foreach(var node in taskNodes)
  {
  string appID = node.GetAttributeValue("data-sg-appid");
  if(!string.IsNullOrEmpty(appID))
  {
  tasks.Add(uint.Parse(appID));
  }
  }
  }

  return tasks;
  }

     private async Task RequestMissingLicense(Bot bot, List<uint> apps) {
       List<uint> notOwned = new List<uint>();
       var ownedGames = await bot.ArchiWebHandler.GetMyOwnedGames();
       if (ownedGames != null) {
         notOwned = ownedGames.Where(x => !apps.Contains(x.Key)).ToDictionary(x => x.Key).Keys.ToList();
       } else {
         notOwned = apps;
       }

       if (notOwned.Count() > 0) {
         await bot.Commands.Response(ASF.GlobalConfig.SteamOwnerID, string.Format("ADDLICENSE {0} {1}", bot.BotName, string.Join(",", notOwned.Select(x => string.Format("app/{0}",x)))));
       }
     }

     private async Task<string> DoSpringClean(Bot bot)
  {
  bool joined = await JoinEvent(bot);
  if(joined)
  {
  List<uint> appsToPlay = await GetGamesToPlay(bot);
  if(appsToPlay.Count > 0)
  {
           await RequestMissingLicense(bot, appsToPlay);
  await bot.Actions.Play(appsToPlay);
  return bot.BotName + ": Ok";
  }
  else
  {
  return bot.BotName + ": No games to play!";
  }
  }

  return bot.BotName + ": Could not join event!";
  }

  public async Task<string> OnBotCommand(Bot bot, ulong steamID, string message, string[] args)
  {
  switch(args[0].ToUpperInvariant())
  {
  case "SPRINGCLEAN" when bot.HasPermission(steamID, BotConfig.EPermission.Operator):
  if(args.Count() > 1)
  {
  List<Bot> activeBots = Bot.GetBots(args[1]).Where(x => x.IsConnectedAndLoggedOn).ToList();
  int delayCnt = activeBots.Count();
  IList<string> result = await Utilities.InParallel(activeBots.Select( async x => { await Task.Delay(TimeSpan.FromSeconds(delayCnt * 30)); --delayCnt; return await DoSpringClean(x); }));
  return result.Count() > 0 ? string.Join(Environment.NewLine, result) : null;
  }
  else
  {
  return await DoSpringClean(bot);
  }
  default:
  return null;
  }
  }

  public void OnLoaded()
  {
  ASF.ArchiLogger.LogGenericInfo("SpringCleanPlugin loaded. Expect weird behaviour and unexpected consequences.");
  }
   }
}
Передавать по цепочке команды не так удобно, как работать со стимом напрямую... но, держи, почистил код и убрал "лишнее".

EDIT: билд забыл ... https://mega.nz/file/OH4BXCzS#fF3x_NfTBrqI7VOS6MErg1Vhz4svSSMeK4__AQJ2YW0
ты научил скрипт делать на все аки? типо springclean asf можно прописать?
 
Он с самого начала умел так.
у меня чето зависло проверяю аки нет ачивки, в ручную каждый ник вписовал. потратил 15 минут, когда прописовал asf стояло минут 20 ни на одном аке не было ачивки(
---------Двойное сообщение соединено: ---------
точнее не зависло а просто идет выполнение и все 0реакции
 
Ты знаешь, как это ни удивительно, но да. Я и здесь-то зарегился для этого, но вам уже посчастливилось. А если б раньше пришёл - то как знать чем бы всё обернулось)
Оо, кто пожаловал в наши земли!
Модератор группы asf.
---------Двойное сообщение соединено: ---------
у меня чето зависло проверяю аки нет ачивки, в ручную каждый ник вписовал. потратил 15 минут, когда прописовал asf стояло минут 20 ни на одном аке не было ачивки(
---------Двойное сообщение соединено: ---------
точнее не зависло а просто идет выполнение и все 0реакции
жди. У меня только через 4 часа выполнилось
 
  • Like
Реакции: creative36rus и dedinside
у меня чето зависло проверяю аки нет ачивки, в ручную каждый ник вписовал. потратил 15 минут, когда прописовал asf стояло минут 20 ни на одном аке не было ачивки(
---------Двойное сообщение соединено: ---------
точнее не зависло а просто идет выполнение и все 0реакции
30 секунд на 1 аккаунт... Можно уменьшить задержку, но страшно.
 
  • Like
Реакции: creative36rus и dedinside
В пачке - 250
а кто подтвердит, что это он? :8:
ну... тот же никнейм и ава.
Вряд ли кто-то бы им притворяется, он сам писал в дискорде, что продает скрипт.
Узкая специфика для обмана
1.0
 
  • Like
Реакции: creative36rus и dedinside
Доделал скрипт на змее, теперь он берет аккаунты из файла и добавляет бесплатные игры на аккаунт что бы выполнить все задания. Код кривой, обработчика ошибок нету, если будет иногда подать соре
P.s. Много времени уходит на 1 акк т.к. приходится парсить с левого сайта для каждой игры subid, если кто то знает как его найти в самом стиме напишите мне в лс, буду благодарен
 
  • Like
Реакции: creative36rus
P.s. Много времени уходит на 1 акк т.к. приходится парсить с левого сайта для каждой игры subid, если кто то знает как его найти в самом стиме напишите мне в лс, буду благодарен
Можно сразу запрашивать лицензию на appid https://steam.readthedocs.io/en/lat...lient.builtins.apps.Apps.request_free_license