Register forum user name Search FAQ

Gammon Forum

Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to verify your details, confirm your email, resolve issues, making threats, or asking for money, are spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the password reset link.

Due to spam on this forum, all posts now need moderator approval.

 Entire forum ➜ MUSHclient ➜ General ➜ Prompt newline

Prompt newline

It is now over 60 days since the last post. This thread is closed.     Refresh page


Posted by Rmf113   (5 posts)  Bio
Date Mon 30 Jul 2012 11:23 PM (UTC)

Amended on Tue 31 Jul 2012 05:54 AM (UTC) by Nick Gammon

Message
Hi,

I've read all the previous posts regarding solutions for adding a newline after the prompt but I'm still unable to find a successful fix for my problem. Hopefully someone can point me in the right direction.

I want to trigger a newline on a prompt for filtering purposes. The prompt is very simple...


|1|*  


I took the Plugin (below) from an old post and modified the string.gsub to read


return (string.gsub (s, "\n%|1%|%*", "%1\n"))


However this is unsuccessful. Am I correct in thinking % is the correct escape character here rather than backslash? I did also try without escape characters but it won't trigger.


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE muclient>
<!-- Saved on Saturday, March 21, 2009, 11:42 PM -->
<!-- MuClient version 4.37 -->

<!-- Plugin "Add_NewLine_To_Prompt" generated by Plugin Wizard -->

<muclient>
<plugin
   name="Add_NewLine_To_Prompt"
   author="Nick Gammon"
   id="3862dd7f2ba50abfe50d4844"
   language="Lua"
   purpose="Forces a newline after a prompt line"
   date_written="2009-03-21 23:38:18"
   requires="4.37"
   version="1.0"
   >

</plugin>


<!--  Script  -->


<script>
<![CDATA[
function OnPluginPacketReceived (s)
  return (string.gsub (s, "%|1%|%*", "%1\n"))
end -- function OnPluginPacketReceived
]]>
</script>


</muclient>


The packet debug for the line looks as follows:


...[0;30;44m|1|.   0d 0a 1b 5b 30 3b 33 30 3b 34 34 6d 7c 31 7c 1b
[1;37;40m.[0;34;   5b 31 3b 33 37 3b 34 30 6d 1b 5b 30 3b 33 34 3b
40m.[1;34;40m*.[   34 30 6d 1b 5b 31 3b 33 34 3b 34 30 6d 2a 1b 5b 
0;34;40m.[1;37;4   30 3b 33 34 3b 34 30 6d 1b 5b 31 3b 33 37 3b 34
0m         	   30 6d


Code tags added. - Moderator
Top

Posted by Nick Gammon   Australia  (23,173 posts)  Bio   Forum Administrator
Date Reply #1 on Tue 31 Jul 2012 05:57 AM (UTC)
Message
You can see that after the newline (hex 0A) there is other stuff:


.[0;30;44m


The string.gsub needs to match that too. Or put in a wildcard, eg.


return (string.gsub (s, "\n.*%|1%|%*", "%1\n"))

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Rmf113   (5 posts)  Bio
Date Reply #2 on Tue 31 Jul 2012 10:28 PM (UTC)
Message
Thanks, that now triggers correctly. However I realise this is not going to achieve what I want as the newline is only cosmetic client side. What I need is a Carriage return /r to reset the prompt.

I thought I could use something simple like below to put a /r in front of the newline when sending my next line but this doesn't work.


function OnPluginCommandEntered (sText)
  return string.gsub (sText, "\n", "\r\n")
end -- function 


Basically what I'm trying to do is create a second window for watching another player. Much of this is fairly easy to setup as it is simply a trigger on the prompt at the beginning of the line to filter the output to the correct window.

My output has a basic prompt of *
The watched player output has a prompt of |1|*

Hence I just filter lines starting |1|* to the second dummy window.

The only problem I have is that when some watched data is sent in, my prompt line is still showing |1|* and so my command goes to the second window. This also happens the other way round... When I send a command, the first command from the watched player comes in with the standard * prompt and so goes to my main output window.

I therefore need a way to effectively reset the prompt before the line is filtered to the correct window by issuing a carriage return.

is OnPluginCommandEntered the correct function to use for this?
Top

Posted by Rmf113   (5 posts)  Bio
Date Reply #3 on Wed 01 Aug 2012 03:40 PM (UTC)

Amended on Wed 01 Aug 2012 03:45 PM (UTC) by Rmf113

Message
Decided to take a different approach by just using string.match on the packet and then sending a carriage return if the prompt line packet is found.

Need to test but it should work to revert the prompt for my commands. Not sure yet how I can do this in reverse (switch to the |1| prompt for watched users command) without initiating an infinite loop.



function OnPluginPacketReceived (s)

if string.match (s, "%[0;30;44m%|1%|.%[1;37;40m.%[0;34;40m.%[1;34;40m%*.%[0;34;40m.%[1;37;40m$") then
	Send ("\r")
end -- if
  return (s)
end -- function OnPluginPacketReceived

Top

Posted by Rmf113   (5 posts)  Bio
Date Reply #4 on Thu 02 Aug 2012 12:59 AM (UTC)
Message
Ok I'm getting there now. Went back to the beginning and started from scratch. What happens now is

-I record in a variable the last command that I sent out.
-I then check each incoming line for the prompt
-When prompt is matched, I check the line to see if it matches my last command sent out.
if it does, then it's a local command and I simply add a carriage return in front to revert the prompt.
if it does not, then it's a command from the remote player and so I will need to add the |1| to the front of the line if not present


<variables>
  <variable name="snoopcheck">N</variable>
  <variable name="commcheck">empty</variable>
</variables>

<!--  Script  -->


<script>
<![CDATA[


function OnPluginCommandEntered (sText)
  local snoopy = GetVariable ("snoopcheck")
-- only apply if actively snooping
  if string.match (snoopy, "Y") then 	
	newcommand = "\r\n" .. sText
	-- Note ("add CR")   	
  	return newcommand
  else 
	return sText
  end -- if
end -- function

function OnPluginSent (sText)
SetVariable ("commcheck", sText)
end -- function 

function OnPluginLineReceived (sText)
  local origin = GetVariable ("commcheck")
  test1 = sText

if (string.match (test1, "^%*") or string.match (test1, "^%|1%|%*"))  then -- line is a command
	-- Note ("Command issued")

if string.match (sText, origin) then
	--	Note ("Command was sent locally")
		world.SetVariable ("commcheck", "empty")
		-- No need to do anything else as OnPluginCommandEntered will issue /r to revert prompt
	else 
	--	Note ("Command was sent remotely")
		world.SetVariable ("commcheck", "empty")
		-- <code to add |1| to beginning of line if currently on standard prompt>
	end -- if
else 
 -- Note ("Not a command")
end -- if
	return true  -- display it
end -- function

]]>
</script>


Top

The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).

To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.


16,518 views.

It is now over 60 days since the last post. This thread is closed.     Refresh page

Go to topic:           Search the forum


[Go to top] top

Information and images on this site are licensed under the Creative Commons Attribution 3.0 Australia License unless stated otherwise.