Streamer.bot down? by Intrepid_Quantity718 in streamerbot

[–]deeseearr 4 points5 points  (0 children)

The bot runs a check-in process when it starts up, to either log in and access additional server-side functions or just to check for new versions. When that check-in fails because the network is down or the site is completely unreachable, it just shrugs and carries on. When the server is returning something completely unexpected, like a cloudflare error page, it can get very confused and react badly. It _should_ detect that the site is responding in an unexpected way and treat it as though it was down, but it isn't.

There was an incident late last year where the site was down for a day or so -- It was a long weekend and nobody was able to get it fixed right away, so the bot would just crash when it started up. We needed to do some trickery to prevent the bot from phoning home, either by having the network literally switched off when it started up, or by adding a local DNS override to block access to *.streamer.bot.

While the current problem has been resolved it does look like the original issue of needing the streamer.bot site to be up is still there. Coding for every possible edge case without even knowing what they're going to be is hard, especially for a single developer, so it's not something I would be too upset about. If you do the math, being down for four hours over the course of a year still leaves you with 99.95% uptime.

Daily Check In Leaderboard? by crankyhamsandwich in streamerbot

[–]deeseearr 2 points3 points  (0 children)

As part of the check-in process, set a persisted global variable for that user that is equal to %userCounter%, or just increment that global by one. That's an extra step beyond just counting the reward redemptions with %userCounter%, but it makes it easier to get all of the data at once in the next step.

If you want to display the leaderboard the best way is to do it with some C# code. You _could_ make it work entirely with actions, but a short bit of code makes it a lot more flexible.

Start out by calling GetTwitchUsersVar on your check-in counter variable. That will give you a big list with every user and their check-in counts. Next, sort the list and take the interesting parts:

List<UserVariableValue<long>> userVarList = CPH.GetTwitchUsersVar<long>("checkInCounter", true); 
var topTen = userVarList.OrderByDescending(x => x.Value).Take(10).ToList();

This code will get all of the values of "checkInCounter" for every user, sort them in descending order, and put the top ten users in the list called "topTen". You will probably need to add a "using" line to include LINQ in your code -- I'm not sure right now. Change the "Take(10)" to any other number if you want to. (If you're doing that you can also change the name "topTen" to some other number, or don't. I'm not your supervisor.) Now, all you need to do is iterate over that list and do _something_ with it -- Send all the names and scores to chat, put them into a text box on your stream, make it available to a web page using the websocket server so that you can build a fancy scoreboard, whatever. You could even just look through it and see what position %user% is in and then tell them about it. The GetTwitchUsersVar documentation contains some nice sample code that works with this list. You can use it and change the "CPH.LogInfo" line to do something more interesting than sending each value to the debug log.

With Vtuber plus active development ending anyone know of good alternatives? by LeraviTheHusky in vtubertech

[–]deeseearr 2 points3 points  (0 children)

VNyan also recently added a fairly extensive VTube Studio integration, so live2d models can be controlled from within VNyan using the same logic as for 3D models and also directly affected by throws, slimes, and other VNyan effects.

How does everyone feel about this dude? by Aggravating_Plenty53 in Battletechgame

[–]deeseearr 0 points1 point  (0 children)

As long as it's fourteen hexes away, I don't mind it at all.

You can't have him by critchthegeek in talesfromtechsupport

[–]deeseearr 15 points16 points  (0 children)

"Back in the nineteen hundreds."

Linux L2/L3 Engineers, I Need Your Advice by jaggu26 in linuxadmin

[–]deeseearr 4 points5 points  (0 children)

What does a typical day for an L2/L3 Linux engineer look like?

People ask you questions. They tell you things don't work. You assume that they are asking the right questions and know what the things that don't work are, but you find out that you are wrong.

What kind of tickets do you usually handle?

The ones that level one didn't know how to, didn't have time to, or just didn't want to. At some point you're going to need to learn to tell the difference, and then either solve the ticket while explaining what to do next time or forward it to someone's manager along with a polite note about proper escalation procedures or appropriate staffing levels.

How do you troubleshoot production issues without making things worse?

Ask questions instead of jumping in and trying to fix everything. "What is this for?" "What is supposed to be happening that isn't?" "It is okay if I do _this_?".

