Have to share this, and happy holidays...
Best posts made by Ashen-Shugar
-
RE: Hey you motherfuckers.
@miss-demeanor said in Hey you motherfuckers.:
@ashen-shugar Yeah but... that person actually has a parachute! That
wuss. We jump in with big smiles and nothing else.It adds easier penetration when you land arse-naked on the sharpened spike at the bottom.
And yes. I speak of experience. It's my fifth time jumping in!
Sadly, doing the required Russian Kazatsky Dance once landed, is near impossible.
-
RE: Mux Logger Objects
@skew said in Mux Logger Objects:
@ashen-shugar I've literally never heard this before... Just to be clear, my repose code works by creating a new attribute (something like
d.time.poser-dbref
with the pose as the data) with each new pose, thenwipe()
s those attributes after X minutes. You're saying that, even though Iwipe()
, the hash key for each attribute will continue to grow? And@dbclean
will simply fix that up no problem?And for the record, Thenomain's poselogger logs in SQL, so no issue there. The other poselogger has each player create an object, which could potentially be a problem.
The hash will continue to grow for any new attribute name. If the attribute is always d.time.poser-#3 it'll not have to hash a new attribute, but yes, any new attribute hashed, if 'time' is the actual secs() would absolutely enter a new hash.
Do a @list hash on your MUX/TM3/Rhost game and pay close attention to the line:
Vattr stats: 25793 alloc, 37 free, 18392422 name lookups
The allocs are how many actual attribute hashes you have defined. That's unique user-defined attributes in your database. The larger that is, the more memory it will take up.
Each hashed attribute takes up a small number like 256 bytes. Almost laughable, until you get a million of them
@dbclean goes through and wacks any attribute that is not currently being seen as 'in use'.
In use is defined by any attribute currently set on something.
Make sure to @reboot after your @dbclean to free up the unused memory (since it's the only way to release the memory back to the OS)
-
RE: MU Flowchart
@faraday said in MU Flowchart:
Frankly I wouldn't steer anyone towards learning MUSHcode at this point. Learn Python (for Evennia) or Ruby (for AresMUSH, which I promise will be publicly available one of these days) and try your luck with one of the next-gen servers. I think you'll end up in a better place - and learn a language that might actually be useful in the real world.
... or use RhostMUSH's restful API and code in any language you want with liburl
-
RE: Comfort Food...
@cobaltasaurus said in Comfort Food...:
@ashen-shugar Oh my god, smoked string cheese is a thing?!
https://www.wisconsincheesemart.com/item/string-cheese-smoked-rpD/
-
RE: Fuck this guy
@Three-Eyed-Crow said in Fuck this guy:
Anybody familiar with MUSH of the Dead (http://mushofthedead.com/)?
I'd like to know if this particular brand of fuck is staffing on other games, or alternatively if he's incorrectly attaching himself to another game.
I've tagged his IP for watching on every game I admin on
-
RE: Reading the MUX dbm database with Python
I'm honestly not aware of the db writing in encrypted mode of any form, it should be a method of binary and/or compressed format.
If it's being compressed it's likely in ZLIB format of some sort.
Otherwise the binary structure can be found in db_rw.cpp.
Be careful with the open db as well, lots of mu* engines don't like having an external application actively reading the data while it's open.
I know that Brazil writes data in UTF8 and he has his own hash routine that does the hash tables in svdhash.cpp which is likely his indexer tree.
Anyway, all the reading of a db flatfile should be in db_rw.cpp, the hash in svdhash.cpp, and any object/attribute content handling in db.cpp and attrcache.cpp.
MUX's current github is at: https://github.com/brazilofmux/tinymux
Those will be the files of interest. Good luck.
-
RE: MU Flowchart
@faraday said in MU Flowchart:
@Thenomain Yeah, pretty much. My intermediate tutorial walks you through who, finger, and a simple roll. (It also does a multi-pager for some dumb reason that made sense, like, twelve years ago :P)
I also made a 'help coding' in the RhostMUSH help files that go through a fairly comprehensive overview of all the tools to start coding on a mush.
-
RE: Tea!
I'm a big coffee man. I roast my own coffee and all that jazz.
However, other than a good single malt scotch (cough) I'm also a big tea man. Wife loves tea as well.
I've recently started ordering from the whistling kettle (http://www.thewhistlingkettle.com/). They have mostly loose leaf tea, and it's fairly top notch.
My favorite teas to date are lessee....
Irish Breakfast
darjeeling 1st blush,
Aged Pu-erh (15+ years preferred). I like both raw and cooked, though cooked helps more with healing.
Lapsang Souchong
Aged Oolong (Prefer Blue Spring)
Earl Gray (I like the derivatives that have like various flower blossoms added)And some flavored White teas go great for ice teas. Have a nice leechee tea and some white chocolate tea (with actual cocoa nibs) that make excellent tea for the summer.
And that's about it for my favorites.
Green teas I'm hit or miss as they tend to be a bit too bitter for me.
-
Myrddin CRON - Fix for Possible Missed Trigger Events
Myrddin's Cron is more or less the defacto standard for crons, however, it has a failure possibility of missing a triggering event if the time it's meant to trigger the mush happens to be lagging or, for example, the server hosting has ntpd running and skews the time where the mush is advanced a period of time.
This will fix both of those issues and guarentee a per minute trigger, and the mush will play catchup in either case.
This will only work with a codebase that handles @wait/until
Please modify your myrddin cron with these entries:
@startup mushcron=@trigger me/cron=[secs()] &CRON mushcron=@break [!$v(0)]=@pemit/list #1 %#=Must start up [name(me)] by triggering the startup.;@trigger me/cronjobs=%0; @wait/until [add(%0,60)]={@trigger me/cron=[add(%0,60)]} &CRONJOBS mushcron=@dolist [setq(8,convsecs(%0))][setq(1,extract(%q8,2,1))][setq(2,extract(%q8,3,1))][setq(3,extract(%q8,1,1))][setq(4,extract(extract(%q8,4,1),1,1,:))][setq(5,extract(convsecs(%0),2,1,:))][lattr(me/cron_time_*)]={@switch and(or(member(extract([setq(0,v(##))]%q0,1,1,|),%q1),not(strlen(extract(%q0,1,1,|)))),or(member(extract(%q0,2,1,|),%q2), not(strlen(extract(%q0,2,1,|)))),or(member(extract(%q0,3,1,|),%q3),not(strlen(extract(%q0,3,1,|)))), or(member(extract(%q0,4,1,|),%q4), not(strlen(extract(%q0,4,1,|)))),or(member(extract(%q0,5,1,|),%q5),not(strlen(extract(%q0,5,1,|)))))=1,{@pemit #1=Triggering CRON_JOB_[extract(##,3,1,_)]; @trigger me/cron_job_[extract(##,3,1,_)]=[setq(t,%0)][last(%q0,|)]}}
-
RE: MU Flowchart
@Thenomain said in MU Flowchart:
Like I agreed, some permissions knowledge can be important.
As far as things like setting everything wizard, there is a benefit to learning things the hard way. It is far less dangerous to make this mistake now than you used to. My goal is more similar to @faraday or @Ashen-Shugar; get people willing to make the damn game.
Because people should be able to make the damn game without waiting around for one of us.
People, learn just enough code to make huge mistakes.
Then make your damn game
+1 here.
Seriously. If you're waiting for us old timers to come riding in to save the day you're going to wait a very long time because frankly the old timers don't really have much time to do that riding, our horses are tired (or dead) or we're already in another town 'saving the day'.
So make your game, and as Theno mentioned don't worry about making mistakes. Make them. There's really nothing you can do to a mush that isn't recoverable or reverseable so have fun, and just do it. The coders can engage in your game at any given time.
-
RE: Christmas...
@TwoGunBob said in Christmas...:
@Ashen-Shugar It was not a decision made lightly for certain. As much as I wanted anything BUT the VT-01 at the time it was cherished. I had a similar situation with all my model kits when I was 17. Went to work on a Saturday, came home to find them all smashed to pieces and the family response was to get over it, kids will be kids. Besides the money spent on all these Japanese import model kits, the time put into assembly and painting was ridiculous. I mean, my painting was pretty mediocre then (as it is now) but it was still time invested. It was probably close to ten years before I started painting anything again because I was so upset over the incident.
This was one of the few that were not broken that I salvaged out of the sandbox.
Pity it was one of my favorites...
-
RE: Fallout/Wasteland existing code/snippets.
@Thenomain said in Fallout/Wasteland existing code/snippets.:
@Grindle
A++, would upvote again. Thanks for tracking this down.
Minor warning to other softcoders: This is PennMUSH code, and I haven't gone through to see what might be incompatible with TinyMUX (possibly) or Rhost (unlikely). Always validate code for your game before installing.
Just did a quick eyeball, it should mostly work out of the box with Rhost, the only things that'd have to be changed are:
@nspemit -> @pemit (Rhost's @pemit by default does spoofing for wiz and higher)
table() -> columns()
haspower(guest) -> hasflag(guest)The rest looked fine.
-
RE: MU Flowchart
@Misadventure said in MU Flowchart:
@Thenomain said in MU Flowchart:
@faraday said in MU Flowchart:
@Ashen-Shugar When I have some spare ponies I should look at that.
It always comes back to ponies, doesn't it.
It does if you know whats good for you.
-
RE: The Crafting Thread
@surreality said in The Crafting Thread:
@Ashen-Shugar said in The Crafting Thread:
Guess it's not overly crafty, but I write poetry and roast coffee.
This is relevant to my interests. Tell us more!
Also, the hats are gorgeous!
My wife's been doing this for years and years. She's slowly working on setting up a site where you can purchase designer top hats made to order. Each one takes between 16-30 hours of work depending on the materials and 'gadgets' and the prices tend to run from $120 to $500 or more again, depending on the materials, 'gadgets' and amount of time to design them.
Right now she takes email orders
@surreality said in The Crafting Thread:
@Ashen-Shugar said in The Crafting Thread:
Guess it's not overly crafty, but I write poetry and roast coffee.
This is relevant to my interests. Tell us more!
Also, the hats are gorgeous!
Uh, yeah. Where can I get some Ashen Coffee?
laugh I just have a small roaster, but I tend to collect green coffee and stockpile it. Green coffee, if stored properly, can last for near 30 years in a controlled condition, compared to roasted which lasts 6-8 weeks.
I currently have about 200 pounds of green coffee, of various varieties. My favoriate to date is Yergicheffee Single Origin, Sumatra Wahana, and Geisha Esmeralda.
I haven't bothered to try roasting Jamacian Blue or Kona, as frankly the green beans are too expensive for what it is.
For comparison:
Yergicheffe: Green $8/lb ... Roasted $22/lb
Sumatra Wahana: Green $6.5/lb ... Roasted $36/lb
Kona: Green $28/lb ... Roasted $40/lb
Jamacian Blue: Green $24/lb ... Roasted $45/lb
Geisha Esmeralda: $26/lb ... Roasted: $190/lb (that's not a typo)The green is what you can buy it for, and the roasted is the average prices of that brand roasted.
I literally paid for my roaster in my first 3 months of using it.
As for 'Ash coffee'... er... I've been known to gift people with it at Christmas here and there.
I roasted 2 lbs of it for my mom's funeral, since the Sumatra Wahana was her favorite coffee of all time and she drunk it for 15 years when I introduced her to it. Always sent her coffee every few months. Got my mom to giggle like a school girl while receiving it. She sadly passed away two weeks ago, and it's been hard for me. Of everyone in the family, she (other than my wife) was the only one to 'get me'. My brother was a dick and told me of mom's passing away an hour after she passed away, and failed to notify me of the several days that she was hospitalized for... and I live only 40 miles from where she was. The reason for his not calling me about her being hospitalized? 'Well, you never call me, so it's your fault I didn't call you'. Yes, my brother is a gaslighting narcissist.
I was... not happy. I am still... not happy. I likely will remain... not happy with my brother for ... most likely forever.
So I drink Sumatra in remembrance of better times, and always toast my Mom on the first sip.
Oh well, such is life. Sorry for ranting, I'm still raw over it.
-
RE: Dreams to Reality
@Griatch said in Dreams to Reality:
Thanks for the elaboration!
My pleasure
So to translate to terms I'm more familiar with, you will offer one sequential in-process call (which is blocking I presume) and also one asynchronous version involving a call to python running in a subprocess (or even launching a new python instance per call?) with a callback for whenever it returns. Sounds good!
As far as I'm aware, that's what the plan is. The async will essentially run a separate thread for each python call, so each async call runs its own sandboxed process.
Eventually what I would love to do with this as well is once we got the environment set up to be able to work with Evennia and exchange python modules so that we could literally swap them on the fly between our codebases like plugins.
But that's the distant future.
-
RE: Meanest (But Funniest) Thing You've Done in a Game
One of my favorites was playing a senile mage called 'Frump'.
He was actually a deity with severe dementia, but had a skill bind that required him to not knowingly hurt anything alive by direct or indirect means.
The fun part of this character? Whatever he would imagine (in his dementia-spurred brain) would become a reality.
It would not be uncommon to have him walk over a pit and just stand in mid air.
The general commentary would be something like:
Party Member: Frump, um... careful of that pit?
Frump: head scratches what pit?
Party member: The pit you're currently hovering over?
Frump: *stamps foot down, you hear a dull 'thump' I'm standing on the ground.
Party member: No, it's a pit.
Frump: just blinks like player is stupid nooo, I would know if I was hoveringSecond party member comes over to Frump, walks up to him and immediately falls into the pit shouting in agony
Frump: Hey! I"m standing over a pit! (immediately falls into the pit)
hear a whump, and someone dusting himself off
Frump: At least the pit didn't have any traps like spikes in it.
Party Member: Actually the pit... [muffled]is immediately silenced by the other party members
Yes. The pit did have spikes.
The beauty of this? The party members started to realize that Frump on the odd occasion could twist reality to make what he believed to be real, well, real.
So someone picks up a rock, walks up to Frump and says 'Hey, isn't this the most BEAUTIFUL diamond you have ever seen?'
And well, sometimes Frump will agree, it's a beautiful diamond. Other times he's wondering why you're holding the most deadly spider in the world in your palm.
There's just no telling with good ol' Frump...
-
RE: Hello MSBites! Grade your administrators.
@thatguythere said in Hello MSBites! Grade your administrators.:
@ashen-shugar
In your post you seem to imply that "catty, cliquish, and thrive on negativity" doesn't go along with holding a professional job. If you think that is the case you really need to work in more offices or be very grateful for the ones you have worked in.Sure it does. But most highly professional jobs don't have this as HR tend to go down on them like a ton of bricks.
And again, stop with the assuming.
-
RE: Dreams to Reality
@Chime said in Dreams to Reality:
It's very pretty-- but it's a perfect example of what I was trying to avoid. I've been a UNIX person since 1995. I really do want just bare autoconf so that I can automate and do CI testing more easily.
Well, that's the brilliant part of it. It makes a dynamic file called 'custom.defs' in the src directory that has the Makefile variables. So you could use CLI and generate it in a batch or on the fly just fine. The menu is just an interface to generate the custom.defs file, that's it.
Unix guy here since 1985 (AT&T SYS3/SYSV on a 3B2), so I am all for the mighty CLI
That said-- it is really nice to have all of those configurable features. Ideally they should become config options in the game conf file rather than compile-time features, but I understand quite well how big a pain that is.
Yup, we have a ton of customizations that way. All the mysql is in a rhost_mysql.conf, again, the Makefile menu interfaces with it.
The only compile times are those that make huge differences in the code itself, and again is just populated as DEFS's in the custom.defs file. So entirely CLI capable with batch processing. Yay is the UNIX.
Admittedly, a lot of my customizations to MUX were to remove a lot of #ifdefs for obsolete crap.
Take your MUX inc()/dec() option. What's the harm in having that always enabled?
Yea, some of these things we likely will re-visit to change from compile time to just conf parameters, most of it however was due to speed/performance considerations at the time.
[X] 26. SHA512 Passwords
I hope those are still salted?
Absolutely. 10 character randomized seeding per password encryption.
No rainbow table decryption for our baby -
RE: What to do when your mush is attacked
I noticed I never covered how to actually find the twinks, so I'm covering that here, since the post would be over 32,000 characters otherwise.
-----------------------------------------------------------------------------------------------------------------
How to go about finding the twinkOk, I just realized I never had anything covered on how to actually run down and discover the twink that's attacking you.
Let's assume the IP of the person attacking you is 172.217.4.36. For those curious, that's an IP for www.google.com. Now, you are likely curious how to go about tracing this person down and block as much as you can. So, first, let's go for the obvious.
How do I know that IP is google?
Easy, I did a reverse lookup on the IP.$ dig -x 172.217.4.36 ; <<>> DiG 9.9.10-P2 <<>> -x 172.217.4.36 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56859 ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;36.4.217.172.in-addr.arpa. IN PTR ;; ANSWER SECTION: 36.4.217.172.in-addr.arpa. 21599 IN PTR lga15s46-in-f4.1e100.net. 36.4.217.172.in-addr.arpa. 21599 IN PTR ord38s18-in-f4.1e100.net. 36.4.217.172.in-addr.arpa. 21599 IN PTR lga15s46-in-f36.1e100.net. 36.4.217.172.in-addr.arpa. 21599 IN PTR ord38s18-in-f4.1e100.net. 36.4.217.172.in-addr.arpa. 21599 IN PTR lga15s46-in-f4.1e100.net. 36.4.217.172.in-addr.arpa. 21599 IN PTR lga15s46-in-f36.1e100.net. ;; Query time: 56 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Mon Dec 04 11:50:45 CST 2017 ;; MSG SIZE rcvd: 193
NOTE online web based dig can be found at https://www.digwebinterface.com/
Make sure to select 'Reverse' as the option you want.Hum, DNS shows corporate, but let's see if we can find anything more about it...
$ nslookup 172.217.4.36 Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: 36.4.217.172.in-addr.arpa name = lga15s46-in-f4.1e100.net. 36.4.217.172.in-addr.arpa name = ord38s18-in-f4.1e100.net. 36.4.217.172.in-addr.arpa name = lga15s46-in-f36.1e100.net. 36.4.217.172.in-addr.arpa name = lga15s46-in-f36.1e100.net. 36.4.217.172.in-addr.arpa name = lga15s46-in-f4.1e100.net. 36.4.217.172.in-addr.arpa name = ord38s18-in-f4.1e100.net. Authoritative answers can be found from:
NOTE For the online web interface for nslookup try https://centralops.net/co/
Nope, nothing much more, but that's ok...1e100.net, if you're used to google will recognize that right off the bat, but if you are not, you can dig further...
$ whois 172.217.4.36 # # ARIN WHOIS data and services are subject to the Terms of Use # available at: https://www.arin.net/whois_tou.html # # If you see inaccuracies in the results, please report at # https://www.arin.net/public/whoisinaccuracy/index.xhtml # # # The following results may also be obtained via: # https://whois.arin.net/rest/nets;q=172.217.4.36?showDetails=true&showARIN=false&showNonArinTopLevelNet=false&ext=netref2 # NetRange: 172.217.0.0 - 172.217.255.255 CIDR: 172.217.0.0/16 NetName: GOOGLE NetHandle: NET-172-217-0-0-1 Parent: NET172 (NET-172-0-0-0-0) NetType: Direct Allocation OriginAS: AS15169 Organization: Google LLC (GOGL) RegDate: 2012-04-16 Updated: 2012-04-16 Ref: https://whois.arin.net/rest/net/NET-172-217-0-0-1 OrgName: Google LLC OrgId: GOGL Address: 1600 Amphitheatre Parkway City: Mountain View StateProv: CA PostalCode: 94043 Country: US RegDate: 2000-03-30 Updated: 2017-10-16 Ref: https://whois.arin.net/rest/org/GOGL OrgTechHandle: ZG39-ARIN OrgTechName: Google LLC OrgTechPhone: +1-650-253-0000 OrgTechEmail: arin-contact@google.com OrgTechRef: https://whois.arin.net/rest/poc/ZG39-ARIN OrgAbuseHandle: ABUSE5250-ARIN OrgAbuseName: Abuse OrgAbusePhone: +1-650-253-0000 OrgAbuseEmail: network-abuse@google.com OrgAbuseRef: https://whois.arin.net/rest/poc/ABUSE5250-ARIN # # ARIN WHOIS data and services are subject to the Terms of Use # available at: https://www.arin.net/whois_tou.html # # If you see inaccuracies in the results, please report at # https://www.arin.net/public/whoisinaccuracy/index.xhtml #
NOTE For online whois, use http://ping.eu/ns-whois/ ... make sure to click 'full info'.
Therreeeeee we go. Notice the OrgTechName ... 'Google LLC' Yup, that's Google!
Now, let's assume this is an IP that you want to absolutely, beyond all measure block.
You have a few things you can do.First, you can try the *.1e100.net that came from the nslookup. That should work for the RDNS blocking checks.
@sitelock *.1e100.net=!connect @admin forbid_host=*.1e100.net
Second, you can look above from the whois output above for a section similar to the CIDR or NetRange at the start. That, my good friends, is the subnet that this person is coming from. If you block that entire subnet, you have just nailed down their entire ISP subnet that they use. Bam, gone!. Keep in mind, other users may also use this ISP, so you may want to verify anyone currently using them first.
Ways you can check on your mush
@search eplayer=match(get(##/lastsite),*.1e100.net) @search eplayer=match(get(##/lastip),172.217.4.*)
Ok, so no one else uses that IP, it's free to block.
@admin forbid_site=172.217.0.0 /16
And done.
Now, you ask what if they're using a proxy?
Good question. There's no easy solution to that, but one thing you can do is find out what proxy group they're using, then manually go through and add every IP from that site. How do you find it?
Believe it or not, it's fairly easy.Google search for the IP, again, we're assuming 172.217.4.36 is the attacker.
So now you would google search for:172.217.4.36 proxy
The first one or two pages of google's search will identify public proxies (if they exist) that host that IP address. So it's your job at this point to go to those proxy sites, grab the ENTIRE list of IP addresses, and then add them to your forbid_site lists. It's painful, it's long, but as I stated earlier, blocking people who use proxies is a war of attrition. Your job is to make finding new proxies harder for them than it is for you to block. And honestly cutting and pasting the entire list of IP's from these proxy sites is not that difficult.
The only pain is before you know it, you're hitting 30,000 or more IP's blocked, but such is life.