[Tease Program] Tease-AI Java (1.4)

Webteases are great, but what if you're in the mood for a slightly more immersive experience? Chat about Tease AI and other offline tease software.

Moderator: 1885

GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by GodDragon »

Triple Alfa wrote: Sat Jun 13, 2020 9:01 am Hey guys it's been a little while. I was having a bit of a creative block when I realized I wasn't really working to my strengths, so I switched to a new personality with a different approach. Instead of trying to do one character with a neatly flowing storyline I'm now taking a more CYOA like approach with multiple characters.

Anyway while working on the new personality I ran into an issue. I made a function to send messages with a custom sender and custom colors.(It's mostly a copy from my older narrator function.) And while it is working fine just like the narrator one, I noticed it doesn't accept modifiers like "<b>".

Code: Select all

function sendSpecialMessage(sender, color, message, wait) {
    let textName = new javafx.scene.text.Text(replaceVocab("[" + sender + "]: "));
    eval("textName.setFill(javafx.scene.paint.Color." + color + ")");
    textName.setFont(javafx.scene.text.Font.font(null, javafx.scene.text.FontWeight.BOLD, TeaseAI.application.CHAT_TEXT_SIZE.getDouble() + 1));

    message = replaceVocab(message);
    let text = new javafx.scene.text.Text(message);
    text.setFill(javafx.scene.paint.Color.BLACK);
    text.setFont(javafx.scene.text.Font.font(null, javafx.scene.text.FontWeight.NORMAL, TeaseAI.application.CHAT_TEXT_SIZE.getDouble()));

    sendCustomMessage(textName, text);

    if (getVar(VARIABLE.DEBUG_RAPID_TESTING, false) === false) {
        if (wait === undefined) {
            sleep(3000 + message.length * 50, "MILLISECONDS");
        } else if (!wait.isNaN) {
            sleep(wait * 1000, "MILLISECONDS");
        }
    } else {
        sleep(1);
    }
}
"sendMessage("<b>test</b>");" results in a bold "test"
"sendSpecialMessage("Test", "BLACK", "<b>test</b>");" results in "<b>test</b>"

I'm assuming it's a limitation of sendCustomMessage()?
Since I'm sending all messages in this format I really need a way to solve this issue.

Also is there any word on a fix for the video issues I reported earlier?
I'm planning on using videos for this personality and It'd be nice if they gave me more than a black screen :lol:
Triple Alfa wrote: Thu May 14, 2020 11:47 pm More feedback. I just tried to play a video and had two issues:
1) I tried to play two separate .mp4 videos and both gave me a black screen with no errors.
2) .webm Gives me a "MEDIA_UNSUPPORTED" exception. This is very unfortunate as a lot of online content these days is in the .webm format.
Well there is this function which you can use to format your message based on the codes:
https://github.com/GodDragoner/TeaseAIJ ... .java#L243

THen you have list of nodes. After that you will have to change any style of these nodes to your liking. Additionally you will have to add your textName to the front of the list. Then you can call this function with the resulting list:
https://github.com/GodDragoner/TeaseAIJ ... .java#L226

That should take care of whatever you are doing. However there is no typing or delay afterwards.

Can you give me an example of a mp4 that can't be played?
Yes could be that WEBM is not supported. But running a quick webm to mp4 converter on the files you want to play isn't too bad. I can look if there is an easy way to support it but I guess it can only be done via conversion.
Triple Alfa
Explorer At Heart
Explorer At Heart
Posts: 175
Joined: Wed Dec 05, 2007 12:35 pm

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by Triple Alfa »

GodDragon wrote: Wed Jun 24, 2020 10:20 pm Well there is this function which you can use to format your message based on the codes:
https://github.com/GodDragoner/TeaseAIJ ... .java#L243

THen you have list of nodes. After that you will have to change any style of these nodes to your liking. Additionally you will have to add your textName to the front of the list. Then you can call this function with the resulting list:
https://github.com/GodDragoner/TeaseAIJ ... .java#L226

That should take care of whatever you are doing. However there is no typing or delay afterwards.
With this new personality a lot of characters will be present(no limit really), so I need a way to set the name of the person typing and preferably set the color of the name as well to differentiate the characters and avoid confusion.
As I understand it there is normally a hard limit of Domme + three contacts and their colors are set in the settings menu, not through code. I need to get past these limitations.
The issue with your solution is that the typing and delay are essential as I am writing all the regular text in this manner.
EDIT2: On second thought I actually don't want typing, so maybe this can work. I'm not sure whether I can figure the code out on my own, but I'll try.
Can you give me an example of a mp4 that can't be played?
So since that previous post I collected a bunch of other videos and most of them are working fine. So it's not all .mp4's that have this issue. I have zipped up two videos that I've just tested and are not working correctly. I will send the link to you via PM.
Yes could be that WEBM is not supported. But running a quick webm to mp4 converter on the files you want to play isn't too bad. I can look if there is an easy way to support it but I guess it can only be done via conversion.
For what I'm trying to do, where I'll be providing the videos as a creator, it's not that bad, but for personalities that require users to add their own videos it can be a very big hurdle. I've already read from people complaining about regular TeaseAI's setup around the Internet and that's just settings and adding images. So adding video conversion to that I think would put a lot of people off.

One last thing I wanted to note is that playVideo() doesn't seem to support shortcuts in windows. This is unfortunate as it means that users adding their own videos will have to make copies of them which can quickly add up to a lot of gigabytes of storage used.

EDIT1:
Since the video functionality doesn't seem to have a built-in loop function I used this as a test to loop a video:

Code: Select all

let i;
for(i=0; i < 5; i++){
    playVideo("Videos" + separator + "Amelie" + separator + "Ass Licking" + separator + "Futa Mei facesitting on Futa Brigitte WM.mp4", true);
}
This works fine, but as the video is re-loaded on every loop there is a black flickering when the loop happens. On longer videos that's not that big of a deal, but on short videos where the loops happen often, it is.
Is there any way you could prevent this flickering from happening?
It would enable the use of short looped videos.

EDIT3:
I've almost got the code for the custom messages working, but I'm running into an error trying to pass the node list to addLine().

Code: Select all