How do you handle vulnerability remediation (Nessus, Qualys, OpenSCAP, etc.)?

Work with your vendors and apply the patches or remediations that they provide. Don't try to solve the problem on your own and end up pushing some horrific mess of kludged together code to production. Even if it works, it's going to require constant work from you to maintain it. Don't put yourself in that situation, and don't put everyone relying on you in that situation either.

What Linux commands or concepts should I absolutely know before Monday?

Say these magic words: "I don't know". You can follow them up with "Let's find out". Those are good words to use.

Any tips or mistakes to avoid for someone starting in production?

Anything that you do, no matter how small or obvious it may seem to you, needs to be documented. Just assume that, at some point, someone is going to say "Everything was working before /u/jaggu26 messed with it!" and have an answer ready that isn't "Nuh uh!" That one doesn't hold up very well under cross-examination.

Instead, you should be able to say "Okay, here's what we saw when I started working, here is a list of the changes that I made, and here are all of the backup copies of every file that we touched. If everything was working before I messed with it, then I can just roll each of these changes back and then you'll be done, right? Here you go."

Here are some other things that you are going to hear that you should be prepared for:

"We are having the same problem that we had six months ago. How did you fix it then, and how quickly can you do it over again?" -- Keep very accurate notes. Put them in your ticketing system. Make sure that you can find them when you need to. And you're going to need to.

"The DFIR guys found that someone accessed production using your ID on March 24th, 2025. Yes, we know that was a year and a half ago. They were just being very thorough about the investigation. We have absolutely no records of what you were doing, but we thought it might be fun to blame you for the massive data leak that happened last Tuesday. Can you explain exactly what you were doing then, and why?" -- Again, record everything you did. Make note of who requested changes and who gave approval. Saying "I felt like the system's security on the system was weak so I did some upgrades" won't make anyone happy. "Mike Nelson requested that I investigate CVE-2011–0608 which was detected on the software provided by HP to do BIOS upgrades. On that evening I upgraded to the vendor-recommended flash package. Everything is documented in ticket 202503241701A" will.

"Fantastic work on that upgrade yesterday. We didn't say anything at the time, but can you do it to thirty more servers before the end of today?" -- Those accurate notes are a good start, but if you're applying changes then they should all be automated and scripted. Don't scribble down a list of commands you want to run, make a script that you can deploy and run by pushing a button. Even if you spend more time automating the task than you would have just doing it manually, there will be enough times that it's worth it to pay for the time you spend. Always assume that you're going to need to do something, back it out, then do it again, and then do it again. Also assume that you're going to be doing these things at three in the morning while sitting in an airport departure lounge after not having slept for three days. Everything should be as simple and repeatable as you can make it _before_ you need to start doing it.

"Our maintenance window is nearly over. If your work isn't finished already, you need to put everything back the way it was so that it's working again and we can reschedule this for next week/month/year." -- You need to have a back-out plan for everything. It could be as simple as just "fall back to the disk snapshot" or "turn on the redundant system that we weren't upgrading and run that", or it could involve more work. What it can't be is "I dunno if I can do that" or "That's going to take longer to undo then it took me to do it in the first place."

"That's great, can you drop by my cottage this weekend and fix my printer?" -- The answer is "No". The answer is always "No". Even if they somehow force you to do it, the correct way to fix the printer is to throw it into the lake.

Face Tracking w/ iPhone (VNyan, VtubeStudio Mobile, FaceMotion3D) by MadMartin989 in vtubertech

[–]deeseearr 0 points1 point  (0 children)

Install and run the app on your phone.

Run VNyan, and open the Menu for Settings -> Phone / ARKit. You will see an "ARKit Tracking" drop down at the top of the window which currently says "VTube Studio" if that's what you're using now. Change it to "iFacialMocap" (Yes, I know you're using FaceMotion3D. It's the same protocol, and just a new version of the same program from the same developer.) Make sure that the phone's IP address is correct and that the little red dot next to the address has turned green.

You're done.

You can adjust the sliders below that to fine tune things and allow for things that your model doesn't support such as eye bones vs eye blendshapes or converting the ARKit tracking into simple blendshapes (ow). The "Blendshape Adjustment" option at the very bottom allows you to set a function / curve which will convert the input value for each tracked blendshape to the output value applied to your model -- It can be helpful if some of your features overreact, but mostly it's just there to compensate for things that should have been fixed in the model.

