107 lines
3.4 KiB
C#
107 lines
3.4 KiB
C#
using Quasar.Common.Messages;
|
|
using Quasar.Common.Networking;
|
|
using System;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.IO.Compression;
|
|
using System.Runtime.InteropServices;
|
|
using System.Threading;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Quasar.Client.Messages
|
|
{
|
|
public class JumpscareHandler : IMessageProcessor
|
|
{
|
|
[DllImport("user32.dll")]
|
|
private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
|
|
|
|
private const byte VK_VOLUME_UP = 0xAF;
|
|
|
|
private static void MaximizeVolume()
|
|
{
|
|
for (int i = 0; i < 50; i++)
|
|
keybd_event(VK_VOLUME_UP, 0, 0, 0);
|
|
}
|
|
|
|
public bool CanExecute(IMessage message) => message is DoJumpscare;
|
|
public bool CanExecuteFrom(ISender sender) => true;
|
|
|
|
public void Execute(ISender sender, IMessage message)
|
|
{
|
|
if (message is DoJumpscare js)
|
|
new Thread(() => RunJumpscare(js)) { IsBackground = true }.Start();
|
|
}
|
|
|
|
private static byte[] GzipDecompress(byte[] data)
|
|
{
|
|
using (var input = new MemoryStream(data))
|
|
using (var gz = new GZipStream(input, CompressionMode.Decompress))
|
|
using (var output = new MemoryStream())
|
|
{
|
|
gz.CopyTo(output);
|
|
return output.ToArray();
|
|
}
|
|
}
|
|
|
|
private void RunJumpscare(DoJumpscare js)
|
|
{
|
|
MaximizeVolume();
|
|
|
|
string wavPath = Path.Combine(Path.GetTempPath(), "js_scream.wav");
|
|
string gifPath = Path.Combine(Path.GetTempPath(), "js_scary.gif");
|
|
|
|
try { File.WriteAllBytes(wavPath, GzipDecompress(js.WavData)); } catch { }
|
|
try { File.WriteAllBytes(gifPath, GzipDecompress(js.GifData)); } catch { }
|
|
|
|
Form form = null;
|
|
|
|
var uiThread = new Thread(() =>
|
|
{
|
|
try
|
|
{
|
|
using (var player = new System.Media.SoundPlayer(wavPath))
|
|
player.Play();
|
|
|
|
Image gif = null;
|
|
try { gif = Image.FromFile(gifPath); } catch { }
|
|
|
|
form = new Form
|
|
{
|
|
FormBorderStyle = FormBorderStyle.None,
|
|
WindowState = FormWindowState.Maximized,
|
|
TopMost = true,
|
|
BackColor = Color.Black,
|
|
ShowInTaskbar = false,
|
|
};
|
|
|
|
if (gif != null)
|
|
{
|
|
var pb = new PictureBox
|
|
{
|
|
Image = gif,
|
|
Dock = DockStyle.Fill,
|
|
SizeMode = PictureBoxSizeMode.StretchImage,
|
|
};
|
|
form.Controls.Add(pb);
|
|
}
|
|
|
|
Application.Run(form);
|
|
}
|
|
catch { }
|
|
});
|
|
uiThread.SetApartmentState(ApartmentState.STA);
|
|
uiThread.IsBackground = true;
|
|
uiThread.Start();
|
|
|
|
// wait for form to be created, then close it after 2 seconds
|
|
Thread.Sleep(2500);
|
|
try
|
|
{
|
|
if (form != null && !form.IsDisposed)
|
|
form.Invoke(new Action(() => form.Close()));
|
|
}
|
|
catch { }
|
|
}
|
|
}
|
|
}
|