字幕表 動画を再生する 英語字幕をプリント (ding) - Hello. So, previously, I made a bot that picked a random number between zero and 90, generated this fractal tree using that angle, using processing, made the image, and then posted that image to Mastodon using this coding train bot at bots in space, bots in dot space, whatever, botsinspace.instance. So, you can see a bunch of these here. And so, now what I want to do... And the bot, if we look at the code, is just executing all of this stuff to generate the image and post it once a day. So, what I would like to do now in this video is change it. Well, I'm not going to use setInterval. In fact, I'm not ever going to post an image. I am only going to post an image as a reply to somebody else. And I'm going to look in their reply, find the angle that they have specified, and send them back a tree with that angle. And you can just imagine the possibilities of things you can do. I mean, one of my favorites, this is a Twitter bot, but one of my favorite bots is Lowpoly Bot. And what Lowpoly Bot does is, is it still running, is the question. 'Cause most of these bots you can't... One of the reasons why I'm using Mastodon is that you can't really run these anymore on Twitter. They've changed the API specifications too much. So, the idea is that, you send in an image, and an image processes for you and sends it back, okay. So, I want to connect to the streaming API, and I want to connect to the user stream, meaning any time I get any sort of notification, somebody favorites something, somebody mentions me, re blogs me, if I post something, I think I get an event, so the way that I do that is by saying M.stream. Right, I have to go look it up here in this API. M.stream path and parameters. Returns a stream listener instance. See examples how how to use it. Okay, why not? I've done this already in a previous video. So, I could look at my previous code. But let's actually... Sorry, let's just go to examples, streaming.js. Oh, and we can see that here. So, this is what I want to do, I want to connect to the stream. Create a stream instance. All right, connecting to streaming/user. And then, on a particular event, like a notification, is that what it was? Oh no, just a message. So the event here is called message. And then, on a message... And this by the way, I've just been told from the chat, thank you to Alca in the chat, that the streaming API doesn't support promises. So in this case, I do have to use a call back and I can say response, I like to use the word response, like this. Now I do want to look up my previous code 'cause I need to figure out what, I need to determine what I'm looking for in that response. So I have that open here and you can see that what I'm doing here is if the event is a notification and if it's a mention, that's what I'm looking for. I'm looking for a mention. So I'm going to say if response.event equals a notification. I'm just only going to do mentions. And response.data.type I think equals mention. Is that right? I should be just looking at my previous code. Message .data.type. Message .event. So where is the mention in this one that I did? Do do do do do. Ah, message .data, it's right there. Message .data.type so I'm using different variable names, which is fine, but if the event is a notification and the type of the event is a mention, then, now, I am ready to basically do this. The idea is if I'm mentioned, go ahead and do this. But, and I don't need a separate function for this. So I'm just going to take this here. But, what I want to do is I need to add some stuff to this. So for example, I probably want to mention a user account and I want to have a reply id and also that angle. So I need to, if I'm going to reply, I want to at mention them, so I need their account to reference. Also, if I want it to be threaded, I need the id of that post so I can include that, and then the angle I want. So now the angle shouldn't come, oh I've got to send the angle in to processing. Alright, that's going to be something we have to figure out. Okay, I'm going to get to that in a second. So let's try to get the whole flow of this working. This is an interesting problem that I completely forgot that I had to figure out. So first, let me get the id is, and I did this before, so I'm just going to, we can see the id is this. This is pulling the id out of, and I said response instead of message, which is fine. And then the account name is right here. So I want to also get the account, which is also response. So I can then pass on the account, pass on the id, now the angle is a tricky one. So what am I expecting the person to say? I guess I'm expecting somewhere in their post that there's a number. And they could put multiple numbers, I'm just going to pick the first number. So what I'm going to do, whoops. This is by the way my inspiration, the tree bot. But where am I? I'm looking at my code. I need to get the content of what they've sent me. This is their message content. So what I want to do is use a regular expression. So my regular expression is going to be I need to find a number. The number that I want is between two and three digits. So I guess I'm going to allow... I mean, do I allow an angle greater than 90? I mean, sure. I could actually, it could be any number. I could really just say any number. It doesn't matter how big. So I want to match this. And so if I say regular... Oh, if I say content.match regular expression. Is this-- Now I've forgotten how regular expressions work. So let's just go to the browser for a second and let's noodle around here. So let's say if I make a regular expression and I make it equal to this, and then I have a string like hello 42 goodbye. If I saw s.match that regular expression, what do I get? Ah, perfect. I get what it matched, the index, and some more information. All I care about is what it matched. And I don't need it to be global. I don't need it to get all the numbers. I could get all the numbers and average them or something. But I'm just going to get the first one. So this is fine. So then I'm going to... And I do have to deal with the fact, what if it doesn't match anything? So let's see what it gives me if it doesn't match. So let's say s equals this. And I'm going to say s match regular expression. Null, so that's fine. So now I'm going to say results equals content match regular expression and the angle, so I'm going to say if results, or I could, if results, I could probably use that ternary thing. Then the angle equals results index zero, otherwise angle equals, oh otherwise I'm going to say there's no angle. I could reply and say you need to mention me with a number. So I'll... So I'm actually going to just say, yeah, angle equals negative one. So I'm going to use negative one as like a... And I can actually just do this and then do this, okay. Great great great great great. So now in theory, now I can pass that angle here. So alright, now one thing I can do. Let's just do this. So if, the first thing I want to do is just say if angle equals negative one, right, if I've gotten a negative one angle, I want to actually just be done. Like I want to say... Oh but I have to mention the person. Okay, so I have to say if in a status post, can I find that here? Right, so the text of the status is this text of the status in reply to id, so this is important. So I'm going to say... Please specify an angle in degrees using digits. 'Cause it won't work if you say the word ninety. Then I need to say in reply, what is it? In reply to id, in reply to id is that reply id. And then also I want to use the account. So I'm going to, I want to start with the account. Account, and do I say at? I think I have to say at the account. Please specify an angle in digits. Then in reply to id. Okay, so this is good and I'll call this, and then I'm going to say response, I'm going to say params and response and success, angle, negative one. Okay, so this now should... If I run this... And then I'm going to put an else here. This function has gotten quite long. But basically what I'm doing is first I'm checking if there was a legitimate angle. And if there wasn't, I'm replying back to say please specify an angle in degrees and then let's see how that goes. So right now if I run this bot, oh I forgot to make a new one. That's fine. If I run this bot, somebody should feel free to at mention me without a digit. Can somebody do that please? Alright, somebody at messaged me, thank you for helping me debug this. And I got an error in bot.js line 25. Bot.js line 25, ah, response, response, response. Sorry! Response, response, alright let's try this again. Be prepared. Alright, at mention me with no number please. You can put a number in it, but it won't work if you put a number in it. Alright, oo! Interesting. Can someone please? There we go, okay. So let's take a look, so someone mentioned me with a number. That's great that we had both of those tested. And we can see this one said please specify an angle in degrees using digits. That's right. And then this one just said behold my beautiful tree. So I haven't done the thing where I actually get the angle. So let's first, let's just first if I really do get an angle, let's do all the same steps but right now, I'm going to also add at account, so I'm going to mention that account with angle, and then I'm going to use the angle that they asked for and then, and I need in reply id. What was it? Same thing. In reply to id. Where is that, where is that, where is that? There we go. In reply to id. Okay. So now, if I run this one more time, you can now at mention me with an angle and you'll get a tree back. Or you can at mention me with no angle and you will get a message back saying you need an angle. But, I won't be using the angle you asked for just yet. But let's just see if this works. Okay great, so we can see that we got one two three four five mentions, one of which had a negative one. So let's see, let's just check our bot now and we can see 60, 38, 56, now here's the thing. I'm not actually using the angle, it's still just a random angle. (laughing) So, what I need to do is... Oh and I forgot that I was pulling it out of here so it's actually not, hold on. Let's... So we see Alca asked for 56 and I made a tree with 52. So now let's take this out and actually try to use that angle. Now here's the thing. I can't just... How do I do this? So what I'm actually going to do, this is interesting, is I need to go back to that exec command. Where did I have that? Where is that? Oh, command. So that's, whoa, it's all the way way up here. So what I actually need to do is I need to add another argument to this. And so what I'm going to do, and I think, I haven't done this in a while. Let's, alright, let's do it this way, sorry. Let me grab this command. We're going to figure this out together. And we go back to here. And I'm going to run that command. So this runs and that spits out the angle. Now there should be a way in processing for me to get the arguments. How do you get the arguments in Java? Okay, I looked it up, I can't believe I forgot this. But processing actually just has a build in variable called args which has those command line arguments. So I'm going to put printArray args and now I'm going to do this. And we should see whoa! Oh, it's null 'cause there were none. That's weird. Because where do those go? They're not here. How do I pass arguments? If I just add something else like here? Oh yeah, there we go, okay. So if I just add, the args come at the end. I thought some of these might be args, but of course there's none. So we can see here if I just execute it with an argument like with the angle 40, then, bleh 40 'cause I have some... I had a bl in there. Bleh 40 comes out. Okay, perfect, this is much easier than I thought. All I need to do is now say command. Where do I execute that command? Right here. Execute command plus space angle, right? I guess I could use a template literal there. But just need to add that angle there and I probably want to double check to make sure there are any args, but if args is not equal to null, then... And then I'm going to make this a global variable. A equals zero. And then I'm going to say a equals args index zero. I guess that's going to be a string, right? So I need to convert that to an integer or a float maybe. And then I don't need it here. And now here we go. So now, if... Let's take out the exit just so we see. Let's do this. Processing java. Run with the angle 10. That looks like the angle 10 right? Now, let's run with an angle of 90. And that looks like the angle 90! (clap) Perfect! I passed in the angle. And so now I should be able to... I mean right, is there anything left to do? I think this works. 'Cause I got the angle, I got the angle, I'm going to give it the angle, yeah, alright. What the hey ho? Let's run this. Ha! Node bot.js, Mastodon Bot starting. And now, I'll just wait for a little bit. (jazzy music) Try test anything you can imagine. Oh woops! Sorry stop, stop! It's funny. Actually, this is fine I forgot the exit thing. So amusingly I forgot the exit thing so it's opening up processing but it's never finishing. So actually that exit thing is very important because I forgot that I had that in there. I've got to put that back in there. And let's try this one more time. And here we go. (jazzy music) Alright, thank you everybody, this looks like some good amount of testing. Let's go now to bots in space and take a look. Here is, behold my tree with an angle of 90, please specify an angle, so we can see here, nope, right that worked. Here, a right triangle has an angle of 90 degrees. I love right triangles. There we go, perfect. So, 89, and there we go. 128 degrees. 128, this is working! Yay! (trumpet fanfare) This is done! So I hope now you have enjoyed, you can imagine sort of... I mean there is another piece to this that I could do, which is what if the person sends me an image and I do something to the image and send it back. I guess I'll have to come back another day and do that one. But now you can see the full process that you can have another user at mention you with some data, text data, use that text data to generate an image, and send it back. So I hope you enjoyed this tutorial, I hope you make some wonderful bots at bots in space and I will see you in a future video. (ding) (playful music) (ding)
A2 初級 コーディングチャレンジ #118.2.マストドンフラクタルツリーボット パート2 (Coding Challenge #118.2: Mastodon Fractal Tree Bot Part 2) 3 0 林宜悉 に公開 2021 年 01 月 14 日 シェア シェア 保存 報告 動画の中の単語