Error: TypeError: TAJ_CHAT_HANDLER.addLine is not a function in <eval> at line number 257
This is the current code. Everything up until the last line of the function seems to be working as intended.

Code: Select all

const TAJ_CHAT_HANDLER = Java.type('me.goddragon.teaseai.api.chat.ChatHandler');
const STRING_UTILS = Java.type('me.goddragon.teaseai.utils.StringUtils');

function sendSpecialMessage2(sender, color, message) {
    let nodeList = STRING_UTILS.processString(message);
    let senderList = STRING_UTILS.processString("[" + sender + "]: ");
    let senderItem = senderList[0].toString();
    let fillLocation = senderItem.search("fill=");
    let curColorCode = senderItem.slice(fillLocation, fillLocation + 15);
    senderItem = senderItem.replace(curColorCode, "fill=0x" + color + "ff");
    let newNodeList = [];
    newNodeList.push(senderItem);
    let i;
    for(i = 0; i < nodeList.length; i++){
        newNodeList.push(nodeList[i]);
    }

    TAJ_CHAT_HANDLER.addLine(newNodeList);
}
I don't know what I'm missing. If I look at the code you linked it seems like I'm referencing the correct function in the correct location.
GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by GodDragon »

Triple Alfa wrote: Sat Jun 27, 2020 9:06 am
With this new personality a lot of characters will be present(no limit really), so I need a way to set the name of the person typing and preferably set the color of the name as well to differentiate the characters and avoid confusion.
As I understand it there is normally a hard limit of Domme + three contacts and their colors are set in the settings menu, not through code. I need to get past these limitations.
The issue with your solution is that the typing and delay are essential as I am writing all the regular text in this manner.
EDIT2: On second thought I actually don't want typing, so maybe this can work. I'm not sure whether I can figure the code out on my own, but I'll try.

EDIT3:
I've almost got the code for the custom messages working, but I'm running into an error trying to pass the node list to addLine().

Code: Select all

Error: TypeError: TAJ_CHAT_HANDLER.addLine is not a function in <eval> at line number 257
This is the current code. Everything up until the last line of the function seems to be working as intended.

Code: Select all

const TAJ_CHAT_HANDLER = Java.type('me.goddragon.teaseai.api.chat.ChatHandler');
const STRING_UTILS = Java.type('me.goddragon.teaseai.utils.StringUtils');

function sendSpecialMessage2(sender, color, message) {
    let nodeList = STRING_UTILS.processString(message);
    let senderList = STRING_UTILS.processString("[" + sender + "]: ");
    let senderItem = senderList[0].toString();
    let fillLocation = senderItem.search("fill=");
    let curColorCode = senderItem.slice(fillLocation, fillLocation + 15);
    senderItem = senderItem.replace(curColorCode, "fill=0x" + color + "ff");
    let newNodeList = [];
    newNodeList.push(senderItem);
    let i;
    for(i = 0; i < nodeList.length; i++){
        newNodeList.push(nodeList[i]);
    }

    TAJ_CHAT_HANDLER.addLine(newNodeList);
}
It might be easier to register a custom contact on your end then. I feel like I have talked about that with someone before but I can't quite remember.
Regarding your issue in the code:
You'll need to use: TAJ_CHAT_HANDLER.getHandler().addLine(newNodeList)
Triple Alfa wrote: Sat Jun 27, 2020 9:06 am So since that previous post I collected a bunch of other videos and most of them are working fine. So it's not all .mp4's that have this issue. I have zipped up two videos that I've just tested and are not working correctly. I will send the link to you via PM.
I will look into them. Thanks.
Triple Alfa wrote: Sat Jun 27, 2020 9:06 am For what I'm trying to do, where I'll be providing the videos as a creator, it's not that bad, but for personalities that require users to add their own videos it can be a very big hurdle. I've already read from people complaining about regular TeaseAI's setup around the Internet and that's just settings and adding images. So adding video conversion to that I think would put a lot of people off.
I wanted to have an already setup version of TAJ to be downloadable so you can start of directly.
Triple Alfa wrote: Sat Jun 27, 2020 9:06 am One last thing I wanted to note is that playVideo() doesn't seem to support shortcuts in windows. This is unfortunate as it means that users adding their own videos will have to make copies of them which can quickly add up to a lot of gigabytes of storage used.
Interesting idea. Will definitely think about some way to do that.
Triple Alfa wrote: Sat Jun 27, 2020 9:06 am EDIT1:
Since the video functionality doesn't seem to have a built-in loop function I used this as a test to loop a video:

Code: Select all

let i;
for(i=0; i < 5; i++){
    playVideo("Videos" + separator + "Amelie" + separator + "Ass Licking" + separator + "Futa Mei facesitting on Futa Brigitte WM.mp4", true);
}
This works fine, but as the video is re-loaded on every loop there is a black flickering when the loop happens. On longer videos that's not that big of a deal, but on short videos where the loops happen often, it is.
Is there any way you could prevent this flickering from happening?
It would enable the use of short looped videos.
Interesting. I guess the black frame comes from reloading the video over and over. So tell me how long are the videos? How often does it switch the video? I mean I guess you are telling me that when swapping from one video to another a black frame is shown?


I don't know what I'm missing. If I look at the code you linked it seems like I'm referencing the correct function in the correct location.
[/quote]
Triple Alfa
Explorer At Heart
Explorer At Heart
Posts: 175
Joined: Wed Dec 05, 2007 12:35 pm

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by Triple Alfa »

GodDragon wrote: Sat Jun 27, 2020 10:03 pm It might be easier to register a custom contact on your end then. I feel like I have talked about that with someone before but I can't quite remember.
Regarding your issue in the code:
You'll need to use: TAJ_CHAT_HANDLER.getHandler().addLine(newNodeList)
Ok that got me one step further, but now I'm getting another error:

Code: Select all

12:01:03 pm SEVERE: Unrecognized formatter format:/b
Exception in thread "JavaFX Application Thread" Exception in thread "Thread-64" java.lang.ClassCastException: class java.lang.String cannot be cast to class javafx.scene.Node (java.lang.String is in module java.base of loader 'bootstrap'; javafx.scene.Node is in module javafx.graphics of loader 'app')
	at me.goddragon.teaseai.api.chat.ChatHandler.addLine(ChatHandler.java:246)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$18$8517AAA$\^eval\_.sendSpecialMessage2(<eval>:257)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$17$\^eval\_/0x00000008011cd040.:program(<eval>:6)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:scopeCall(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:program(<eval>:23)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:145)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:125)
	at me.goddragon.teaseai.api.session.Session$1.run(Session.java:43)