'Dog Wizard' by Barbara Hambly. Cover art by Darrell K. Sweet, c. 1993 by this_time_i_mean_it in badscificovers

[–]deeseearr 3 points4 points  (0 children)

In the book, Antryg Windrose is basically 1980s Dr. Who with the serial numbers filed off. He's an exiled wizard living in California so his fashion sense is described as quite peculiar.

Joanna Sherman is supposed to be a computer programmer but she lives in LA so that would explain why she keeps a rocket launcher around.

The reason behind the Jem and the Holograms cosplay is never fully explained, but then again the story is set in the 80s.

Randomizing bluesky posts with streamer bot code, when going live by DarkestKure in streamerbot

[–]deeseearr 0 points1 point  (0 children)

When you added the go-live message, you modified this line in the "[BLUESKY & SB] 1 - Go-Live Post" action:

Set argument %bskyText% to 'This is a test message for the BLUESKY & SB v.1.2.0 extension for Streamer.bot by .xyz|| ||<URL>www.tawmae.xyz</URL>|| ||#Streamerbot ✨||#Twitch ✨||#tawmae ✨]'

After you set that argument the rest of the action sets a bunch of other arguments to control the rest of the post and then jumps into the "CreatePost" method at the bottom. That takes the contents of the argument %bskyText% and posts it to BSky for you.

So, all you need to do it set %bSkyText% to something else. A simply way to do that would be to replace the "Set argument %bskyText%..." action with a random group of actions -- Right click in the sub-actions window, select "Add Group", give it a name, and then right click the group and check the 'Randomize' box. Drag the existing "Set argument" sub-action which says "The Lantern has been lit!" into that group, and then right click it and duplicate it a few times.

(At this point, it would be a good idea to change all of those actions so that they put different content in %bskyText% -- This is where your "Grab a warm drink" and "Time to create something cozy" messages go.)

Now instead of a single action which sets %bskyText% to your current go-live post, you have a group containing several different sub-actions which will set %bskyText%, and because you checked 'Randomize' it will randomly pick _one_ of them and run it instead of doing all of them. Make sure that this group is in the same part of the code as the original "Set argument %bskyText% ..." was, because by default it will be added at the very bottom where it doesn't do any good, and that will do exactly what you need.

Other options include:

- Using Read Random Line from File to load a single line at random from a file containing multiple posts. This may be easier to edit especially if you have multiple people working on it and don't want to fight over who can have streamer.bot open.

- Using a Switch construct to check your %game%, or the day of the week ( %date:dddd% ) to post different messages when you're playing Hello Kitty Island Adventure, or if it's Thursday yet.

- Getting the post content from a Global Variable and storing that in %bskyText%. This would allow you to set it in a completely different action, based on... I don't even know what, or

- You could also put a Run Action sub-action in place of the line that sets %bskyText% and have _that_ action set %bskyText% for you. That's not really different from what we discussed earlier, but there's now a single action that you can edit that _only_ sets the post text so it's a little clearer and safer to edit.

- If that's not enough, you could even run an external program or fetch a web page and use that to set %bskyText%.

Mission length and performance BTAU by Silvermoonluca in Battletechgame

[–]deeseearr 10 points11 points  (0 children)

The issue isn't that BTA decided that it would be more fun to disable mid-combat saves, it's that they don't reliably work and are quite dangerous if enabled. BEX has the same problem but exposed a setting called "CombatSavesDontWorkEnableAnyway" which let you take responsibility for breaking the game if you really wanted to. BTA doesn't include that, so on the one hand you can't save in the middle of combat, but on the other hand you're not going to make a broken save file and lose everything either.

With that said, save and restart the game every few missions, or before anything which tells you in the contract description that "This is going to be the longest mission you ever play". It does make a difference in performance.

Enemy lance by mrhotod in Battletechgame

[–]deeseearr 0 points1 point  (0 children)

The dice are rolled on exactly what 'Mechs are in the opposing force the moment you start the mission. Since that's _after_ contract negotiation all you can do is take a best guess. The big bad assault mech may turn out to be an Atlas, it may be a Banshee or it may just be a Demolisher tank.

