2016-10-12 21:58:16 -07:00
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
//
|
|
|
|
|
// Copyright © 2016 Project Golan
|
|
|
|
|
//
|
|
|
|
|
// See "LICENSE" for more information.
|
|
|
|
|
//
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
//
|
|
|
|
|
// Useful utilities.
|
|
|
|
|
//
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
namespace ProjectGolan.Vrobot3
|
|
|
|
|
{
|
|
|
|
|
//
|
|
|
|
|
// Utils
|
|
|
|
|
//
|
|
|
|
|
public static partial class Utils
|
|
|
|
|
{
|
|
|
|
|
private static long RNDHash = 0x7f083dfd7f083dfd;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// List.AddItem
|
|
|
|
|
//
|
|
|
|
|
public static T AddItem<T>(this List<T> list, T item)
|
|
|
|
|
{
|
|
|
|
|
list.Add(item);
|
|
|
|
|
return item;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// GetRND
|
|
|
|
|
//
|
|
|
|
|
public static Random GetRND()
|
|
|
|
|
{
|
|
|
|
|
RNDHash *= DateTime.UtcNow.ToFileTime();
|
2016-10-27 17:57:00 -07:00
|
|
|
|
var rnd = new Random(unchecked((int)(RNDHash & 0x7fffffff)));
|
2016-10-12 21:58:16 -07:00
|
|
|
|
RNDHash ^= 0x7f8f8f8f8f8f8f8f;
|
|
|
|
|
RNDHash >>= 4;
|
|
|
|
|
RNDHash += 0x7f0000007f000000;
|
|
|
|
|
return rnd;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// GetArguments
|
|
|
|
|
//
|
|
|
|
|
public static String[] GetArguments(String msg, String help, int min,
|
|
|
|
|
int max = 0, char splitchr = ',')
|
|
|
|
|
{
|
|
|
|
|
char[] splitseq = { splitchr };
|
|
|
|
|
String[] split;
|
|
|
|
|
|
|
|
|
|
if(min == 1 && msg == String.Empty)
|
|
|
|
|
throw new CommandArgumentException(help);
|
|
|
|
|
|
2016-10-27 17:57:00 -07:00
|
|
|
|
split = max == 0 ? msg.Split(splitseq) : msg.Split(splitseq, max);
|
2016-10-12 21:58:16 -07:00
|
|
|
|
|
|
|
|
|
if(min >= 0 && split.Length < min)
|
|
|
|
|
throw new CommandArgumentException(help);
|
|
|
|
|
|
|
|
|
|
return split;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// SetRange
|
|
|
|
|
//
|
2016-10-27 17:57:00 -07:00
|
|
|
|
public static double SetRange(double x, double min, double max)
|
2016-10-12 21:58:16 -07:00
|
|
|
|
=> ((max - min) * x) + min;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// FuzzyRelativeDate
|
|
|
|
|
//
|
|
|
|
|
public static String FuzzyRelativeDate(DateTime then, DateTime now)
|
|
|
|
|
{
|
2016-10-27 17:57:00 -07:00
|
|
|
|
var span = now.Subtract(then);
|
2016-10-12 21:58:16 -07:00
|
|
|
|
|
|
|
|
|
if(span.Seconds == 0)
|
|
|
|
|
return "now";
|
|
|
|
|
|
2016-10-27 17:57:00 -07:00
|
|
|
|
var denom = span.Days > 0 ? "day" :
|
|
|
|
|
span.Hours > 0 ? "hour" :
|
|
|
|
|
span.Minutes > 0 ? "minute" :
|
|
|
|
|
"second";
|
2016-10-12 21:58:16 -07:00
|
|
|
|
|
|
|
|
|
int number;
|
|
|
|
|
switch(denom)
|
|
|
|
|
{
|
|
|
|
|
default: number = 0; break;
|
|
|
|
|
case "second": number = span.Seconds; break;
|
|
|
|
|
case "minute": number = span.Minutes; break;
|
|
|
|
|
case "hour": number = span.Hours; break;
|
|
|
|
|
case "day": number = span.Days; break;
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-27 17:57:00 -07:00
|
|
|
|
return $"{number} {denom}{number != 1 ? "s" : String.Empty} ago";
|
2016-10-12 21:58:16 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// FuzzyRelativeDate
|
|
|
|
|
//
|
|
|
|
|
public static String FuzzyRelativeDate(DateTime then)
|
|
|
|
|
=> FuzzyRelativeDate(then, DateTime.Now);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// GetResponseString
|
|
|
|
|
//
|
|
|
|
|
public static String GetResponseString(WebResponse resp, int maxsize)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2016-10-27 17:57:00 -07:00
|
|
|
|
var bufp = new byte[maxsize];
|
|
|
|
|
var read = 0;
|
2016-10-12 21:58:16 -07:00
|
|
|
|
|
|
|
|
|
using(var stream = resp.GetResponseStream())
|
2016-10-27 17:57:00 -07:00
|
|
|
|
if(stream != null)
|
|
|
|
|
read = stream.Read(bufp, 0, maxsize);
|
2016-10-12 21:58:16 -07:00
|
|
|
|
|
|
|
|
|
return Encoding.Default.GetString(bufp, 0, read);
|
|
|
|
|
}
|
|
|
|
|
catch(Exception exc)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("URL request error: {0}",
|
|
|
|
|
exc.Message ?? "[unknown]");
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// GetResponseString
|
|
|
|
|
//
|
|
|
|
|
public static String GetResponseString(String uri, int maxsize,
|
|
|
|
|
String referer = null)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var req = WebRequest.Create(uri);
|
|
|
|
|
|
|
|
|
|
if(referer != null)
|
|
|
|
|
{
|
|
|
|
|
var req_ = req as HttpWebRequest;
|
|
|
|
|
req_.Referer = referer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using(var resp = req.GetResponse())
|
|
|
|
|
return GetResponseString(resp, maxsize);
|
|
|
|
|
}
|
|
|
|
|
catch(Exception exc)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("URL request error: {0}",
|
|
|
|
|
exc.Message ?? "[unknown]");
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// TryParse
|
|
|
|
|
//
|
|
|
|
|
public static void TryParse(String str, String err, out double outp)
|
|
|
|
|
{
|
|
|
|
|
if(!double.TryParse(str, out outp))
|
|
|
|
|
throw new CommandArgumentException(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// TryParse
|
|
|
|
|
//
|
|
|
|
|
public static void TryParse(String str, String err, out int outp)
|
|
|
|
|
{
|
|
|
|
|
if(!int.TryParse(str, out outp))
|
|
|
|
|
throw new CommandArgumentException(err);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// EOF
|