java.lang.ClassCastException: class java.lang.String cannot be cast to class javafx.scene.Node (java.lang.String is in module java.base of loader 'bootstrap'; javafx.scene.Node is in module javafx.graphics of loader 'app')
	at javafx.graphics/javafx.scene.Parent$3.onProposedChange(Parent.java:536)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:234)
	at me.goddragon.teaseai.api.chat.ChatHandler$4.run(ChatHandler.java:237)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
	at java.base/java.lang.Thread.run(Thread.java:832)
This is when trying to display: "This is a test <b>message.</b> How does this work?"
I've tried replacing </b> with </>, but that gives me the same error for "/".

If I remove the formatting all together like this: "This is a test message. How does this work?"
I get a different error:

Code: Select all

Exception in thread "Thread-64" Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: class java.lang.String cannot be cast to class javafx.scene.Node (java.lang.String is in module java.base of loader 'bootstrap'; javafx.scene.Node is in module javafx.graphics of loader 'app')
	at javafx.graphics/javafx.scene.Parent$3.onProposedChange(Parent.java:536)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:234)
	at me.goddragon.teaseai.api.chat.ChatHandler$4.run(ChatHandler.java:237)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
	at java.base/java.lang.Thread.run(Thread.java:832)
java.lang.ClassCastException: class java.lang.String cannot be cast to class javafx.scene.Node (java.lang.String is in module java.base of loader 'bootstrap'; javafx.scene.Node is in module javafx.graphics of loader 'app')
	at me.goddragon.teaseai.api.chat.ChatHandler.addLine(ChatHandler.java:246)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$18$8517AAA$\^eval\_.sendSpecialMessage2(<eval>:257)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$17$\^eval\_/0x00000008011cc440.:program(<eval>:6)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:scopeCall(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:program(<eval>:23)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:145)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:125)
	at me.goddragon.teaseai.api.session.Session$1.run(Session.java:43)
I wanted to have an already setup version of TAJ to be downloadable so you can start of directly.
I think that would help get a lot more traction with people who are apprehensive about the setup process.
I also have to say that I personally found the setup required for regular TeaseAI personalities quite daunting if you don't already have folders of images ready for their specific requirements. If you want variety you need like a hundred images per category minimum. So having a fully functional download seems like a huge boon.
Interesting. I guess the black frame comes from reloading the video over and over. So tell me how long are the videos? How often does it switch the video? I mean I guess you are telling me that when swapping from one video to another a black frame is shown?
The video I tested with is 6 seconds long. At the end of the video the for loop immediately starts the video again. Before that happens you can see a black frame. I'm not sure how long the frame is visible, but it's very noticeable.

EDIT1:
As a small aside, is there a way to change %subName% from code?
I'm making this first greeting section and the girl is asking the player for their name. If the response is anything other than %subName% it'd be cool if I could adapt to that.
GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by GodDragon »

Triple Alfa wrote: Sun Jun 28, 2020 10:26 am Ok that got me one step further, but now I'm getting another error:

Code: Select all

12:01:03 pm SEVERE: Unrecognized formatter format:/b
Exception in thread "JavaFX Application Thread" Exception in thread "Thread-64" java.lang.ClassCastException: class java.lang.String cannot be cast to class javafx.scene.Node (java.lang.String is in module java.base of loader 'bootstrap'; javafx.scene.Node is in module javafx.graphics of loader 'app')
	at me.goddragon.teaseai.api.chat.ChatHandler.addLine(ChatHandler.java:246)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$18$8517AAA$\^eval\_.sendSpecialMessage2(<eval>:257)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$17$\^eval\_/0x00000008011cd040.:program(<eval>:6)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:scopeCall(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:program(<eval>:23)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:145)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:125)
	at me.goddragon.teaseai.api.session.Session$1.run(Session.java:43)
java.lang.ClassCastException: class java.lang.String cannot be cast to class javafx.scene.Node (java.lang.String is in module java.base of loader 'bootstrap'; javafx.scene.Node is in module javafx.graphics of loader 'app')
	at javafx.graphics/javafx.scene.Parent$3.onProposedChange(Parent.java:536)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:234)
	at me.goddragon.teaseai.api.chat.ChatHandler$4.run(ChatHandler.java:237)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
	at java.base/java.lang.Thread.run(Thread.java:832)
This is when trying to display: "This is a test <b>message.</b> How does this work?"
I've tried replacing </b> with </>, but that gives me the same error for "/".

If I remove the formatting all together like this: "This is a test message. How does this work?"
I get a different error:

Code: Select all

Exception in thread "Thread-64" Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: class java.lang.String cannot be cast to class javafx.scene.Node (java.lang.String is in module java.base of loader 'bootstrap'; javafx.scene.Node is in module javafx.graphics of loader 'app')
	at javafx.graphics/javafx.scene.Parent$3.onProposedChange(Parent.java:536)
	at javafx.base/com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:234)
	at me.goddragon.teaseai.api.chat.ChatHandler$4.run(ChatHandler.java:237)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
	at java.base/java.lang.Thread.run(Thread.java:832)
java.lang.ClassCastException: class java.lang.String cannot be cast to class javafx.scene.Node (java.lang.String is in module java.base of loader 'bootstrap'; javafx.scene.Node is in module javafx.graphics of loader 'app')
	at me.goddragon.teaseai.api.chat.ChatHandler.addLine(ChatHandler.java:246)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$18$8517AAA$\^eval\_.sendSpecialMessage2(<eval>:257)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$17$\^eval\_/0x00000008011cc440.:program(<eval>:6)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:scopeCall(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:program(<eval>:23)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:145)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:125)
	at me.goddragon.teaseai.api.session.Session$1.run(Session.java:43)
You will have to work on the result of the processString:

Code: Select all

    let nodeList = STRING_UTILS.processString(message);
    let senderList = STRING_UTILS.processString("[" + sender + "]: ");
    let senderItem = senderList[0];
    //Make sure to have the color in the format of hex (#) or 0x... or rgb(...)
    let toFill = javafx.scene.paint.Color.valueOf(color);
    senderItem.setFill(toFill);
    //Add sender at start
    nodeList.add(0, senderItem);
    TAJ_CHAT_HANDLER.addLine(nodeList);
This is not tested btw.
Triple Alfa wrote: Sun Jun 28, 2020 10:26 am I think that would help get a lot more traction with people who are apprehensive about the setup process.
I also have to say that I personally found the setup required for regular TeaseAI personalities quite daunting if you don't already have folders of images ready for their specific requirements. If you want variety you need like a hundred images per category minimum. So having a fully functional download seems like a huge boon.
The video I tested with is 6 seconds long. At the end of the video the for loop immediately starts the video again. Before that happens you can see a black frame. I'm not sure how long the frame is visible, but it's very noticeable.
Yes. I want to go away from personalities really requiring you to setup local pictures anyway unless it's very specific tags (Domme Sets etc.) The variety of random pictures and "tagged" pictures you can pull from reddit is big enough and more entertaining instead of repeating the images over and over.
Other things such as URL files and Domme Sets + Videos will be included too.
Triple Alfa wrote: Sun Jun 28, 2020 10:26 am EDIT1:
As a small aside, is there a way to change %subName% from code?
I'm making this first greeting section and the girl is asking the player for their name. If the response is anything other than %subName% it'd be cool if I could adapt to that.
You can try creating your own SubName vocabulary. It could be that it overwrites the normal subname. You can allthough just create your own SubName named differently like SubNameCustom and just make it return replaceVocab(%SubName%) if none is set otherwise use your custom name.
Or you could set the sub name internally at startup but that's not recommended
Triple Alfa
Explorer At Heart
Explorer At Heart
Posts: 175
Joined: Wed Dec 05, 2007 12:35 pm

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by Triple Alfa »

GodDragon wrote: Mon Jun 29, 2020 6:04 pm You will have to work on the result of the processString:

Code: Select all

    let nodeList = STRING_UTILS.processString(message);
    let senderList = STRING_UTILS.processString("[" + sender + "]: ");
    let senderItem = senderList[0];
    //Make sure to have the color in the format of hex (#) or 0x... or rgb(...)
    let toFill = javafx.scene.paint.Color.valueOf(color);
    senderItem.setFill(toFill);
    //Add sender at start
    nodeList.add(0, senderItem);
    TAJ_CHAT_HANDLER.addLine(nodeList);
This is not tested btw.
Your code was almost perfect. Just forgot the .getHandler() at the end.
With the wait functionality re-introduced and the sender's name in bold the final code now looks like this:

Code: Select all

function sendSpecialMessage(sender, color, message, wait) {
    let nodeList = STRING_UTILS.processString(message);
    let senderList = STRING_UTILS.processString("<b>[" + sender + "]: </b>");
    let senderItem = senderList[0];
    //Make sure to have the color in the format of hex (#) or 0x... or rgb(...)
    let toFill = javafx.scene.paint.Color.valueOf(color);
    senderItem.setFill(toFill);
    //Add sender at start
    nodeList.add(0, senderItem);
    TAJ_CHAT_HANDLER.getHandler().addLine(nodeList);

    if (getVar(VARIABLE.DEBUG_RAPID_TESTING, false) === false) {
        if (wait === undefined) {
            sleep(3000 + message.length * 80, "MILLISECONDS");
        } else if (!wait.isNaN) {
            sleep(wait * 1000, "MILLISECONDS");
        }
    }else if (wait === undefined){
        sleep(1);
    }else if (!wait.isNaN){
        if(wait > 1){
            sleep(1);
        }else if(wait === 0){
            sleep(0);
        }else{
            sleep(wait);
        }
    }else{
        sleep(1);
    }
}
Thank you again for your assistance.

EDIT1:
There was one thing still missing, the replaceVocab(). After adding that and fiddling with the timings a bit more it's ended up like this:

Code: Select all

function sendSpecialMessage(sender, color, message, wait) {
    message = replaceVocab(message);
    let nodeList = STRING_UTILS.processString(message);
    let senderList = STRING_UTILS.processString("<b>[" + sender + "]: </b>");
    let senderItem = senderList[0];
    //Make sure to have the color in the format of hex (#) or 0x... or rgb(...)
    let toFill = javafx.scene.paint.Color.valueOf(color);
    senderItem.setFill(toFill);
    //Add sender at start
    nodeList.add(0, senderItem);
    TAJ_CHAT_HANDLER.getHandler().addLine(nodeList);

    if (getVar(VARIABLE.DEBUG_RAPID_TESTING, false) === false) {
        if (wait === undefined) {
            sleep(2500 + message.length * 80, "MILLISECONDS");
        } else if (!wait.isNaN) {
            sleep(wait * 1000, "MILLISECONDS");
        }
    }else if (wait === undefined){
        sleep(1);
    }else if (!wait.isNaN){
        if(wait > 1){
            sleep(1);
        }else if(wait === 0){
            sleep(0);
        }else{
            sleep(wait);
        }
    }else{
        sleep(1);
    }
}
Yes. I want to go away from personalities really requiring you to setup local pictures anyway unless it's very specific tags (Domme Sets etc.) The variety of random pictures and "tagged" pictures you can pull from reddit is big enough and more entertaining instead of repeating the images over and over.
Other things such as URL files and Domme Sets + Videos will be included too.
I have to say that I have a personal preference for curated content. I find that random images pulled from reddit or other sources never do it for me. There is always too much low quality or unrelated content that really pulls me out of the experience. So seeing all personalities pushed in that direction would be a disappointing outcome for me.
You can try creating your own SubName vocabulary. It could be that it overwrites the normal subname. You can allthough just create your own SubName named differently like SubNameCustom and just make it return replaceVocab(%SubName%) if none is set otherwise use your custom name.
Or you could set the sub name internally at startup but that's not recommended
I like your SubNameCustom idea. Simple, but effective. The only downside to it is that the name displayed in the UI remains the same as that is tied to subName. And it would require me to create my own setup process for the player's name on first usage. I think I'll leave it alone for now as I only have one use case so far, but I might revisit this in the future.
GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by GodDragon »