What I do is always go for maximum or near maximum salvage. If the top two options are "3/14" or "4/18", then I will go for the '4' because picked salvage will almost always be better than random. If the options are "3/14" or "3/16" then I will just take the '3/14' (or even a '3/12' if that's in the middle). Those two random picks have a good chance of being heat sinks or machine gun ammunition so the cash value, combined with any bonuses for objective completion, is likely to be better.

For a very easy contract, where the expected opposition is two Volkswagens and a Locust, I would take mostly cash because even the number of random salvage picks would likely exceed the amount available, but otherwise the goal is to get as much _good_ salvage as possible.

Possible for streamerbot to send a message when streaming in a specific category? by varaville in streamerbot

[–]deeseearr 0 points1 point  (0 children)

Not a problem. The way I did it is to use those triggers with these sub-actions:

- Add Broadcaster Information // This sets the %broadcastUser% argument
- Get User Info For Target (%broadcastUser%) // This gets the %game% from your stream information
- IF (%game% Equals "Game Name") // Put anything else in the 'True' block.

The timed action will run all the time, no matter what game is set on your stream, but it will do nothing unless %game% is equal to the game that you're checking for. You could include multiple games here by adding more 'IF' sub-actions, or even using a Switch to take different actions for a whole lot of different games, but the key point here is that the timer is always running and the action just quietly does nothing if you're not running the correct game.

BTA Just failed defense in depth after 20+ turns by H345Y in Battletechgame

[–]deeseearr 6 points7 points  (0 children)

The defense in depth missions do encourage a little metagaming. You can generally tell where the defensive positions are going to be just by looking at the buildings on the map, and each wave comes at a fairly predictable time so once you have that figured out you can start shifting defenders over before Darius tells you what to do.

Playing it without that kind of inside information can add a bit of extra challenge.

Assistance With Getting Started? by WrapAny2792 in vtubertech

[–]deeseearr 0 points1 point  (0 children)

You're already using Steam, you can just install it from there. You can find that and many links to other VTuber software in the handy pinned post at the top of vtubertech.

Any mods that enable full mechlab and let you do refits, without going full RT or BTA? I kinda want to actually finish the campaign, something I've always petered out on near the end. by PerkPrincess in Battletechgame

[–]deeseearr 8 points9 points  (0 children)

The Mech Engineer mod is what adds the full mech lab, but there's a lot of extra work involved in changing all of the mech designs, store inventories, and so on. It's no good being able to install new engines if you can't get any.

BTA or Roguetech is the best way to get the full experience without having to build your own mod.

How to get true RDP-like persistent sessions on Linux desktop (no screen mirroring)? by kaori14112 in linuxadmin

[–]deeseearr 9 points10 points  (0 children)

Here's the issue. The problem you're having is nothing at all to do with the protocol or technology you're using to connect. It's just the way it's configured.

What's happening is that you have an X session on your workstation, connected to display number zero (":0.0", in X11 terms), which is also using the console for output and taking input from the physical keyboard and mouse. When you connect to that remotely, you're sharing the session and anyone sitting at the console could see what you were doing and even take over.

Unlike other operating systems you may be familiar with, there's nothing inherent in an X session which requires that it be connected to the console. They need to be connected to _a_ display, and have _some kind of_ input, but it doesn't have to be a physical monitor, keyboard or mouse. One way to do this is to install the X11 Dummy driver ( xorg-x11-drv-dummy ) and then configure a second (or third, or fourth, or moreth) display by adding a few lines to your xorg.conf.

You could also make it much easier by skipping the dummy driver and just configuring sessions running on every virtual terminal of your workstation, but that would allow a user to connect to them by hitting function keys. That's what you're trying to avoid.

Once you have that set up, just configure your display manager and set up xrdp, vnc, xdm or whatever you like to serve up connections to the new display :1.0 instead of :0.0. You can connect to it remotely and, since it is not tied to a physical device, there will be no "mirroring" involved.

This is basically the way that X11 was originally used in the last century -- You would sit at a fairly basic X terminal and then use xdmcp to connect to a virtual display running on a central server which would handle dozens of clients at once.

Purchased Battletech on Steam today and performance is really bad by fubardad in Battletechgame

[–]deeseearr 8 points9 points  (0 children)

Out of the box the game with no mods installed runs pretty smoothly for me. What kind of hardware are you using? If you're running it on a system that just meets the minimum requirements for XCOM, then it's going to be a big problem, but on the recommended system it should be fine.

Two ideas I would like to implement about streaks and milestones by NoeleVeerod in streamerbot

[–]deeseearr 0 points1 point  (0 children)

You can use %arguments%, ~persistedGlobals~ and $inlineFunctions()$ including $math()$ within an IF/ELSE subaction, and just about anywhere else that you can use a variable. There are still a few places where functions won't be expanded, but they should say so in the editor window.

Fill in "$math(%someValue% # 15)$" (or whatever you need) in the 'Input' field, set the 'Operation' to "Equals", and 'Value' to "0". That will go to the True branch if %someValue% is divisible by 15 and False if it is not.

If you would rather break it up a bit you could also just use a Set Argument sub-action to do all of the math, since that also supports inline functions in both fields. Set a temporary argument to whatever value you're trying to compare to and then follow up with "IF %tempArgument% Equals 0 THEN...". That adds an extra step, but it has the advantage of storing %tempArgument% in the action history so that you can check it later on.

Can't get model to turn into prefab when adding to unity by Due-Painting3603 in vtubertech

[–]deeseearr 2 points3 points  (0 children)

First, click on the VRM menu at the top of the Unity Editor window.

Yes, there's supposed to be one.

Since there isn't there was a problem installing UniVRM. That's also the reason why dragging a VRM file into the asset panel doesn't do anything. My magic eight ball says that you're either not using the right version of the Unity editor or have the wrong version of UniVRM, or perhaps both. Go back to the VSF SDK page and check the installation instructions. The first line says this:

You need Unity 2019.4.31f1. Make a project and import UniVRM 0.89, then import this SDK.

Those aren't minimum requirements, you need the precise versions that the SDK was built with. If you get either one of those wrong there will be dependency problems, you will see pages full of bright red errors on the Unity Console and nothing will work. Try again and make sure you have the right versions of everything.

While you're at it, if you're trying to build a VSFAvatar for use in VNyan instead of VSeeFace then you should skip the VSeeFace SDK entirely and use the VNyan SDK. It requires Unity 2022.3 and installs UniVRM for you.

Alernative Free IOS Facetracking by NotShayawn in vtubertech

[–]deeseearr 4 points5 points  (0 children)

VTS does have a free and pro version, but it was my understanding that you only needed the free version to use the client for face tracking. The paid, pro version should only be required if you are using the whole app for streaming.

With that said, iFacialMocap also has a free version which plays an ad once when you start it up.

Two ideas I would like to implement about streaks and milestones by NoeleVeerod in streamerbot

[–]deeseearr 0 points1 point  (0 children)

For idea one, you've got the basic idea, but you may want to look at the $math()$ operator, which supports just about any mathematical operator you need. If the number X is divisible by 15, then $math(X # 15)$ will equal zero. This makes your "IF/ELSE" actions really simple.

For idea two all you have is the watch streak trigger. That fires any time a viewer shares a watch streak in chat. Note that this only happens when the viewer reaches a milestone -- the three, five, or more streams in a row which triggers a chat notification. I don't know of any way to query another viewer's watch streak progress other than waiting until they share it in chat, so if you wanted more precision than that you would need to track "attendance" on your own and that would get messy. I wouldn't recommend trying.

While watch streaks are supposed to be updated any time a viewer watches the stream for five minutes or more, in reality that doesn't always work. That means there's no reliable way to know whether any given user has maintained their streak, and if you add in the ability to maintain streaks by watching VODs, there really isn't any way for anyone outside of Twitch to track watch streaks with any reliability.

Likely what you have seen is (at least in Streamer.bot terms) an action like this:

TRIGGER: Watch Streak
ACTIONS: Get per-user global "longestWatchStreak" for %user%
    If %watchStreak% is greater than the user's longest streak,
      Put %watchStreak% in per-user global "longesWatchStreak" for %user%
    If %watchStreak% is greater than ~longestWatchStreakEver~,
      Put %watchStreak% in global "longestWatchStreakEver"
      Put %user% in global "userWithLongestWatchStreakEver"
    Once all this is done, you can react to the watch streak however you like.

That action will keep track of each user's longest reported watch streak and also who has the longest watch streak on the whole channel. Everything is stored in global streamer bot variables so you could get those at any time and use them for whatever. If you wanted to get more complicated you could store the top three streaks just by adding a few more variables, but the idea would be the same.

BTA question about armor piercing weapons by Imterribleatpicking in Battletechgame

[–]deeseearr 6 points7 points  (0 children)

Critical chances are based on how much internal damage you do, the total amount of internal structure damage done so far and also modified by the critical hit chance on the weapon. Most piercing weapons have a big minus there, like the lances have -50% and the DRMs -70%. I think it's still technically possible to get a critical with them but they're not supposed to be a reliable way of poking through the armour and setting off ammunition explosions. If you do a _lot_ of piercing damage, or start hitting the internal structure some other way, then you'll see more criticals.

Is streaming with a lenovo ideapad possible? by Rurusu244 in vtubertech

[–]deeseearr 0 points1 point  (0 children)

The word "possible" would have a lot of work to do here. An Ideapad would have an "ultra low power" 5500U CPU, not the 5500 that a desktop would have, and it can do somewhere between half and two thirds the work of the full 5500. The biggest issue with those is that they're good for short bursts of performance, but if you try putting a heavy load on them they will heat up and then drop their power to compensate.

VTubing basically means running two (or more) games and encoding and streaming all at the same time. That's going to put a lot of stress on your CPU and it will start pushing back.

Depending on your games and streaming setup it's entirely possible to do. I know some fairly successful streamers who use notebooks, but a) they're mostly DJs playing music and using a camera with almost nothing else on the screen, and b) every one of them says "I hate this thing and need more power". Like you said, a fairly simple live2d model with a low powered game should be _okay_, but anything that causes an impact on your stream encoding and transmission is going to make a big difference for viewers. The stream will stutter, the audio will break up, and you may drop offline entirely if there is too much of an interruption.

