Author | Message | Time |
---|---|---|
laurion | I looked all over this forum for about ~2 hours last night. I tried alll the code, and I did everything to make it work. I really need to know how to create an effective anti flood method, I looked all night last night searching for one!! (The requireddelay by Adron did not work, it always returned an extremely large number (or very small one..)). | March 25, 2005, 3:05 PM |
Adron | [quote author=laurion link=topic=11042.msg105512#msg105512 date=1111763119] I looked all over this forum for about ~2 hours last night. I tried alll the code, and I did everything to make it work. I really need to know how to create an effective anti flood method, I looked all night last night searching for one!! (The requireddelay by Adron did not work, it always returned an extremely large number (or very small one..)). [/quote] It should be a number in milliseconds. Those tend to be very large... | March 25, 2005, 3:34 PM |
laurion | Too large for the timer. I'm using VB 6 by the way | March 25, 2005, 3:44 PM |
Spht | [quote author=laurion link=topic=11042.msg105518#msg105518 date=1111765449] Too large for the timer. I'm using VB 6 by the way [/quote] Maybe it's not the actual time to wait, but instead the time when it wants you to send the message, which could be a significantly larger number. What's too large? More than 1 minute? I think with Blizzard's new flood protection scheme, there are some times when you are required to wait more than a minute before sending something else would be safe. | March 25, 2005, 3:50 PM |
laurion | Ok I tried doing [code] Public Sub Send(Text As String) frmMain.Text3.Text = Text Dim delay As Double delay = (((Len(Text) * 15 + 1700) / 1000) + 1) * 1000 SetTimer frmMain.hWnd, &H0, delay, SendProc End Sub Public Function SendProc() If frmMain.Text3.Text = "" Then Exit Function With PBuffer .InsertNTString frmMain.Text3.Text .SendPacket &HE End With If Left(Text, 1) = "/" Then RTBAdd Text3.Text & vbNewLine, vbTeal Else RTBAdd "<", vbWhite, MyName, vbCyan, "> " & frmMain.Text3.Text & vbNewLine, vbWhite End If End Function [/code] But it seemed to have No effect on the delay of what I was sending. I got that delay thing from a post from Noodlez. And Spht, I dont really understand what you mean.. edit: besides didnt some1 say that Adron's VB anti flood is outdated and will no longer work, it is missing one part? | March 25, 2005, 4:06 PM |
Networks | [quote author=laurion link=topic=11042.msg105512#msg105512 date=1111763119] I looked all over this forum for about ~2 hours last night. I tried alll the code, and I did everything to make it work. I really need to know how to create an effective anti flood method, I looked all night last night searching for one!! (The requireddelay by Adron did not work, it always returned an extremely large number (or very small one..)). [/quote] This is much of the problem nowadays in bot development. Many users are simply searching for code that works or code they can modify. Why not create code that works on your own? Many the things you search now are out of phase and simply will not work perfectly. I can understand you using whatever you find as a reference, I mean why reinvent the wheel? The information you may have found can probably give you insight for what you need to do. Perhaps modifying code isn't enough anymore, I think people should actually try to invent something on their own with information they find here. The time you probably took to search for something that works is wasted time you could've used to create something new and effective that you would've understood. If you want to create an effective method, do it. | March 25, 2005, 5:11 PM |
laurion | I don't know how to go about doing that.. +1 to networks though, you are right, that is correct. and I know I probably need to learn more VB before i try to write an anti flood. yea thats prob the problem | March 25, 2005, 5:29 PM |
Kp | IIRC, the current anti-flood rules are not publicly posted. The code available on the forum is close, but won't cover you reliably. | March 25, 2005, 7:31 PM |
iago | Well, this may not answer your question, but you can have a look at my (Java) code if you want. I designed it to be easy to understand, so maybe you can learn enough to implement it on your own (it should be obvious what I'm doing). I actually designed the algorithm myself, based on what I thought Adron's was doing (although I never really understood Adron's). http://www.javaop.com/javaop2/src/AntiFlood/src/PluginMain.java Look at the getDelay() function. If you want to get ideas from that, let me know if there's anything you don't understand. | March 25, 2005, 7:58 PM |
laurion | [quote author=iago link=topic=11042.msg105558#msg105558 date=1111780712] Well, this may not answer your question, but you can have a look at my (Java) code if you want. I designed it to be easy to understand, so maybe you can learn enough to implement it on your own (it should be obvious what I'm doing). I actually designed the algorithm myself, based on what I thought Adron's was doing (although I never really understood Adron's). http://www.javaop.com/javaop2/src/AntiFlood/src/PluginMain.java Look at the getDelay() function. If you want to get ideas from that, let me know if there's anything you don't understand. [/quote] thanks for offering to help but I know no Java lol. But hey, you have SentPackets in there..is that the new part of the aglithorim? :-X | March 25, 2005, 8:11 PM |
Quarantine | It's pretty straight forward to port that. | March 25, 2005, 8:45 PM |
iago | [quote author=laurion link=topic=11042.msg105559#msg105559 date=1111781508] [quote author=iago link=topic=11042.msg105558#msg105558 date=1111780712] Well, this may not answer your question, but you can have a look at my (Java) code if you want. I designed it to be easy to understand, so maybe you can learn enough to implement it on your own (it should be obvious what I'm doing). I actually designed the algorithm myself, based on what I thought Adron's was doing (although I never really understood Adron's). http://www.javaop.com/javaop2/src/AntiFlood/src/PluginMain.java Look at the getDelay() function. If you want to get ideas from that, let me know if there's anything you don't understand. [/quote] thanks for offering to help but I know no Java lol. But hey, you have SentPackets in there..is that the new part of the aglithorim? :-X [/quote] There is no "the algorithm" -- it varies depending on who wrote it. This is just MY implementation, which is based (loosely) on Adron's. I base it on 2 factors: the number of packets recently sent and the total number of bytes recently sent. The function you need is very straight forward. Here is a stripped down version with some comments I added for you: [code] public long getDelay(String text, Object data) { // Increment the number of sent bytes by the length of the text sentBytes += text.length(); // Increment the number of packets sentPackets++; long requiredDelay = 0; // Find the required delay requiredDelay += perByte * sentBytes; requiredDelay += perPacket * sentPackets; // If we've waited long enough (the packet should be sent out immediately), then reset everything if(firstMessage + requiredDelay + totalDelay < System.currentTimeMillis()) { firstMessage = System.currentTimeMillis(); requiredDelay = 0; sentBytes = text.length(); sentPackets = 1; totalDelay = requiredDelay; return 0; } // Increase the total delay totalDelay += requiredDelay; // Find out what time in the future to send it (based on the current time) long timeSinceFirst = System.currentTimeMillis() - firstMessage; // Return the amount of time we need to wait return requiredDelay - timeSinceFirst + totalDelay; } [/code] | March 25, 2005, 8:59 PM |
Adron | What's missing in iago's compared to mine is that if you don't send anything for a while, you gain some "credits" that you can use to send several messages in a row later. But then, all that is the old flood protection algorithm. | March 25, 2005, 9:24 PM |
iago | [quote author=Adron link=topic=11042.msg105571#msg105571 date=1111785853] What's missing in iago's compared to mine is that if you don't send anything for a while, you gain some "credits" that you can use to send several messages in a row later. But then, all that is the old flood protection algorithm. [/quote] That's the part of yours that confused me, so I didn't do it. :) Can you explain on a high level how you do that? Like, how long = how many tokens, type thing? | March 25, 2005, 9:25 PM |
Adron | [quote author=iago link=topic=11042.msg105573#msg105573 date=1111785950] That's the part of yours that confused me, so I didn't do it. :) Can you explain on a high level how you do that? Like, how long = how many tokens, type thing? [/quote] Hmm, let's see. I like to think of it like this: Every 10 milliseconds or so, you gain a credit, up to a maximum of 600 credits. When you send a message, you're charged a base amount of 200 credits plus an additional 1 credit per character in the message. If you don't have enough credits to send a message when you want to, you'll have to wait until you do. The numbers are just approximates, I think I had more exact values for them. | March 25, 2005, 9:36 PM |
iago | Ah, cool. I am kind of doing it the same way, except with no "600 point limit", just with being charged for each byte/packet. I'll have to look into your way :) | March 25, 2005, 9:58 PM |
laurion | how bout that anti-flood -.- | March 26, 2005, 5:48 AM |
iago | [quote author=laurion link=topic=11042.msg105623#msg105623 date=1111816081] how bout that anti-flood -.- [/quote] Seems to me that there has been given more than enough information (from Adron and myself) to implement it yourself. I'm actually probably going to implement Adron's tomorrow. If I get it working well, I'll post it here :) | March 26, 2005, 6:29 AM |
Adron | [quote author=iago link=topic=11042.msg105624#msg105624 date=1111818594] Seems to me that there has been given more than enough information (from Adron and myself) to implement it yourself. I'm actually probably going to implement Adron's tomorrow. If I get it working well, I'll post it here :) [/quote] Remember that they added a new level of flood protection though. Mine is valid for a low number of messages, up to say .. 30? If you keep sending messages you'll run into the next level flood protection. | March 26, 2005, 1:02 PM |
Soul Taker | [quote author=Adron link=topic=11042.msg105626#msg105626 date=1111842169] [quote author=iago link=topic=11042.msg105624#msg105624 date=1111818594] Seems to me that there has been given more than enough information (from Adron and myself) to implement it yourself. I'm actually probably going to implement Adron's tomorrow. If I get it working well, I'll post it here :) [/quote] Remember that they added a new level of flood protection though. Mine is valid for a low number of messages, up to say .. 30? If you keep sending messages you'll run into the next level flood protection. [/quote] I think your messages have to be over 67 bytes for that though? Unsure, but I have stuff in place just in case, since it's never come up for me. | March 26, 2005, 1:09 PM |
iago | I took a stab at implementing Adron's algorithm. This is a fairly stripped down version of the class: [code] private long lastSent = System.currentTimeMillis(); private int credits; ..... public void activate() { credits = Integer.parseInt(out.getLocalSettingDefault(getName(), "starting credits", "200")); } ...... public Properties getSettingsDescription() { Properties p = new Properties(); p.put("debug", "This will show the current delay and the current number of credits each message, in case you want to find-tune it."); p.put("prevent flooding", "It's a very bad idea to turn this off -- if you do, it won't try to stop you from flooding."); p.put("cost - packet", "This is the amount of credits 'paid' for each sent packet."); p.put("cost - byte", "WARNING: I don't recommend changing ANY of the settings for anti-flood. But if you want to tweak, you can. This is the number of credits 'paid' for each byte."); p.put("cost - byte over threshold", "This is the amount of credits 'paid' for each byte after the threshold is reached."); p.put("starting credits", "This is the number of credits you start with."); p.put("threshold bytes", "This is the length of a message that triggers the treshold (extra delay)."); p.put("max credits", "This is the maximum number of credits that the bot can have."); p.put("credit rate", "This is the amount of time (in milliseconds) it takes to earn one credit."); return p; } public Properties getDefaultSettingValues() { Properties p = new Properties(); p.put("debug", "false"); p.put("prevent flooding", "true"); p.put("cost - packet", "200"); p.put("cost - byte", "12"); p.put("cost - byte over threshold", "20"); p.put("starting credits", "200"); p.put("threshold bytes", "65"); p.put("max credits", "600"); p.put("credit rate", "10"); return p; } ........ public long getDelay(String text, Object data) { if(out.getLocalSettingDefault(getName(), "prevent flooding", "true").equals("false")) return 0; boolean debug = Boolean.parseBoolean(out.getLocalSettingDefault(getName(), "debug", "false")); int packetCost = Integer.parseInt(out.getLocalSettingDefault(getName(), "cost - packet", "200")); int byteCost = Integer.parseInt(out.getLocalSettingDefault(getName(), "cost - byte", "12")); int byteOverThresholdCost = Integer.parseInt(out.getLocalSettingDefault(getName(), "cost - byte over threshold", "20")); int thresholdBytes = Integer.parseInt(out.getLocalSettingDefault(getName(), "threshold bytes", "65")); int maxCredits = Integer.parseInt(out.getLocalSettingDefault(getName(), "max credits", "600")); int creditRate = Integer.parseInt(out.getLocalSettingDefault(getName(), "credit rate", "10")); // Add the credits for the elapsed time if(credits < maxCredits) { credits += (System.currentTimeMillis() - lastSent) / creditRate; if(credits > maxCredits) { if(debug) out.systemMessage(DEBUG, "Maximum anti-flood credits reached (" + maxCredits + ")"); credits = maxCredits; } } lastSent = System.currentTimeMillis(); // Get the packet's "cost" int thisByteDelay = byteCost; if(text.length() > thresholdBytes) byteCost = byteOverThresholdCost; int thisPacketCost = packetCost + (thisByteDelay * text.length()); if(debug) out.systemMessage(DEBUG, "Cost for this packet = " + thisPacketCost); // Check how long this packet will have to wait int requiredDelay = 0; // If we can't "afford" the packet, figure out how much time we'll have to wait if(thisPacketCost > credits) requiredDelay = (thisPacketCost - credits) * thisByteDelay; // Deduct this packet from the credits credits -= thisPacketCost; if(debug) out.systemMessage(DEBUG, "Remaining credits: " + credits + "; Delay: " + requiredDelay); System.out.println(requiredDelay); return requiredDelay; } [/code] So far, it seems to be working pretty good. I sent 250 packets of each of a variety of lengths, and it seemed to hold up (after tweaking the perByte time to 12 instead of 10). And it's much faster than my old implementation :) | April 7, 2005, 4:54 PM |
Networks | [code] Option Explicit 'Original class created by iago 'Ported to VB6 by Networks ' 'http://www.zeroforce.net 'http://www.x86labs.org Private Declare Function GetTickCount Lib "kernel32.dll" () As Long Private lastSent As Long Private Credits As Long Private byteCost As Integer Private Const packetCost As Integer = 200 Private Const byteOverThresholdCost As Integer = 20 Private Const thresholdBytes As Integer = 65 Private Const maxCredits As Integer = 600 Private Const creditRate As Integer = 10 Private Sub Class_Initialize() Credits = 200 byteCost = 12 lastSent = GetTickCount() End Sub Public Function getDelay(ByVal strText As String) As Long 'Add credits for elasped time If (Credits < maxCredits) Then Credits = Credits + ((GetTickCount() - lastSent) / creditRate) If (Credits > maxCredits) Then 'Maximum anti-flood credits reached Credits = maxCredits End If End If lastSent = GetTickCount() 'Get the packet's "cost" Dim thisByteDelay As Integer thisByteDelay = byteCost If (Len(strText) > thresholdBytes) Then byteCost = byteOverThresholdCost End If Dim thisPacketCost As Integer thisPacketCost = packetCost + (thisByteDelay * Len(strText)) 'Check how long this packet will have to wait Dim requiredDelay As Long requiredDelay = 0 'If we can't "afford" the packet, figure out how much time we'll have to wait If (thisPacketCost > Credits) Then requiredDelay = (thisPacketCost - Credits) * thisByteDelay End If 'Deduct this packet from the credits Credits = Credits - thisPacketCost getDelay = requiredDelay End Function [/code] Ported to Visual Basic 6.0. Have fun kids. | April 8, 2005, 4:15 PM |
KkBlazekK | I was porting it for my bot then I fell asleep. :P | April 8, 2005, 4:30 PM |
laurion | Blaze, where is the perByte//BytesPerMS or w/e u wanna call it in that/? Using the one that you ported blaze, it does not work very well with repeated short messages. | April 9, 2005, 4:12 PM |