Triple Alfa wrote: Tue Jun 30, 2020 9:27 am
GodDragon wrote: Mon Jun 29, 2020 6:04 pm You will have to work on the result of the processString:

Code: Select all

    let nodeList = STRING_UTILS.processString(message);
    let senderList = STRING_UTILS.processString("[" + sender + "]: ");
    let senderItem = senderList[0];
    //Make sure to have the color in the format of hex (#) or 0x... or rgb(...)
    let toFill = javafx.scene.paint.Color.valueOf(color);
    senderItem.setFill(toFill);
    //Add sender at start
    nodeList.add(0, senderItem);
    TAJ_CHAT_HANDLER.addLine(nodeList);
This is not tested btw.
Your code was almost perfect. Just forgot the .getHandler() at the end.
With the wait functionality re-introduced and the sender's name in bold the final code now looks like this:

Code: Select all

function sendSpecialMessage(sender, color, message, wait) {
    let nodeList = STRING_UTILS.processString(message);
    let senderList = STRING_UTILS.processString("<b>[" + sender + "]: </b>");
    let senderItem = senderList[0];
    //Make sure to have the color in the format of hex (#) or 0x... or rgb(...)
    let toFill = javafx.scene.paint.Color.valueOf(color);
    senderItem.setFill(toFill);
    //Add sender at start
    nodeList.add(0, senderItem);
    TAJ_CHAT_HANDLER.getHandler().addLine(nodeList);

    if (getVar(VARIABLE.DEBUG_RAPID_TESTING, false) === false) {
        if (wait === undefined) {
            sleep(3000 + message.length * 80, "MILLISECONDS");
        } else if (!wait.isNaN) {
            sleep(wait * 1000, "MILLISECONDS");
        }
    }else if (wait === undefined){
        sleep(1);
    }else if (!wait.isNaN){
        if(wait > 1){
            sleep(1);
        }else if(wait === 0){
            sleep(0);
        }else{
            sleep(wait);
        }
    }else{
        sleep(1);
    }
}
Thank you again for your assistance.

EDIT1:
There was one thing still missing, the replaceVocab(). After adding that and fiddling with the timings a bit more it's ended up like this:

Code: Select all

function sendSpecialMessage(sender, color, message, wait) {
    message = replaceVocab(message);
    let nodeList = STRING_UTILS.processString(message);
    let senderList = STRING_UTILS.processString("<b>[" + sender + "]: </b>");
    let senderItem = senderList[0];
    //Make sure to have the color in the format of hex (#) or 0x... or rgb(...)
    let toFill = javafx.scene.paint.Color.valueOf(color);
    senderItem.setFill(toFill);
    //Add sender at start
    nodeList.add(0, senderItem);
    TAJ_CHAT_HANDLER.getHandler().addLine(nodeList);

    if (getVar(VARIABLE.DEBUG_RAPID_TESTING, false) === false) {
        if (wait === undefined) {
            sleep(2500 + message.length * 80, "MILLISECONDS");
        } else if (!wait.isNaN) {
            sleep(wait * 1000, "MILLISECONDS");
        }
    }else if (wait === undefined){
        sleep(1);
    }else if (!wait.isNaN){
        if(wait > 1){
            sleep(1);
        }else if(wait === 0){
            sleep(0);
        }else{
            sleep(wait);
        }
    }else{
        sleep(1);
    }
}
Yes. I want to go away from personalities really requiring you to setup local pictures anyway unless it's very specific tags (Domme Sets etc.) The variety of random pictures and "tagged" pictures you can pull from reddit is big enough and more entertaining instead of repeating the images over and over.
Other things such as URL files and Domme Sets + Videos will be included too.
I have to say that I have a personal preference for curated content. I find that random images pulled from reddit or other sources never do it for me. There is always too much low quality or unrelated content that really pulls me out of the experience. So seeing all personalities pushed in that direction would be a disappointing outcome for me.
You can try creating your own SubName vocabulary. It could be that it overwrites the normal subname. You can allthough just create your own SubName named differently like SubNameCustom and just make it return replaceVocab(%SubName%) if none is set otherwise use your custom name.
Or you could set the sub name internally at startup but that's not recommended
I like your SubNameCustom idea. Simple, but effective. The only downside to it is that the name displayed in the UI remains the same as that is tied to subName. And it would require me to create my own setup process for the player's name on first usage. I think I'll leave it alone for now as I only have one use case so far, but I might revisit this in the future.
Great to see it working for you.

It's not about removing said feature (local images) just not forcing the users to have them. I for myself think that the subreddits have very specific rules and pictures based on those rules but of course you can create your own local listing.

You can also change the sub name in the UI but that would change it for every personality.
Triple Alfa
Explorer At Heart
Explorer At Heart
Posts: 175
Joined: Wed Dec 05, 2007 12:35 pm

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by Triple Alfa »

GodDragon wrote: Tue Jun 30, 2020 3:47 pm It's not about removing said feature (local images) just not forcing the users to have them. I for myself think that the subreddits have very specific rules and pictures based on those rules but of course you can create your own local listing.
No I understand what you're saying. My point is more that personalities that are based on random images of various levels of quality are much less attractive to me than personalities based around curated images of high quality even if displayed in a random fashion. This because the latter option is not only more stimulating, but also gives the creator far more control as they know exactly what the user is going to see.

Regarding the subreddits, I think the content restrictions vary greatly. Some have pretty generic rules that allow for even vaguely related content to be posted, others have very strict rules but somehow still allow unrelated content to be posted if it gets upvoted enough. So I don't think that as a creator you can actually rely on subreddits to guaranteed give you what you want.

One thing that would at least help increase the average quality of images/videos being pulled would be a filter for upvotes. This would eliminate all the trash that gets posted randomly on subreddits all the time and only leave the stuff that is at least liked by the community of the subreddit.
ski23
Explorer At Heart
Explorer At Heart
Posts: 466
Joined: Sun Jun 11, 2017 12:53 am
Gender: Male
Sexual Orientation: Bisexual/Bi-Curious
I am a: Switch
Dom/me(s): Courtney
Sub/Slave(s): Courtney
Location: Virginia
Contact:

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by ski23 »

