1
0
Fork 0
vrobot3 is a chat bot for IRC and Discord.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
5.3 KiB

//-----------------------------------------------------------------------------
//
// Copyright © 2016 Project Golan
//
// See "LICENSE" for more information.
//
//-----------------------------------------------------------------------------
//
// Idgames search module.
// .idgames
//
//-----------------------------------------------------------------------------
using System;
using System.Net;
using System.Web;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Linq;
namespace ProjectGolan.Vrobot3.Modules
{
//
// Mod_Idgames
//
public class Mod_Idgames : IBotModule
{
private const String APIURI =
"http://doomworld.com/idgames/api/api.php";
private Random rnd = Utils.GetRND();
//
// Mod_Idgames constructor
//
public Mod_Idgames(Bot bot) :
base(bot)
{
commands["idgames"] = new BotCommandStructure{
cmd = cmdIdgames,
help = "Gets an entry from the idgames archive.\n" +
"Syntax: .idgames [name or ID[, type[, position]]]\n" +
"Example: .idgames scythe, filename, 4\n" +
"Example: .idgames"
};
}
//
// cmdIdgames
//
public void cmdIdgames(User usr, Channel channel, String msg)
{
var args = Utils.GetArguments(msg, commands["idgames"].help, 0, 3);
switch(args.Length)
{
default:
case 1:
int id;
if(args[0].Trim().Length == 0)
idgamesRandom(usr, channel);
else if(Int32.TryParse(args[0], out id))
idgamesID(usr, channel, id);
else
idgames(usr, channel, args[0]);
break;
case 2: idgames(usr, channel, args[0], args[1]); break;
case 3:
idgames(usr, channel, args[0], args[1], args[2].Trim());
break;
}
}
//
// idgamesRandom
//
private void idgamesRandom(User usr, Channel channel)
{
var req = WebRequest.Create("http://doomworld.com/idgames/?random")
as HttpWebRequest;
if(req == null) throw new CommandArgumentException("fug it borked");
req.Referer = "http://doomworld.com/idgames/";
bot.message(channel,
Discord.Format.Escape(req.GetResponse().ResponseUri.ToString()));
}
//
// idgamesID
//
private void idgamesID(User usr, Channel channel, int id)
{
var req = WebRequest.Create(APIURI + "?action=get&id=" + id)
as HttpWebRequest;
if(req == null) throw new CommandArgumentException("fug it borked");
using(var response = req.GetResponse())
{
var xml = XDocument.Load(response.GetResponseStream());
var x_title =
from item in xml.Descendants("title") select item.Value;
var x_uri = from item in xml.Descendants("url") select item.Value;
if(!x_title.Any())
{
bot.message(channel, "Nothing found.");
return;
}
bot.message(channel,
Discord.Format.Escape(x_title.First() + ": " + x_uri.First()));
}
}
//
// idgames
//
private void idgames(User usr, Channel channel, String inquiry,
String type = "title", String pos = "1")
{
var ipos = 0;
if(pos.ToLower() != "random")
{
Utils.TryParse(pos, "Invalid position.", out ipos);
if(ipos < 1)
throw new CommandArgumentException("Invalid position.");
ipos = ipos - 1;
}
inquiry = HttpUtility.UrlEncode(inquiry.Trim());
type = HttpUtility.UrlEncode(type.Trim().ToLower());
if(type == "name") type = "title"; // >_>'
String[] validtypes = {
"filename", "title", "author", "email",
"description", "credits", "editors", "textfile"
};
if(!validtypes.Contains(type))
throw new CommandArgumentException("Invalid inquiry type.");
var uri = APIURI + "?action=search&sort=rating&query=" + inquiry +
"&type=" + type;
var req = WebRequest.Create(uri);
Console.WriteLine("idgames query: {0}", uri);
using(var response = req.GetResponse())
{
var xml = XDocument.Load(response.GetResponseStream());
var x_titles =
from item in xml.Descendants("title") select item.Value;
var x_uris = from item in xml.Descendants("url") select item.Value;
if(!x_titles.Any())
{
bot.message(channel, "Nothing found.");
return;
}
if(pos == "random") ipos = rnd.Next(0, x_titles.Count());
if(ipos >= x_titles.Count()) ipos = x_titles.Count() - 1;
var title = x_titles.ElementAtOrDefault(ipos) ?? "invalid title";
if(title.Trim().Length > 0) title = "[ " + title + " ] ";
bot.message(channel,
Discord.Format.Escape(String.Format("({0} of {1}{4} {2}{3}",
ipos + 1, x_titles.Count(), title,
x_uris.ElementAtOrDefault(ipos),
x_titles.Count() >= 100 ? "+)" : ")")));
}
}
}
}