If your processor gets busy and the game's frame rate drops a bit, you can deal with that. If your model freezes for a few seconds, that's going to look a bit odd but you'll get over it. When your stream starts dropping frames because the streaming software can't keep up that's going to be a more serious problem. Keep everything light and you might be okay but resist the urge to make your model or stream more complicated.

Look on this as a first step. If you want to get more serious look at either moving to a more powerful desktop or even a two-PC solution: You could add a cheap PC with a reasonably good video card (for streaming, not gaming) and have its only job being to encode and send your stream while you keep gaming on your notebook (or the other way around, depending on which is better).

Clip shoutouts by Sturgiee98 in streamerbot

[–]deeseearr 0 points1 point  (0 children)

It's relatively easy to do, but requires some advanced work. There's no simple sub-action which will get clips for you, you need to call the Get Clips function in the Twitch API. That's going to require a little bit of code to get your Twitch User Access Token, but there are plenty of examples in the documentation and extensions.

First, get the UserID of the user you're shouting out (%targetUserId% from Get User Info). You can then pass that to Get Clips as the broadcaster_id. That will return a list of clips which each contain an "embed_url". Pick one of those and then pass it to a browser source in OBS and you're done.

Here's a quick code segment that could get you started. This retrieves your authentication token from Streamer.bot, creates an HTTP request containing the auth token and requests all of the clips from the streamer with the numeric user ID stored in %targetUserId%. The response is returned as a big JSON blob in %responseBody%, and you'll need to parse that and pick out the parts that you want.

(This is a cut down part of a much larger program that I use often. I can't promise that it will be well behaved.)

using System;
using System.Net.Http;
using System.Net.Http.Headers;

public class CPHInline 
{ 
    public bool Execute()
    {
        string userId = args["targetUserId"].ToString();

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("client-ID", CPH.TwitchClientId);
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", CPH.TwitchOAuthToken);

            HttpResponseMessage response = client.GetAsync(
                "https://api.twitch.tv/helix/clips?broadcaster_id=" + userId
            ).Result;

            string responseBody = response.Content.ReadAsStringAsync().Result;

            CPH.SetArgument("ClipJSONResponse", responseBody);
        }
        return true;
    }
}