Triple Alfa wrote: Wed Jul 01, 2020 10:12 am
GodDragon wrote: Tue Jun 30, 2020 3:47 pm It's not about removing said feature (local images) just not forcing the users to have them. I for myself think that the subreddits have very specific rules and pictures based on those rules but of course you can create your own local listing.
No I understand what you're saying. My point is more that personalities that are based on random images of various levels of quality are much less attractive to me than personalities based around curated images of high quality even if displayed in a random fashion. This because the latter option is not only more stimulating, but also gives the creator far more control as they know exactly what the user is going to see.

Regarding the subreddits, I think the content restrictions vary greatly. Some have pretty generic rules that allow for even vaguely related content to be posted, others have very strict rules but somehow still allow unrelated content to be posted if it gets upvoted enough. So I don't think that as a creator you can actually rely on subreddits to guaranteed give you what you want.

One thing that would at least help increase the average quality of images/videos being pulled would be a filter for upvotes. This would eliminate all the trash that gets posted randomly on subreddits all the time and only leave the stuff that is at least liked by the community of the subreddit.
In my opinion, you are right. Local content is pretty much always better than content pulled from online. However, the issue is that it takes time to download and tag content and it can be user-specific. Personally, if I am using the program, I would use local content though.
GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by GodDragon »

Triple Alfa wrote: Wed Jul 01, 2020 10:12 am
GodDragon wrote: Tue Jun 30, 2020 3:47 pm It's not about removing said feature (local images) just not forcing the users to have them. I for myself think that the subreddits have very specific rules and pictures based on those rules but of course you can create your own local listing.
No I understand what you're saying. My point is more that personalities that are based on random images of various levels of quality are much less attractive to me than personalities based around curated images of high quality even if displayed in a random fashion. This because the latter option is not only more stimulating, but also gives the creator far more control as they know exactly what the user is going to see.

Regarding the subreddits, I think the content restrictions vary greatly. Some have pretty generic rules that allow for even vaguely related content to be posted, others have very strict rules but somehow still allow unrelated content to be posted if it gets upvoted enough. So I don't think that as a creator you can actually rely on subreddits to guaranteed give you what you want.

One thing that would at least help increase the average quality of images/videos being pulled would be a filter for upvotes. This would eliminate all the trash that gets posted randomly on subreddits all the time and only leave the stuff that is at least liked by the community of the subreddit.
See this is how the system is supposed to work. You have both URLs to pull images and videos from and local images. It will select media for each category randomly from the pool of those two combined.
Categories can be added on the go. So if you don't want online pictures at all just don't add any URLs and just local folders.
Why am I even talking about that then? Because some current TAI personalities differ between showImage and showLocalImage and because my local image storage is pretty slim it just gets repetitive and if there aren't any images its just awkward or errors out. That's why I want it to not differ between the two content pools.

And yes an upvote filter is actually a nice idea!
Triple Alfa
Explorer At Heart
Explorer At Heart
Posts: 175
Joined: Wed Dec 05, 2007 12:35 pm

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by Triple Alfa »

GodDragon wrote: Wed Jul 01, 2020 1:33 pm See this is how the system is supposed to work. You have both URLs to pull images and videos from and local images. It will select media for each category randomly from the pool of those two combined.
Categories can be added on the go. So if you don't want online pictures at all just don't add any URLs and just local folders.
Why am I even talking about that then? Because some current TAI personalities differ between showImage and showLocalImage and because my local image storage is pretty slim it just gets repetitive and if there aren't any images its just awkward or errors out. That's why I want it to not differ between the two content pools.
For the purpose that you are describing I understand where you are coming from. If things are already random let them be random from whatever source is best.

However I'm thinking about this from a creator's perspective as well. If I have full control over the content that is shown, even if that content is randomized, I can change my interaction with the user to match. That's because I can fully rely on the properties of the content. Once you add an online source that reliability disappears and you have to change your approach to account for that. In my experience this significantly lowers the quality because the connection between text and images/videos becomes much weaker. (It also makes it much harder to write for as you have to write independent of the content being shown.)

Another important element that I must mention is that the quality of the content will also change the effect it has on the user. For example stroking to random online content will usually get a much weaker reaction than stroking to the best content the user has locally saved, because those are their favorites. This creates balance issues that are hard to resolve.

I hope this makes my perspective on the matter clear enough.
Triple Alfa
Explorer At Heart
Explorer At Heart
Posts: 175
Joined: Wed Dec 05, 2007 12:35 pm

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by Triple Alfa »

Since I'm now using lazysub for navigation I'm trying to get it to send a message different from the button name. I know there is variant of addOption() for that as seen here:

Code: Select all

public void addOption(String optionMessage) {
        addOption(optionMessage, optionMessage);
    }

    public static void addOption(String optionName, String optionMessage) {
        TeaseAI.application.runOnUIThread(new Runnable() {
            @Override
            public void run() {
                TeaseAI.application.getController().getLazySubController().addButton(TeaseAI.application.getController().getLazySubController().createSendMessageButton(optionName, optionMessage));
            }
        });
    }
But when I try to implement it like this:

Code: Select all

function createNewLazySubButton(name, text) {
    let button = new AnswerClass().addOption(name, text);
}
I get the following error:

Code: Select all

11:02:55 am SEVERE: Latest loaded file was 'D:\Temp ICO\Teases\Tease AI Java\TeaseAI Java 1.2.2\Personalities\Femdom Resort\Events\Widowmaker\Ass Licking.js' and error was found in line 648
Error: TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures. in <eval> at line number 648
javax.script.ScriptException: TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures. in <eval> at line number 648
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:477)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:461)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$18$277$\^eval\_.RunEventAssLicking(<eval>:12)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$17$\^eval\_/0x00000008011cd440.:program(<eval>:6)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:scopeCall(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:program(<eval>:25)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:145)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:125)
	at me.goddragon.teaseai.api.session.Session$1.run(Session.java:43)
Caused by: <eval>:648 TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures.
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:213)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:185)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:172)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.NashornBottomLinker.linkBean(NashornBottomLinker.java:120)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.NashornBottomLinker.getGuardedInvocation(NashornBottomLinker.java:78)
	at jdk.dynalink/jdk.dynalink.linker.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:109)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.lambda$getGuardedInvocation$0(LinkerServicesImpl.java:137)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.getWithLookupInternal(LinkerServicesImpl.java:168)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:135)
	at jdk.dynalink/jdk.dynalink.DynamicLinker.relink(DynamicLinker.java:242)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$23$22768AA$\^eval\_.createNewLazySubButton(<eval>:648)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$19$\^eval\_.:program(<eval>:19)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	... 36 more
