SteamGroupBlocker

Block all member of a steam group

  1. // ==UserScript==
  2. // @name SteamGroupBlocker
  3. // @namespace https://greasyfork.org/users/191481
  4. // @version 0.1.1
  5. // @description Block all member of a steam group
  6. // @author Zeper
  7. // @match https://steamcommunity.com/groups/*/members
  8. // @match https://steamcommunity.com/groups/*/members/
  9. // @grant GM_xmlhttpRequest
  10. // @connect steamcommunity.com
  11. // ==/UserScript==
  12.  
  13. var IsDebug = false;
  14. var xhr = new XMLHttpRequest();
  15. var parser = new DOMParser();
  16. var GroupMembers = [];
  17. var MemberCount = 0;
  18. var GroupName = "";
  19. var NextPageNum = 1;
  20. var Action = "block";
  21. var HasBlockBtnBeenPressed = false;
  22. // Error
  23. var ErrorCount = 0;
  24. var RetryOverError = 1;
  25. var NetErrorCount = 0;
  26. var RetryOverNetError = 3;
  27. var timestamp = 0;
  28. var minDelay = 30000;
  29.  
  30. function EndOfScript(){
  31. HasBlockBtnBeenPressed = false;
  32. NextPageNum = 1;
  33. console.log("[SteamGroupBlocker] End of script, all members should have been "+Action+".");
  34. alert("[SteamGroupBlocker] End of script, all members should have been "+Action+".");
  35. return;
  36. }
  37.  
  38. function GetGroupMembers(){
  39. if (NextPageNum == 0) {
  40. EndOfScript();
  41. } else {
  42. if (IsDebug){console.log("[SteamGroupBlocker] PageNum : "+NextPageNum);}
  43. GM_xmlhttpRequest ( {
  44. method: "GET",
  45. url: "http://steamcommunity.com/groups/"+GroupName+"/memberslistxml/?xml=1&p="+NextPageNum.toString(),
  46. onreadystatechange : function (response) {
  47. if (response.readyState == 4 && response.status == 200) {
  48. if (IsDebug){console.log(response.responseText);}
  49. var xmlDoc = parser.parseFromString(response.responseText,"text/xml");
  50. var SteamID64 = xmlDoc.getElementsByTagName("steamID64");
  51. if (MemberCount == 0) {
  52. var MemberCounts = xmlDoc.getElementsByTagName("memberCount");
  53. for (let Counts of MemberCounts) {
  54. if (Counts.parentNode.localName == "memberList") {
  55. MemberCount = parseInt(Counts.innerHTML);
  56. }
  57. }
  58. if (IsDebug){console.log("[SteamGroupBlocker] MemberCount : "+ JSON.stringify(MemberCount));}
  59. if (MemberCount >= 1000) {
  60. HasBlockBtnBeenPressed = false;
  61. console.warn("[SteamGroupBlocker] This group has a lot of member it will take time to "+Action+" all of them. At best 1000 users per 30 seconds.");
  62. console.warn("[SteamGroupBlocker] if you realy want to do it anyway click once more on the "+Action+" button");
  63. alert("[SteamGroupBlocker] This group has a lot of member it will take time to "+Action+" all of them. At best 1000 users per 30 seconds.");
  64. alert("[SteamGroupBlocker] if you realy want to do it anyway click once more on the "+Action+" button");
  65. return;
  66. }
  67. }
  68. for (let item of SteamID64) {
  69. GroupMembers.push(item.innerHTML);
  70. }
  71. if (IsDebug){
  72. console.log(GroupMembers);
  73. }
  74. var NextPage = xmlDoc.getElementsByTagName("nextPageLink");
  75. if (NextPage.length > 0){
  76. NextPage = NextPage[0].childNodes[0].data;
  77. var NextPageUrl = new URLSearchParams(NextPage);
  78. NextPageNum = NextPageUrl.get('p');
  79. } else { NextPageNum = 0}
  80. ActionOnSteamID();
  81. }
  82. }
  83. } );
  84. }
  85. }
  86.  
  87. function ActionOnSteamID(){
  88. if (ErrorCount > RetryOverError) {
  89. throw new Error("[SteamGroupBlocker] Too much error when trying to block users, script will stop.");
  90. return;
  91. } else if (NetErrorCount > RetryOverNetError) {
  92. throw new Error("[SteamGroupBlocker] Too much network error when trying to block users maybe you are rate limited, script will stop.");
  93. return;
  94. } else {
  95. if (GroupMembers.length > 0) {
  96. var delay = 1;
  97. var steamIDstring = ""
  98. GroupMembers.forEach(steamID => {
  99. steamIDstring += "&steamids%5B%5D="+steamID;
  100. });
  101. if (IsDebug){console.log("[SteamGroupBlocker] steamIDstring : "+steamIDstring);}
  102. timestamp = Date.now();
  103. console.log("[SteamGroupBlocker] Sending "+Action+" request.");
  104. GM_xmlhttpRequest({
  105. method: 'POST',
  106. url: 'https://steamcommunity.com/profiles/'+g_steamID+'/friends/action',
  107. data: "sessionid="+g_sessionID.toString()+"&steamid="+g_steamID+"&ajax=1&action="+Action+steamIDstring,
  108. headers: {
  109. 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  110. 'X-Requested-With': 'XMLHttpRequest'
  111. },
  112. onreadystatechange : function (response) {
  113. if (response.readyState == 4) {
  114. if (response.status == 200) {
  115. NetErrorCount = 0;
  116. var jsonResponse = JSON.parse(response.responseText);
  117. if (IsDebug){console.log("[SteamGroupBlocker] Block response : "+response.responseText);}
  118. if (IsDebug){console.log("[SteamGroupBlocker] Block response success : "+jsonResponse.success);}
  119. if (jsonResponse.success == 1) {
  120. ErrorCount = 0;
  121. GroupMembers.length = 0;
  122. if (NextPageNum == 0) {
  123. EndOfScript();
  124. return;
  125. }
  126. } else {
  127. ErrorCount++;
  128. }
  129. if ((Date.now() - timestamp) < minDelay) {delay = (minDelay-(Date.now() - timestamp))}
  130. console.log("[SteamGroupBlocker] Waiting : "+delay+" ms before next step...");
  131. setTimeout(() => {ActionOnSteamID();}, delay);
  132. } else {
  133. NetErrorCount++;
  134. setTimeout(() => {ActionOnSteamID();}, minDelay);
  135. }
  136. }
  137. }
  138. });
  139. } else if (NextPageNum == 0) {
  140. EndOfScript();
  141. } else {
  142. GetGroupMembers();
  143. }
  144. }
  145. }
  146.  
  147.  
  148. function BlockBtnPressed(){
  149. if (HasBlockBtnBeenPressed) {
  150. console.warn("[SteamGroupBlocker] Button already pressed.");
  151. return;
  152. } else {
  153. HasBlockBtnBeenPressed = true;
  154. Action = "block";
  155. GetGroupMembers();
  156. }
  157. }
  158.  
  159.  
  160. function UnBlockBtnPressed(){
  161. if (HasBlockBtnBeenPressed) {
  162. console.warn("[SteamGroupBlocker] Button already pressed.");
  163. return;
  164. } else {
  165. HasBlockBtnBeenPressed = true;
  166. Action = "unblock";
  167. GetGroupMembers();
  168. }
  169. }
  170.  
  171. function DoGUI(){
  172. let BlockBtn = document.createElement('button');
  173. BlockBtn.className = ('btn_darkred_white_innerfade btn_medium');
  174. let BlockText = document.createElement('span');
  175. BlockText.append('BLOCK ALL USERS');
  176. BlockBtn.appendChild(BlockText);
  177. BlockBtn.addEventListener("click", BlockBtnPressed , false);
  178. document.querySelector("#searchEditForm > button").after(BlockBtn)
  179. let UnBlockBtn = document.createElement('button');
  180. UnBlockBtn.className = ('btn_darkblue_white_innerfade btn_medium');
  181. let UnBlockText = document.createElement('span');
  182. UnBlockText.append('UNBLOCK ALL USERS');
  183. UnBlockBtn.appendChild(UnBlockText);
  184. UnBlockBtn.addEventListener("click", UnBlockBtnPressed , false);
  185. BlockBtn.after(UnBlockBtn)
  186. }
  187.  
  188. function Init(){
  189. let regex = /https:\/\/steamcommunity\.com\/groups\/([^;]+)\/members/;
  190. GroupName = window.document.baseURI.match(regex)[1];
  191. console.log("[SteamGroupBlocker] GroupName : "+GroupName);
  192. if (g_steamID === false) {
  193. throw new Error("[SteamGroupBlocker] You need to be logged into steam.");
  194. return;
  195. }
  196. DoGUI();
  197. }
  198.  
  199. Init();