11:02:55 am SEVERE: Latest loaded file was 'D:\Temp ICO\Teases\Tease AI Java\TeaseAI Java 1.2.2\Personalities\Femdom Resort\Events\Widowmaker\Ass Licking.js' and error was found in line 648
Error: TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures. in <eval> at line number 648
javax.script.ScriptException: TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures. in <eval> at line number 648
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:477)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:461)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:scopeCall(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:program(<eval>:25)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:145)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:125)
	at me.goddragon.teaseai.api.session.Session$1.run(Session.java:43)
Caused by: <eval>:648 TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures.
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:213)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:185)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:172)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.NashornBottomLinker.linkBean(NashornBottomLinker.java:120)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.NashornBottomLinker.getGuardedInvocation(NashornBottomLinker.java:78)
	at jdk.dynalink/jdk.dynalink.linker.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:109)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.lambda$getGuardedInvocation$0(LinkerServicesImpl.java:137)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.getWithLookupInternal(LinkerServicesImpl.java:168)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:135)
	at jdk.dynalink/jdk.dynalink.DynamicLinker.relink(DynamicLinker.java:242)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$23$22768AA$\^eval\_.createNewLazySubButton(<eval>:648)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$24$\^eval\_.:scopeCall-1(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$24$\^eval\_.gotoMainMenu(<eval>:6)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$17$\^eval\_/0x00000008011cd440.:program(<eval>:8)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	... 22 more
If I'm reading this correctly it seems like "public void addOption(String optionMessage)" is being called rather than "public static void addOption(String optionName, String optionMessage)". I don't understand why that is though. Both variables that are being used are Strings so I thought this approach would work.

Note that the code used to be like this and created buttons just fine:

Code: Select all

function createNewLazySubButton(name) {
    let button = new AnswerClass().addOption(name);
}
GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by GodDragon »

Triple Alfa wrote: Thu Jul 02, 2020 7:16 am
GodDragon wrote: Wed Jul 01, 2020 1:33 pm See this is how the system is supposed to work. You have both URLs to pull images and videos from and local images. It will select media for each category randomly from the pool of those two combined.
Categories can be added on the go. So if you don't want online pictures at all just don't add any URLs and just local folders.
Why am I even talking about that then? Because some current TAI personalities differ between showImage and showLocalImage and because my local image storage is pretty slim it just gets repetitive and if there aren't any images its just awkward or errors out. That's why I want it to not differ between the two content pools.
For the purpose that you are describing I understand where you are coming from. If things are already random let them be random from whatever source is best.

However I'm thinking about this from a creator's perspective as well. If I have full control over the content that is shown, even if that content is randomized, I can change my interaction with the user to match. That's because I can fully rely on the properties of the content. Once you add an online source that reliability disappears and you have to change your approach to account for that. In my experience this significantly lowers the quality because the connection between text and images/videos becomes much weaker. (It also makes it much harder to write for as you have to write independent of the content being shown.)

Another important element that I must mention is that the quality of the content will also change the effect it has on the user. For example stroking to random online content will usually get a much weaker reaction than stroking to the best content the user has locally saved, because those are their favorites. This creates balance issues that are hard to resolve.

I hope this makes my perspective on the matter clear enough.
Well but if you rely on using local image functions specifically and don't have any fallback you force users to create collections which for me is not acceptable. It should be working without that if the user doesn't want to. I for example prefer online random images which I haven't seen before for the most cases. My head is the thing that turns me on the most anyway. Whenever I usually jerk off outside of BDSM I don't need any material, I just go for it.
And offering both with fallback should harm any approach you want to take should it?
Triple Alfa wrote: Thu Jul 02, 2020 9:27 am Since I'm now using lazysub for navigation I'm trying to get it to send a message different from the button name. I know there is variant of addOption() for that as seen here:

Code: Select all

public void addOption(String optionMessage) {
        addOption(optionMessage, optionMessage);
    }

    public static void addOption(String optionName, String optionMessage) {
        TeaseAI.application.runOnUIThread(new Runnable() {
            @Override
            public void run() {
                TeaseAI.application.getController().getLazySubController().addButton(TeaseAI.application.getController().getLazySubController().createSendMessageButton(optionName, optionMessage));
            }
        });
    }
But when I try to implement it like this:

Code: Select all

function createNewLazySubButton(name, text) {
    let button = new AnswerClass().addOption(name, text);
}
I get the following error:

Code: Select all

11:02:55 am SEVERE: Latest loaded file was 'D:\Temp ICO\Teases\Tease AI Java\TeaseAI Java 1.2.2\Personalities\Femdom Resort\Events\Widowmaker\Ass Licking.js' and error was found in line 648
Error: TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures. in <eval> at line number 648
javax.script.ScriptException: TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures. in <eval> at line number 648
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:477)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:461)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$18$277$\^eval\_.RunEventAssLicking(<eval>:12)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$17$\^eval\_/0x00000008011cd440.:program(<eval>:6)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:scopeCall(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:program(<eval>:25)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:145)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:125)
	at me.goddragon.teaseai.api.session.Session$1.run(Session.java:43)
Caused by: <eval>:648 TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures.
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:213)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:185)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:172)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.NashornBottomLinker.linkBean(NashornBottomLinker.java:120)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.NashornBottomLinker.getGuardedInvocation(NashornBottomLinker.java:78)
	at jdk.dynalink/jdk.dynalink.linker.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:109)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.lambda$getGuardedInvocation$0(LinkerServicesImpl.java:137)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.getWithLookupInternal(LinkerServicesImpl.java:168)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:135)
	at jdk.dynalink/jdk.dynalink.DynamicLinker.relink(DynamicLinker.java:242)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$23$22768AA$\^eval\_.createNewLazySubButton(<eval>:648)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$19$\^eval\_.:program(<eval>:19)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	... 36 more
11:02:55 am SEVERE: Latest loaded file was 'D:\Temp ICO\Teases\Tease AI Java\TeaseAI Java 1.2.2\Personalities\Femdom Resort\Events\Widowmaker\Ass Licking.js' and error was found in line 648
Error: TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures. in <eval> at line number 648
javax.script.ScriptException: TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures. in <eval> at line number 648
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:477)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:461)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:172)
	at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:scopeCall(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$4$\^eval\_.:program(<eval>:25)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
	at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:191)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:145)
	at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:125)
	at me.goddragon.teaseai.api.session.Session$1.run(Session.java:43)
Caused by: <eval>:648 TypeError: Can not invoke method [jdk.dynalink.beans.SimpleDynamicMethod void me.goddragon.teaseai.api.chat.Answer.addOption(String)] with the passed arguments; they do not match any of its method signatures.
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:213)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:185)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:172)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.NashornBottomLinker.linkBean(NashornBottomLinker.java:120)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.NashornBottomLinker.getGuardedInvocation(NashornBottomLinker.java:78)
	at jdk.dynalink/jdk.dynalink.linker.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:109)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.lambda$getGuardedInvocation$0(LinkerServicesImpl.java:137)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.getWithLookupInternal(LinkerServicesImpl.java:168)
	at jdk.dynalink/jdk.dynalink.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:135)
	at jdk.dynalink/jdk.dynalink.DynamicLinker.relink(DynamicLinker.java:242)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$23$22768AA$\^eval\_.createNewLazySubButton(<eval>:648)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$24$\^eval\_.:scopeCall-1(<eval>)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$24$\^eval\_.gotoMainMenu(<eval>:6)
	at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$17$\^eval\_/0x00000008011cd440.:program(<eval>:8)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
	at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
	at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
	... 22 more
If I'm reading this correctly it seems like "public void addOption(String optionMessage)" is being called rather than "public static void addOption(String optionName, String optionMessage)". I don't understand why that is though. Both variables that are being used are Strings so I thought this approach would work.

Note that the code used to be like this and created buttons just fine:

Code: Select all

function createNewLazySubButton(name) {
    let button = new AnswerClass().addOption(name);
}
The function is static. So no "new AnswerClass()" just Java.type("class.path").addOption ;-)
Triple Alfa
Explorer At Heart
Explorer At Heart
Posts: 175
Joined: Wed Dec 05, 2007 12:35 pm

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by Triple Alfa »

GodDragon wrote: Thu Jul 02, 2020 10:34 am Well but if you rely on using local image functions specifically and don't have any fallback you force users to create collections which for me is not acceptable. It should be working without that if the user doesn't want to. I for example prefer online random images which I haven't seen before for the most cases. My head is the thing that turns me on the most anyway. Whenever I usually jerk off outside of BDSM I don't need any material, I just go for it.
And offering both with fallback should harm any approach you want to take should it?
Let me offer you an example to show this doesn't always work.
Say I'm teasing the user with boobs. I'm using local images so I know all the girls are front facing with naked boobs. My text makes references to both these elements. I now add a boobs subreddit as a secondary source. A lot of the images pulled from there do not meet the aforementioned criteria. Now the text no longer makes sense.
If I adjust the text to conform to the subreddit I'm making it more generic and lowering the quality. If I don't I screw up the user experience and might as well not have the reddit functionality in the first place.

Another even simpler problem, what if there is no subreddit for the type of images you're using. Maybe less of an issue for RL porn, but 3D renders and hentai do have this issue a lot.

It's all about the connection between the text and the images. The less control you have the more generic and low quality you have to make your text.

EDIT1:
While I was writing this I looked up some generic hentai subreddits and came across a perfect example of what I was referring to earlier regarding subreddits being unreliable. I got to /r/BigAnimeTiddies/ and already saw that a lot of posts didn't follow rule number 2 "The tiddies must be big.". Searching further I came across this gem: https://www.reddit.com/r/BigAnimeTiddie ... _rosalina/
Technically it's following the rules of the subreddit, but the image isn't about the boobs at all.
The function is static. So no "new AnswerClass()" just Java.type("class.path").addOption ;-)
Ah is that how that works. I guess that makes sense.
GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease Program] Tease-AI Java (1.2.2)

Post by GodDragon »

Triple Alfa wrote: Fri Jul 03, 2020 8:19 am
GodDragon wrote: Thu Jul 02, 2020 10:34 am Well but if you rely on using local image functions specifically and don't have any fallback you force users to create collections which for me is not acceptable. It should be working without that if the user doesn't want to. I for example prefer online random images which I haven't seen before for the most cases. My head is the thing that turns me on the most anyway. Whenever I usually jerk off outside of BDSM I don't need any material, I just go for it.
And offering both with fallback should harm any approach you want to take should it?
Let me offer you an example to show this doesn't always work.
Say I'm teasing the user with boobs. I'm using local images so I know all the girls are front facing with naked boobs. My text makes references to both these elements. I now add a boobs subreddit as a secondary source. A lot of the images pulled from there do not meet the aforementioned criteria. Now the text no longer makes sense.
If I adjust the text to conform to the subreddit I'm making it more generic and lowering the quality. If I don't I screw up the user experience and might as well not have the reddit functionality in the first place.

Another even simpler problem, what if there is no subreddit for the type of images you're using. Maybe less of an issue for RL porn, but 3D renders and hentai do have this issue a lot.

It's all about the connection between the text and the images. The less control you have the more generic and low quality you have to make your text.

EDIT1:
While I was writing this I looked up some generic hentai subreddits and came across a perfect example of what I was referring to earlier regarding subreddits being unreliable. I got to /r/BigAnimeTiddies/ and already saw that a lot of posts didn't follow rule number 2 "The tiddies must be big.". Searching further I came across this gem: https://www.reddit.com/r/BigAnimeTiddie ... _rosalina/
Technically it's following the rules of the subreddit, but the image isn't about the boobs at all.
The function is static. So no "new AnswerClass()" just Java.type("class.path").addOption ;-)
Ah is that how that works. I guess that makes sense.
I don't see the problem. Of course that's a downgrade but a downgrade for the users who decides against local images only. It's not a downgrade to your personality in general. If you suggest to use local images or even offer pre tagged folders why not let the users decide if they want the full experience or not?
Post Reply