diff --git a/SlackAPI.Tests/Connect.cs b/SlackAPI.Tests/Connect.cs index 0aee94d..a9ddbb7 100644 --- a/SlackAPI.Tests/Connect.cs +++ b/SlackAPI.Tests/Connect.cs @@ -21,9 +21,9 @@ public Connect(IntegrationFixture fixture) [Fact] public void TestConnectAsUser() { - var client = this.fixture.CreateUserClient(); - Assert.True(client.IsConnected, "Invalid, doesn't think it's connected."); - client.CloseSocket(); + var client = this.fixture.CreateUserClient(); + Assert.True(client.IsConnected, "Invalid, doesn't think it's connected."); + client.CloseSocket(); } [Fact] diff --git a/SlackAPI/Block.cs b/SlackAPI/Block.cs new file mode 100644 index 0000000..135d649 --- /dev/null +++ b/SlackAPI/Block.cs @@ -0,0 +1,459 @@ +namespace SlackAPI +{ + using System; + using System.Collections.Generic; + + using System.Globalization; + using System.Reflection; + using Newtonsoft.Json; + using Newtonsoft.Json.Converters; + using Newtonsoft.Json.Linq; + + [JsonConverter(typeof(JsonBlockConverter))] + public abstract class Block + { + [JsonProperty("type")] + public string Type { get; set; } + [JsonProperty("block_id")] + public string Block_ID { get; set; } + + private class JsonBlockConverter : JsonCreationConverter + { + protected override Block Create(Type objectType, JObject jsonObject) + { + var typeName = jsonObject["type"].ToString(); + switch (typeName) + { + case "section": + return new SectionBlock(); + case "divider": + return new DividerBlock(); + case "image": + return new ImageBlock(); + case "actions": + return new ActionBlock(); + case "context": + return new ContextBlock(); + default: return null; + } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + Block baseBlock = (Block)value; + JObject block = new JObject(); + block["type"] = baseBlock.Type; + if (baseBlock.Block_ID != null) + block["block_id"] = baseBlock.Block_ID; + if (value is SectionBlock) + { + SectionBlock derivedBlock = (SectionBlock)value; + if (derivedBlock.Fields != null) block["fields"] = JArray.FromObject(derivedBlock.Fields); + if (derivedBlock.Accessory != null) block["accessory"] = JObject.FromObject(derivedBlock.Accessory); + if (derivedBlock.Text != null) block["text"] = JObject.FromObject(derivedBlock.Text); + } + else if (value is ImageBlock) + { + ImageBlock derivedBlock = (ImageBlock)value; + if (derivedBlock.ImageURL != null) block["image_url"] = derivedBlock.ImageURL; + if (derivedBlock.AltText != null) block["alt_text"] = derivedBlock.AltText; + if (derivedBlock.Title != null) block["title"] = JObject.FromObject(derivedBlock.Title); + } + else if (value is ActionBlock) + { + ActionBlock derivedBlock = (ActionBlock)value; + if (derivedBlock.Elements != null) block["elements"] = JArray.FromObject(derivedBlock.Elements); + } + else if (value is ContextBlock) + { + ContextBlock derivedBlock = (ContextBlock)value; + if (derivedBlock.Elements != null) block["elements"] = JArray.FromObject(derivedBlock.Elements); + } + block.WriteTo(writer); + } + } + } + + public class SectionBlock : Block + { + [JsonProperty("fields")] + public SlackText[] Fields { get; set; } + [JsonProperty("accessory")] + public SlackElement Accessory { get; set; } + [JsonProperty("text")] + public SlackText Text { get; set; } + public SectionBlock() + { + Type = "section"; + } + } + + public class DividerBlock : Block + { + public DividerBlock() + { + Type = "divider"; + } + } + + public class ImageBlock : Block + { + [JsonProperty("image_url")] + public string ImageURL { get; set; } + [JsonProperty("alt_text")] + public string AltText { get; set; } + [JsonProperty("title")] + public SlackText Title { get; set; } + public ImageBlock() + { + Type = "image"; + } + } + + public class ActionBlock : Block + { + [JsonProperty("elements")] + public InteractiveElement[] Elements { get; set; } + public ActionBlock() + { + Type = "actions"; + } + } + + public class ContextBlock : Block + { + [JsonProperty("elements")] + public NonInteractiveElement[] Elements { get; set; } + public ContextBlock() + { + Type = "context"; + } + } + + [JsonConverter(typeof(JsonElementConverter))] + public abstract class SlackElement + { + [JsonProperty("type")] + public string Type { get; set; } + + private class JsonElementConverter : JsonCreationConverter + { + protected override SlackElement Create(Type objectType, JObject jsonObject) + { + var typeName = jsonObject["type"].ToString(); + switch (typeName) + { + case "mrkdwn": + return new SlackText(); + case "plain_text": + return new SlackText(); + case "image": + return new ImageElement(); + case "button": + return new ButtonElement(); + case "static_select": + return new StaticSelectElement(); + case "external_select": + return new ExternalSelectElement(); + case "users_select": + return new UserSelectElement(); + case "conversations_select": + return new ConversationSelectElement(); + case "channels_select": + return new ChannelSelectElement(); + case "overflow": + return new OverflowElement(); + case "datepicker": + return new DatePickerElement(); + default: return null; + } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + SlackElement baseElement = (SlackElement)value; + JObject jo = new JObject(); + jo["type"] = baseElement.Type; + if (value is SlackText) + { + SlackText derivedElement = (SlackText)value; + jo["text"] = derivedElement.Text; + if (derivedElement.Type != "mrkdwn") + { + jo["emoji"] = derivedElement.Emoji; + } + if (derivedElement.Type != "plain_text") + { + jo["verbatim"] = derivedElement.Verbatim; + } + } + else if (value is ImageElement) + { + ImageElement derivedElement = (ImageElement)value; + if (derivedElement.Image_URL != null) jo["image_url"] = derivedElement.Image_URL; + if (derivedElement.Alt_Text != null) jo["alt_text"] = derivedElement.Alt_Text; + } + else if (value is InteractiveElement) + { + InteractiveElement interactiveElement = (InteractiveElement)value; + jo["action_id"] = interactiveElement.Action_ID; + if (interactiveElement.Confirm != null) jo["confirm"] = JObject.FromObject(interactiveElement.Confirm); + if (value is ButtonElement) + { + ButtonElement buttonElement = (ButtonElement)value; + jo["text"] = JObject.FromObject(buttonElement.Text); + if (buttonElement.URL != null) jo["url"] = buttonElement.URL; + if (buttonElement.Value != null) jo["value"] = buttonElement.Value; + if (buttonElement.Style != null) jo["style"] = buttonElement.Style; + } + else if (value is SelectOrDatePickerElement) + { + SelectOrDatePickerElement selectOrDatePickerElement = (SelectOrDatePickerElement)value; + if (selectOrDatePickerElement.PlaceHolder != null) jo["placeholder"] = JObject.FromObject(selectOrDatePickerElement.PlaceHolder); + if (value is StaticSelectElement) + { + StaticSelectElement staticSelectElement = (StaticSelectElement)value; + if (staticSelectElement.Options != null) jo["options"] = JArray.FromObject(staticSelectElement.Options); + if (staticSelectElement.OptionGroups != null) jo["option_groups"] = JArray.FromObject(staticSelectElement.OptionGroups); + if (staticSelectElement.InitialOption != null) jo["initial_option"] = JArray.FromObject(staticSelectElement.InitialOption); + } + else if (value is ExternalSelectElement) + { + ExternalSelectElement externalSelectElement = (ExternalSelectElement)value; + if (externalSelectElement.InitialOption != null) jo["initial_option"] = JObject.FromObject(externalSelectElement.InitialOption); + if (externalSelectElement.MinQueryLength != 0) jo["min_query_length"] = externalSelectElement.MinQueryLength; + } + else if (value is UserSelectElement) + { + UserSelectElement userSelectElement = (UserSelectElement)value; + if (userSelectElement.InitialUser != null) jo["initial_user"] = JObject.FromObject(userSelectElement.InitialUser); + } + else if (value is ConversationSelectElement) + { + ConversationSelectElement conversationSelectElement = (ConversationSelectElement)value; + if (conversationSelectElement.InitialConversation != null) jo["initial_conversation"] = conversationSelectElement.InitialConversation; + } + else if (value is ChannelSelectElement) + { + ChannelSelectElement channelSelectElement = (ChannelSelectElement)value; + if (channelSelectElement.InitialChannel != null) jo["initial_channel"] = channelSelectElement.InitialChannel; + } + else if (value is DatePickerElement) + { + DatePickerElement datePickerElement = (DatePickerElement)value; + if (datePickerElement.InitialDate != null) jo["initial_date"] = datePickerElement.InitialDate; + } + else + { + throw new Exception("Unknown element type!"); + } + } + else if (value is OverflowElement) + { + OverflowElement overflowElement = (OverflowElement)value; + jo["options"] = JArray.FromObject(overflowElement.Options); + } + else + { + throw new Exception("Unknown element type!"); + } + } + else + { + throw new Exception("Unknown element type!"); + } + jo.WriteTo(writer); + } + } + } + + public abstract class NonInteractiveElement : SlackElement + { + + } + + public partial class SlackText : NonInteractiveElement + { + [JsonProperty("text")] + public string Text { get; set; } + [JsonProperty("emoji")] + public bool Emoji { get; set; } + [JsonProperty("verbatim")] + public bool Verbatim { get; set; } + } + + public class ImageElement : NonInteractiveElement + { + [JsonProperty("image_url")] + public string Image_URL { get; set; } + [JsonProperty("alt_text")] + public string Alt_Text { get; set; } + public ImageElement() + { + Type = "image"; + } + } + + public abstract class InteractiveElement : SlackElement + { + [JsonProperty("action_id")] + public string Action_ID { get; set; } + [JsonProperty("confirm")] + public SlackConfirm Confirm { get; set; } + } + + public class ButtonElement : InteractiveElement + { + [JsonProperty("text")] + public SlackText Text { get; set; } + [JsonProperty("url")] + public string URL { get; set; } + [JsonProperty("value")] + public string Value { get; set; } + [JsonProperty("style")] + public string Style { get; set; } + public ButtonElement() + { + Type = "button"; + } + } + + public abstract class SelectOrDatePickerElement : InteractiveElement + { + [JsonProperty("placeholder")] + public SlackText PlaceHolder { get; set; } + } + + public class StaticSelectElement : SelectOrDatePickerElement + { + [JsonProperty("options")] + public SlackOption[] Options { get; set; } + [JsonProperty("option_groups")] + public SlackOptionGroup[] OptionGroups { get; set; } + [JsonProperty("initial_option")] + public SlackOption InitialOption { get; set; } + public StaticSelectElement() + { + Type = "static_select"; + } + } + + public class ExternalSelectElement : SelectOrDatePickerElement + { + [JsonProperty("initial_option")] + public SlackOption InitialOption { get; set; } + [JsonProperty("min_query_length")] + public int MinQueryLength { get; set; } + public ExternalSelectElement() + { + Type = "external_select"; + } + } + + public class UserSelectElement : SelectOrDatePickerElement + { + [JsonProperty("initial_user")] + public string InitialUser { get; set; } + public UserSelectElement() + { + Type = "users_select"; + } + } + + public class ConversationSelectElement : SelectOrDatePickerElement + { + [JsonProperty("initial_conversation")] + public string InitialConversation { get; set; } + public ConversationSelectElement() + { + Type = "conversations_select"; + } + } + + public class ChannelSelectElement : SelectOrDatePickerElement + { + [JsonProperty("initial_channel")] + public string InitialChannel { get; set; } + public ChannelSelectElement() + { + Type = "channels_select"; + } + } + + public class DatePickerElement : SelectOrDatePickerElement + { + [JsonProperty("initial_date")] + public string InitialDate { get; set; } + public DatePickerElement() + { + Type = "datepicker"; + } + } + + public class OverflowElement : InteractiveElement + { + [JsonProperty("options")] + public SlackOption[] Options { get; set; } + public OverflowElement() + { + Type = "overflow"; + } + } + + public partial class SlackConfirm + { + [JsonProperty("title")] + public SlackText Title { get; set; } + [JsonProperty("text")] + public SlackText Text { get; set; } + [JsonProperty("confirm")] + public SlackText Confirm { get; set; } + [JsonProperty("deny")] + public SlackText Deny { get; set; } + } + + public partial class SlackOption + { + [JsonProperty("text")] + public SlackText Text { get; set; } + [JsonProperty("value")] + public string Value { get; set; } + } + + public partial class SlackOptionGroup + { + [JsonProperty("label")] + public SlackText Label { get; set; } + [JsonProperty("options")] + public SlackOption[] Options { get; set; } + } + + + public abstract class JsonCreationConverter : JsonConverter + { + protected abstract T Create(Type objectType, JObject jsonObject); + + public override bool CanConvert(Type objectType) + { + return typeof(T).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo()); + } + + public override object ReadJson(JsonReader reader, Type objectType, + object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + return null; + JObject jsonObject = JObject.Load(reader); + T target = Create(objectType, jsonObject); + serializer.Populate(jsonObject.CreateReader(), target); + return target; + } + + public override void WriteJson(JsonWriter writer, object value, + JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + +} diff --git a/SlackAPI/MimeTypes.cs b/SlackAPI/MimeTypes.cs index 9fb7794..e3ce60f 100644 --- a/SlackAPI/MimeTypes.cs +++ b/SlackAPI/MimeTypes.cs @@ -10,498 +10,498 @@ public static class MimeType { private static Dictionary MimeTypeDict = new Dictionary() - { - { "ez", "application/andrew-inset" }, - { "anx", "application/annodex" }, - { "atom", "application/atom+xml" }, - { "atomcat", "application/atomcat+xml" }, - { "atomsrv", "application/atomserv+xml" }, - { "lin", "application/bbolin" }, - { "cap", "application/cap" }, - { "pcap", "application/cap" }, - { "cu", "application/cu-seeme" }, - { "davmount", "application/davmount+xml" }, - { "tsp", "application/dsptype" }, - { "es", "application/ecmascript" }, - { "spl", "application/futuresplash" }, - { "hta", "application/hta" }, - { "jar", "application/java-archive" }, - { "ser", "application/java-serialized-object" }, - { "class", "application/java-vm" }, - { "js", "application/javascript" }, - { "json", "application/json" }, - { "m3g", "application/m3g" }, - { "hqx", "application/mac-binhex40" }, - { "cpt", "application/mac-compactpro" }, - { "nb", "application/mathematica" }, - { "nbp", "application/mathematica" }, - { "mdb", "application/msaccess" }, - { "doc", "application/msword" }, - { "dot", "application/msword" }, - { "mxf", "application/mxf" }, - { "bin", "application/octet-stream" }, - { "oda", "application/oda" }, - { "ogx", "application/ogg" }, - { "pdf", "application/pdf" }, - { "key", "application/pgp-keys" }, - { "pgp", "application/pgp-signature" }, - { "prf", "application/pics-rules" }, - { "ps", "application/postscript" }, - { "ai", "application/postscript" }, - { "eps", "application/postscript" }, - { "epsi", "application/postscript" }, - { "epsf", "application/postscript" }, - { "eps2", "application/postscript" }, - { "eps3", "application/postscript" }, - { "rar", "application/rar" }, - { "rdf", "application/rdf+xml" }, - { "rss", "application/rss+xml" }, - { "rtf", "application/rtf" }, - { "smi", "application/smil" }, - { "smil", "application/smil" }, - { "xhtml", "application/xhtml+xml" }, - { "xht", "application/xhtml+xml" }, - { "xml", "application/xml" }, - { "xsl", "application/xml" }, - { "xsd", "application/xml" }, - { "xspf", "application/xspf+xml" }, - { "zip", "application/zip" }, - { "apk", "application/vnd.android.package-archive" }, - { "cdy", "application/vnd.cinderella" }, - { "kml", "application/vnd.google-earth.kml+xml" }, - { "kmz", "application/vnd.google-earth.kmz" }, - { "xul", "application/vnd.mozilla.xul+xml" }, - { "xls", "application/vnd.ms-excel" }, - { "xlb", "application/vnd.ms-excel" }, - { "xlt", "application/vnd.ms-excel" }, - { "cat", "application/vnd.ms-pki.seccat" }, - { "stl", "application/vnd.ms-pki.stl" }, - { "ppt", "application/vnd.ms-powerpoint" }, - { "pps", "application/vnd.ms-powerpoint" }, - { "odc", "application/vnd.oasis.opendocument.chart" }, - { "odb", "application/vnd.oasis.opendocument.database" }, - { "odf", "application/vnd.oasis.opendocument.formula" }, - { "odg", "application/vnd.oasis.opendocument.graphics" }, - { "otg", "application/vnd.oasis.opendocument.graphics-template" }, - { "odi", "application/vnd.oasis.opendocument.image" }, - { "odp", "application/vnd.oasis.opendocument.presentation" }, - { "otp", "application/vnd.oasis.opendocument.presentation-template" }, - { "ods", "application/vnd.oasis.opendocument.spreadsheet" }, - { "ots", "application/vnd.oasis.opendocument.spreadsheet-template" }, - { "odt", "application/vnd.oasis.opendocument.text" }, - { "odm", "application/vnd.oasis.opendocument.text-master" }, - { "ott", "application/vnd.oasis.opendocument.text-template" }, - { "oth", "application/vnd.oasis.opendocument.text-web" }, - { "xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, - { "xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template" }, - { "pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" }, - { "ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow" }, - { "potx", "application/vnd.openxmlformats-officedocument.presentationml.template" }, - { "docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, - { "dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template" }, - { "cod", "application/vnd.rim.cod" }, - { "mmf", "application/vnd.smaf" }, - { "sdc", "application/vnd.stardivision.calc" }, - { "sds", "application/vnd.stardivision.chart" }, - { "sda", "application/vnd.stardivision.draw" }, - { "sdd", "application/vnd.stardivision.impress" }, - { "sdf", "application/vnd.stardivision.math" }, - { "sdw", "application/vnd.stardivision.writer" }, - { "sgl", "application/vnd.stardivision.writer-global" }, - { "sxc", "application/vnd.sun.xml.calc" }, - { "stc", "application/vnd.sun.xml.calc.template" }, - { "sxd", "application/vnd.sun.xml.draw" }, - { "std", "application/vnd.sun.xml.draw.template" }, - { "sxi", "application/vnd.sun.xml.impress" }, - { "sti", "application/vnd.sun.xml.impress.template" }, - { "sxm", "application/vnd.sun.xml.math" }, - { "sxw", "application/vnd.sun.xml.writer" }, - { "sxg", "application/vnd.sun.xml.writer.global" }, - { "stw", "application/vnd.sun.xml.writer.template" }, - { "sis", "application/vnd.symbian.install" }, - { "vsd", "application/vnd.visio" }, - { "wbxml", "application/vnd.wap.wbxml" }, - { "wmlc", "application/vnd.wap.wmlc" }, - { "wmlsc", "application/vnd.wap.wmlscriptc" }, - { "wpd", "application/vnd.wordperfect" }, - { "wp5", "application/vnd.wordperfect5.1" }, - { "wk", "application/x-123" }, - { "7z", "application/x-7z-compressed" }, - { "abw", "application/x-abiword" }, - { "dmg", "application/x-apple-diskimage" }, - { "bcpio", "application/x-bcpio" }, - { "torrent", "application/x-bittorrent" }, - { "cab", "application/x-cab" }, - { "cbr", "application/x-cbr" }, - { "cbz", "application/x-cbz" }, - { "cdf", "application/x-cdf" }, - { "cda", "application/x-cdf" }, - { "vcd", "application/x-cdlink" }, - { "pgn", "application/x-chess-pgn" }, - { "cpio", "application/x-cpio" }, - { "csh", "application/x-csh" }, - { "deb", "application/x-debian-package" }, - { "udeb", "application/x-debian-package" }, - { "dcr", "application/x-director" }, - { "dir", "application/x-director" }, - { "dxr", "application/x-director" }, - { "dms", "application/x-dms" }, - { "wad", "application/x-doom" }, - { "dvi", "application/x-dvi" }, - { "rhtml", "application/x-httpd-eruby" }, - { "pfa", "application/x-font" }, - { "pfb", "application/x-font" }, - { "gsf", "application/x-font" }, - { "pcf", "application/x-font" }, - { "pcf.Z", "application/x-font" }, - { "mm", "application/x-freemind" }, - { "gnumeric", "application/x-gnumeric" }, - { "sgf", "application/x-go-sgf" }, - { "gcf", "application/x-graphing-calculator" }, - { "gtar", "application/x-gtar" }, - { "tgz", "application/x-gtar" }, - { "taz", "application/x-gtar" }, - { "hdf", "application/x-hdf" }, - { "phtml", "application/x-httpd-php" }, - { "pht", "application/x-httpd-php" }, - { "php", "application/x-httpd-php" }, - { "phps", "application/x-httpd-php-source" }, - { "php3", "application/x-httpd-php3" }, - { "php3p", "application/x-httpd-php3-preprocessed" }, - { "php4", "application/x-httpd-php4" }, - { "php5", "application/x-httpd-php5" }, - { "ica", "application/x-ica" }, - { "info", "application/x-info" }, - { "ins", "application/x-internet-signup" }, - { "isp", "application/x-internet-signup" }, - { "iii", "application/x-iphone" }, - { "iso", "application/x-iso9660-image" }, - { "jam", "application/x-jam" }, - { "jnlp", "application/x-java-jnlp-file" }, - { "jmz", "application/x-jmol" }, - { "chrt", "application/x-kchart" }, - { "kil", "application/x-killustrator" }, - { "skp", "application/x-koan" }, - { "skd", "application/x-koan" }, - { "skt", "application/x-koan" }, - { "skm", "application/x-koan" }, - { "kpr", "application/x-kpresenter" }, - { "kpt", "application/x-kpresenter" }, - { "ksp", "application/x-kspread" }, - { "kwd", "application/x-kword" }, - { "kwt", "application/x-kword" }, - { "latex", "application/x-latex" }, - { "lha", "application/x-lha" }, - { "lyx", "application/x-lyx" }, - { "lzh", "application/x-lzh" }, - { "lzx", "application/x-lzx" }, - { "frm", "application/x-maker" }, - { "maker", "application/x-maker" }, - { "frame", "application/x-maker" }, - { "fm", "application/x-maker" }, - { "fb", "application/x-maker" }, - { "book", "application/x-maker" }, - { "fbdoc", "application/x-maker" }, - { "mif", "application/x-mif" }, - { "wmd", "application/x-ms-wmd" }, - { "wmz", "application/x-ms-wmz" }, - { "com", "application/x-msdos-program" }, - { "exe", "application/x-msdos-program" }, - { "bat", "application/x-msdos-program" }, - { "dll", "application/x-msdos-program" }, - { "msi", "application/x-msi" }, - { "nc", "application/x-netcdf" }, - { "pac", "application/x-ns-proxy-autoconfig" }, - { "dat", "application/x-ns-proxy-autoconfig" }, - { "nwc", "application/x-nwc" }, - { "o", "application/x-object" }, - { "oza", "application/x-oz-application" }, - { "p7r", "application/x-pkcs7-certreqresp" }, - { "crl", "application/x-pkcs7-crl" }, - { "pyc", "application/x-python-code" }, - { "pyo", "application/x-python-code" }, - { "qgs", "application/x-qgis" }, - { "shp", "application/x-qgis" }, - { "shx", "application/x-qgis" }, - { "qtl", "application/x-quicktimeplayer" }, - { "rpm", "application/x-redhat-package-manager" }, - { "rb", "application/x-ruby" }, - { "sh", "application/x-sh" }, - { "shar", "application/x-shar" }, - { "swf", "application/x-shockwave-flash" }, - { "swfl", "application/x-shockwave-flash" }, - { "scr", "application/x-silverlight" }, - { "sit", "application/x-stuffit" }, - { "sitx", "application/x-stuffit" }, - { "sv4cpio", "application/x-sv4cpio" }, - { "sv4crc", "application/x-sv4crc" }, - { "tar", "application/x-tar" }, - { "tcl", "application/x-tcl" }, - { "gf", "application/x-tex-gf" }, - { "pk", "application/x-tex-pk" }, - { "texinfo", "application/x-texinfo" }, - { "texi", "application/x-texinfo" }, - { "~", "application/x-trash" }, - { "%", "application/x-trash" }, - { "bak", "application/x-trash" }, - { "old", "application/x-trash" }, - { "sik", "application/x-trash" }, - { "t", "application/x-troff" }, - { "tr", "application/x-troff" }, - { "roff", "application/x-troff" }, - { "man", "application/x-troff-man" }, - { "me", "application/x-troff-me" }, - { "ms", "application/x-troff-ms" }, - { "ustar", "application/x-ustar" }, - { "src", "application/x-wais-source" }, - { "wz", "application/x-wingz" }, - { "crt", "application/x-x509-ca-cert" }, - { "xcf", "application/x-xcf" }, - { "fig", "application/x-xfig" }, - { "xpi", "application/x-xpinstall" }, - { "amr", "audio/amr" }, - { "awb", "audio/amr-wb" }, - { "axa", "audio/annodex" }, - { "au", "audio/basic" }, - { "snd", "audio/basic" }, - { "flac", "audio/flac" }, - { "mid", "audio/midi" }, - { "midi", "audio/midi" }, - { "kar", "audio/midi" }, - { "mpga", "audio/mpeg" }, - { "mpega", "audio/mpeg" }, - { "mp2", "audio/mpeg" }, - { "mp3", "audio/mpeg" }, - { "m4a", "audio/mpeg" }, - { "m3u", "audio/mpegurl" }, - { "oga", "audio/ogg" }, - { "ogg", "audio/ogg" }, - { "spx", "audio/ogg" }, - { "sid", "audio/prs.sid" }, - { "aif", "audio/x-aiff" }, - { "aiff", "audio/x-aiff" }, - { "aifc", "audio/x-aiff" }, - { "gsm", "audio/x-gsm" }, - { "wma", "audio/x-ms-wma" }, - { "wax", "audio/x-ms-wax" }, - { "ra", "audio/x-pn-realaudio" }, - { "rm", "audio/x-pn-realaudio" }, - { "ram", "audio/x-pn-realaudio" }, - { "pls", "audio/x-scpls" }, - { "sd2", "audio/x-sd2" }, - { "wav", "audio/x-wav" }, - { "alc", "chemical/x-alchemy" }, - { "cac", "chemical/x-cache" }, - { "cache", "chemical/x-cache" }, - { "csf", "chemical/x-cache-csf" }, - { "cbin", "chemical/x-cactvs-binary" }, - { "cascii", "chemical/x-cactvs-binary" }, - { "ctab", "chemical/x-cactvs-binary" }, - { "cdx", "chemical/x-cdx" }, - { "cer", "chemical/x-cerius" }, - { "c3d", "chemical/x-chem3d" }, - { "chm", "chemical/x-chemdraw" }, - { "cif", "chemical/x-cif" }, - { "cmdf", "chemical/x-cmdf" }, - { "cml", "chemical/x-cml" }, - { "cpa", "chemical/x-compass" }, - { "bsd", "chemical/x-crossfire" }, - { "csml", "chemical/x-csml" }, - { "csm", "chemical/x-csml" }, - { "ctx", "chemical/x-ctx" }, - { "cxf", "chemical/x-cxf" }, - { "cef", "chemical/x-cxf" }, - { "emb", "chemical/x-embl-dl-nucleotide" }, - { "embl", "chemical/x-embl-dl-nucleotide" }, - { "spc", "chemical/x-galactic-spc" }, - { "inp", "chemical/x-gamess-input" }, - { "gam", "chemical/x-gamess-input" }, - { "gamin", "chemical/x-gamess-input" }, - { "fch", "chemical/x-gaussian-checkpoint" }, - { "fchk", "chemical/x-gaussian-checkpoint" }, - { "cub", "chemical/x-gaussian-cube" }, - { "gau", "chemical/x-gaussian-input" }, - { "gjc", "chemical/x-gaussian-input" }, - { "gjf", "chemical/x-gaussian-input" }, - { "gal", "chemical/x-gaussian-log" }, - { "gcg", "chemical/x-gcg8-sequence" }, - { "gen", "chemical/x-genbank" }, - { "hin", "chemical/x-hin" }, - { "istr", "chemical/x-isostar" }, - { "ist", "chemical/x-isostar" }, - { "jdx", "chemical/x-jcamp-dx" }, - { "dx", "chemical/x-jcamp-dx" }, - { "kin", "chemical/x-kinemage" }, - { "mcm", "chemical/x-macmolecule" }, - { "mmd", "chemical/x-macromodel-input" }, - { "mmod", "chemical/x-macromodel-input" }, - { "mol", "chemical/x-mdl-molfile" }, - { "rd", "chemical/x-mdl-rdfile" }, - { "rxn", "chemical/x-mdl-rxnfile" }, - { "sd", "chemical/x-mdl-sdfile" }, - { "tgf", "chemical/x-mdl-tgf" }, - { "mcif", "chemical/x-mmcif" }, - { "mol2", "chemical/x-mol2" }, - { "b", "chemical/x-molconn-Z" }, - { "gpt", "chemical/x-mopac-graph" }, - { "mop", "chemical/x-mopac-input" }, - { "mopcrt", "chemical/x-mopac-input" }, - { "mpc", "chemical/x-mopac-input" }, - { "zmt", "chemical/x-mopac-input" }, - { "moo", "chemical/x-mopac-out" }, - { "mvb", "chemical/x-mopac-vib" }, - { "asn", "chemical/x-ncbi-asn1" }, - { "prt", "chemical/x-ncbi-asn1-ascii" }, - { "ent", "chemical/x-ncbi-asn1-ascii" }, - { "val", "chemical/x-ncbi-asn1-binary" }, - { "aso", "chemical/x-ncbi-asn1-binary" }, - { "pdb", "chemical/x-pdb" }, - { "ros", "chemical/x-rosdal" }, - { "sw", "chemical/x-swissprot" }, - { "vms", "chemical/x-vamas-iso14976" }, - { "vmd", "chemical/x-vmd" }, - { "xtel", "chemical/x-xtel" }, - { "xyz", "chemical/x-xyz" }, - { "gif", "image/gif" }, - { "ief", "image/ief" }, - { "jpeg", "image/jpeg" }, - { "jpg", "image/jpeg" }, - { "jpe", "image/jpeg" }, - { "pcx", "image/pcx" }, - { "png", "image/png" }, - { "svg", "image/svg+xml" }, - { "svgz", "image/svg+xml" }, - { "tiff", "image/tiff" }, - { "tif", "image/tiff" }, - { "djvu", "image/vnd.djvu" }, - { "djv", "image/vnd.djvu" }, - { "wbmp", "image/vnd.wap.wbmp" }, - { "cr2", "image/x-canon-cr2" }, - { "crw", "image/x-canon-crw" }, - { "ras", "image/x-cmu-raster" }, - { "cdr", "image/x-coreldraw" }, - { "pat", "image/x-coreldrawpattern" }, - { "cdt", "image/x-coreldrawtemplate" }, - { "erf", "image/x-epson-erf" }, - { "ico", "image/x-icon" }, - { "art", "image/x-jg" }, - { "jng", "image/x-jng" }, - { "bmp", "image/x-ms-bmp" }, - { "nef", "image/x-nikon-nef" }, - { "orf", "image/x-olympus-orf" }, - { "psd", "image/x-photoshop" }, - { "pnm", "image/x-portable-anymap" }, - { "pbm", "image/x-portable-bitmap" }, - { "pgm", "image/x-portable-graymap" }, - { "ppm", "image/x-portable-pixmap" }, - { "rgb", "image/x-rgb" }, - { "xbm", "image/x-xbitmap" }, - { "xpm", "image/x-xpixmap" }, - { "xwd", "image/x-xwindowdump" }, - { "eml", "message/rfc822" }, - { "igs", "model/iges" }, - { "iges", "model/iges" }, - { "msh", "model/mesh" }, - { "mesh", "model/mesh" }, - { "silo", "model/mesh" }, - { "wrl", "model/vrml" }, - { "vrml", "model/vrml" }, - { "x3dv", "model/x3d+vrml" }, - { "x3d", "model/x3d+xml" }, - { "x3db", "model/x3d+binary" }, - { "manifest", "text/cache-manifest" }, - { "ics", "text/calendar" }, - { "icz", "text/calendar" }, - { "css", "text/css" }, - { "csv", "text/csv" }, - { "323", "text/h323" }, - { "html", "text/html" }, - { "htm", "text/html" }, - { "shtml", "text/html" }, - { "uls", "text/iuls" }, - { "mml", "text/mathml" }, - { "asc", "text/plain" }, - { "txt", "text/plain" }, - { "text", "text/plain" }, - { "pot", "text/plain" }, - { "brf", "text/plain" }, - { "rtx", "text/richtext" }, - { "sct", "text/scriptlet" }, - { "wsc", "text/scriptlet" }, - { "tm", "text/texmacs" }, - { "ts", "text/texmacs" }, - { "tsv", "text/tab-separated-values" }, - { "jad", "text/vnd.sun.j2me.app-descriptor" }, - { "wml", "text/vnd.wap.wml" }, - { "wmls", "text/vnd.wap.wmlscript" }, - { "bib", "text/x-bibtex" }, - { "boo", "text/x-boo" }, - { "h++", "text/x-c++hdr" }, - { "hpp", "text/x-c++hdr" }, - { "hxx", "text/x-c++hdr" }, - { "hh", "text/x-c++hdr" }, - { "c++", "text/x-c++src" }, - { "cpp", "text/x-c++src" }, - { "cxx", "text/x-c++src" }, - { "cc", "text/x-c++src" }, - { "h", "text/x-chdr" }, - { "htc", "text/x-component" }, - { "c", "text/x-csrc" }, - { "d", "text/x-dsrc" }, - { "diff", "text/x-diff" }, - { "patch", "text/x-diff" }, - { "hs", "text/x-haskell" }, - { "java", "text/x-java" }, - { "lhs", "text/x-literate-haskell" }, - { "moc", "text/x-moc" }, - { "p", "text/x-pascal" }, - { "pas", "text/x-pascal" }, - { "gcd", "text/x-pcs-gcd" }, - { "pl", "text/x-perl" }, - { "pm", "text/x-perl" }, - { "py", "text/x-python" }, - { "scala", "text/x-scala" }, - { "etx", "text/x-setext" }, - { "tk", "text/x-tcl" }, - { "tex", "text/x-tex" }, - { "ltx", "text/x-tex" }, - { "sty", "text/x-tex" }, - { "cls", "text/x-tex" }, - { "vcs", "text/x-vcalendar" }, - { "vcf", "text/x-vcard" }, - { "3gp", "video/3gpp" }, - { "axv", "video/annodex" }, - { "dl", "video/dl" }, - { "dif", "video/dv" }, - { "dv", "video/dv" }, - { "fli", "video/fli" }, - { "gl", "video/gl" }, - { "mpeg", "video/mpeg" }, - { "mpg", "video/mpeg" }, - { "mpe", "video/mpeg" }, - { "mp4", "video/mp4" }, - { "qt", "video/quicktime" }, - { "mov", "video/quicktime" }, - { "ogv", "video/ogg" }, - { "mxu", "video/vnd.mpegurl" }, - { "flv", "video/x-flv" }, - { "lsf", "video/x-la-asf" }, - { "lsx", "video/x-la-asf" }, - { "mng", "video/x-mng" }, - { "asf", "video/x-ms-asf" }, - { "asx", "video/x-ms-asf" }, - { "wm", "video/x-ms-wm" }, - { "wmv", "video/x-ms-wmv" }, - { "wmx", "video/x-ms-wmx" }, - { "wvx", "video/x-ms-wvx" }, - { "avi", "video/x-msvideo" }, - { "movie", "video/x-sgi-movie" }, - { "mpv", "video/x-matroska" }, - { "mkv", "video/x-matroska" }, - { "ice", "x-conference/x-cooltalk" }, - { "sisx", "x-epoc/x-sisx-app" }, - { "vrm", "x-world/x-vrml" } - }; + { + { "ez", "application/andrew-inset" }, + { "anx", "application/annodex" }, + { "atom", "application/atom+xml" }, + { "atomcat", "application/atomcat+xml" }, + { "atomsrv", "application/atomserv+xml" }, + { "lin", "application/bbolin" }, + { "cap", "application/cap" }, + { "pcap", "application/cap" }, + { "cu", "application/cu-seeme" }, + { "davmount", "application/davmount+xml" }, + { "tsp", "application/dsptype" }, + { "es", "application/ecmascript" }, + { "spl", "application/futuresplash" }, + { "hta", "application/hta" }, + { "jar", "application/java-archive" }, + { "ser", "application/java-serialized-object" }, + { "class", "application/java-vm" }, + { "js", "application/javascript" }, + { "json", "application/json" }, + { "m3g", "application/m3g" }, + { "hqx", "application/mac-binhex40" }, + { "cpt", "application/mac-compactpro" }, + { "nb", "application/mathematica" }, + { "nbp", "application/mathematica" }, + { "mdb", "application/msaccess" }, + { "doc", "application/msword" }, + { "dot", "application/msword" }, + { "mxf", "application/mxf" }, + { "bin", "application/octet-stream" }, + { "oda", "application/oda" }, + { "ogx", "application/ogg" }, + { "pdf", "application/pdf" }, + { "key", "application/pgp-keys" }, + { "pgp", "application/pgp-signature" }, + { "prf", "application/pics-rules" }, + { "ps", "application/postscript" }, + { "ai", "application/postscript" }, + { "eps", "application/postscript" }, + { "epsi", "application/postscript" }, + { "epsf", "application/postscript" }, + { "eps2", "application/postscript" }, + { "eps3", "application/postscript" }, + { "rar", "application/rar" }, + { "rdf", "application/rdf+xml" }, + { "rss", "application/rss+xml" }, + { "rtf", "application/rtf" }, + { "smi", "application/smil" }, + { "smil", "application/smil" }, + { "xhtml", "application/xhtml+xml" }, + { "xht", "application/xhtml+xml" }, + { "xml", "application/xml" }, + { "xsl", "application/xml" }, + { "xsd", "application/xml" }, + { "xspf", "application/xspf+xml" }, + { "zip", "application/zip" }, + { "apk", "application/vnd.android.package-archive" }, + { "cdy", "application/vnd.cinderella" }, + { "kml", "application/vnd.google-earth.kml+xml" }, + { "kmz", "application/vnd.google-earth.kmz" }, + { "xul", "application/vnd.mozilla.xul+xml" }, + { "xls", "application/vnd.ms-excel" }, + { "xlb", "application/vnd.ms-excel" }, + { "xlt", "application/vnd.ms-excel" }, + { "cat", "application/vnd.ms-pki.seccat" }, + { "stl", "application/vnd.ms-pki.stl" }, + { "ppt", "application/vnd.ms-powerpoint" }, + { "pps", "application/vnd.ms-powerpoint" }, + { "odc", "application/vnd.oasis.opendocument.chart" }, + { "odb", "application/vnd.oasis.opendocument.database" }, + { "odf", "application/vnd.oasis.opendocument.formula" }, + { "odg", "application/vnd.oasis.opendocument.graphics" }, + { "otg", "application/vnd.oasis.opendocument.graphics-template" }, + { "odi", "application/vnd.oasis.opendocument.image" }, + { "odp", "application/vnd.oasis.opendocument.presentation" }, + { "otp", "application/vnd.oasis.opendocument.presentation-template" }, + { "ods", "application/vnd.oasis.opendocument.spreadsheet" }, + { "ots", "application/vnd.oasis.opendocument.spreadsheet-template" }, + { "odt", "application/vnd.oasis.opendocument.text" }, + { "odm", "application/vnd.oasis.opendocument.text-master" }, + { "ott", "application/vnd.oasis.opendocument.text-template" }, + { "oth", "application/vnd.oasis.opendocument.text-web" }, + { "xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, + { "xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template" }, + { "pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" }, + { "ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow" }, + { "potx", "application/vnd.openxmlformats-officedocument.presentationml.template" }, + { "docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, + { "dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template" }, + { "cod", "application/vnd.rim.cod" }, + { "mmf", "application/vnd.smaf" }, + { "sdc", "application/vnd.stardivision.calc" }, + { "sds", "application/vnd.stardivision.chart" }, + { "sda", "application/vnd.stardivision.draw" }, + { "sdd", "application/vnd.stardivision.impress" }, + { "sdf", "application/vnd.stardivision.math" }, + { "sdw", "application/vnd.stardivision.writer" }, + { "sgl", "application/vnd.stardivision.writer-global" }, + { "sxc", "application/vnd.sun.xml.calc" }, + { "stc", "application/vnd.sun.xml.calc.template" }, + { "sxd", "application/vnd.sun.xml.draw" }, + { "std", "application/vnd.sun.xml.draw.template" }, + { "sxi", "application/vnd.sun.xml.impress" }, + { "sti", "application/vnd.sun.xml.impress.template" }, + { "sxm", "application/vnd.sun.xml.math" }, + { "sxw", "application/vnd.sun.xml.writer" }, + { "sxg", "application/vnd.sun.xml.writer.global" }, + { "stw", "application/vnd.sun.xml.writer.template" }, + { "sis", "application/vnd.symbian.install" }, + { "vsd", "application/vnd.visio" }, + { "wbxml", "application/vnd.wap.wbxml" }, + { "wmlc", "application/vnd.wap.wmlc" }, + { "wmlsc", "application/vnd.wap.wmlscriptc" }, + { "wpd", "application/vnd.wordperfect" }, + { "wp5", "application/vnd.wordperfect5.1" }, + { "wk", "application/x-123" }, + { "7z", "application/x-7z-compressed" }, + { "abw", "application/x-abiword" }, + { "dmg", "application/x-apple-diskimage" }, + { "bcpio", "application/x-bcpio" }, + { "torrent", "application/x-bittorrent" }, + { "cab", "application/x-cab" }, + { "cbr", "application/x-cbr" }, + { "cbz", "application/x-cbz" }, + { "cdf", "application/x-cdf" }, + { "cda", "application/x-cdf" }, + { "vcd", "application/x-cdlink" }, + { "pgn", "application/x-chess-pgn" }, + { "cpio", "application/x-cpio" }, + { "csh", "application/x-csh" }, + { "deb", "application/x-debian-package" }, + { "udeb", "application/x-debian-package" }, + { "dcr", "application/x-director" }, + { "dir", "application/x-director" }, + { "dxr", "application/x-director" }, + { "dms", "application/x-dms" }, + { "wad", "application/x-doom" }, + { "dvi", "application/x-dvi" }, + { "rhtml", "application/x-httpd-eruby" }, + { "pfa", "application/x-font" }, + { "pfb", "application/x-font" }, + { "gsf", "application/x-font" }, + { "pcf", "application/x-font" }, + { "pcf.Z", "application/x-font" }, + { "mm", "application/x-freemind" }, + { "gnumeric", "application/x-gnumeric" }, + { "sgf", "application/x-go-sgf" }, + { "gcf", "application/x-graphing-calculator" }, + { "gtar", "application/x-gtar" }, + { "tgz", "application/x-gtar" }, + { "taz", "application/x-gtar" }, + { "hdf", "application/x-hdf" }, + { "phtml", "application/x-httpd-php" }, + { "pht", "application/x-httpd-php" }, + { "php", "application/x-httpd-php" }, + { "phps", "application/x-httpd-php-source" }, + { "php3", "application/x-httpd-php3" }, + { "php3p", "application/x-httpd-php3-preprocessed" }, + { "php4", "application/x-httpd-php4" }, + { "php5", "application/x-httpd-php5" }, + { "ica", "application/x-ica" }, + { "info", "application/x-info" }, + { "ins", "application/x-internet-signup" }, + { "isp", "application/x-internet-signup" }, + { "iii", "application/x-iphone" }, + { "iso", "application/x-iso9660-image" }, + { "jam", "application/x-jam" }, + { "jnlp", "application/x-java-jnlp-file" }, + { "jmz", "application/x-jmol" }, + { "chrt", "application/x-kchart" }, + { "kil", "application/x-killustrator" }, + { "skp", "application/x-koan" }, + { "skd", "application/x-koan" }, + { "skt", "application/x-koan" }, + { "skm", "application/x-koan" }, + { "kpr", "application/x-kpresenter" }, + { "kpt", "application/x-kpresenter" }, + { "ksp", "application/x-kspread" }, + { "kwd", "application/x-kword" }, + { "kwt", "application/x-kword" }, + { "latex", "application/x-latex" }, + { "lha", "application/x-lha" }, + { "lyx", "application/x-lyx" }, + { "lzh", "application/x-lzh" }, + { "lzx", "application/x-lzx" }, + { "frm", "application/x-maker" }, + { "maker", "application/x-maker" }, + { "frame", "application/x-maker" }, + { "fm", "application/x-maker" }, + { "fb", "application/x-maker" }, + { "book", "application/x-maker" }, + { "fbdoc", "application/x-maker" }, + { "mif", "application/x-mif" }, + { "wmd", "application/x-ms-wmd" }, + { "wmz", "application/x-ms-wmz" }, + { "com", "application/x-msdos-program" }, + { "exe", "application/x-msdos-program" }, + { "bat", "application/x-msdos-program" }, + { "dll", "application/x-msdos-program" }, + { "msi", "application/x-msi" }, + { "nc", "application/x-netcdf" }, + { "pac", "application/x-ns-proxy-autoconfig" }, + { "dat", "application/x-ns-proxy-autoconfig" }, + { "nwc", "application/x-nwc" }, + { "o", "application/x-object" }, + { "oza", "application/x-oz-application" }, + { "p7r", "application/x-pkcs7-certreqresp" }, + { "crl", "application/x-pkcs7-crl" }, + { "pyc", "application/x-python-code" }, + { "pyo", "application/x-python-code" }, + { "qgs", "application/x-qgis" }, + { "shp", "application/x-qgis" }, + { "shx", "application/x-qgis" }, + { "qtl", "application/x-quicktimeplayer" }, + { "rpm", "application/x-redhat-package-manager" }, + { "rb", "application/x-ruby" }, + { "sh", "application/x-sh" }, + { "shar", "application/x-shar" }, + { "swf", "application/x-shockwave-flash" }, + { "swfl", "application/x-shockwave-flash" }, + { "scr", "application/x-silverlight" }, + { "sit", "application/x-stuffit" }, + { "sitx", "application/x-stuffit" }, + { "sv4cpio", "application/x-sv4cpio" }, + { "sv4crc", "application/x-sv4crc" }, + { "tar", "application/x-tar" }, + { "tcl", "application/x-tcl" }, + { "gf", "application/x-tex-gf" }, + { "pk", "application/x-tex-pk" }, + { "texinfo", "application/x-texinfo" }, + { "texi", "application/x-texinfo" }, + { "~", "application/x-trash" }, + { "%", "application/x-trash" }, + { "bak", "application/x-trash" }, + { "old", "application/x-trash" }, + { "sik", "application/x-trash" }, + { "t", "application/x-troff" }, + { "tr", "application/x-troff" }, + { "roff", "application/x-troff" }, + { "man", "application/x-troff-man" }, + { "me", "application/x-troff-me" }, + { "ms", "application/x-troff-ms" }, + { "ustar", "application/x-ustar" }, + { "src", "application/x-wais-source" }, + { "wz", "application/x-wingz" }, + { "crt", "application/x-x509-ca-cert" }, + { "xcf", "application/x-xcf" }, + { "fig", "application/x-xfig" }, + { "xpi", "application/x-xpinstall" }, + { "amr", "audio/amr" }, + { "awb", "audio/amr-wb" }, + { "axa", "audio/annodex" }, + { "au", "audio/basic" }, + { "snd", "audio/basic" }, + { "flac", "audio/flac" }, + { "mid", "audio/midi" }, + { "midi", "audio/midi" }, + { "kar", "audio/midi" }, + { "mpga", "audio/mpeg" }, + { "mpega", "audio/mpeg" }, + { "mp2", "audio/mpeg" }, + { "mp3", "audio/mpeg" }, + { "m4a", "audio/mpeg" }, + { "m3u", "audio/mpegurl" }, + { "oga", "audio/ogg" }, + { "ogg", "audio/ogg" }, + { "spx", "audio/ogg" }, + { "sid", "audio/prs.sid" }, + { "aif", "audio/x-aiff" }, + { "aiff", "audio/x-aiff" }, + { "aifc", "audio/x-aiff" }, + { "gsm", "audio/x-gsm" }, + { "wma", "audio/x-ms-wma" }, + { "wax", "audio/x-ms-wax" }, + { "ra", "audio/x-pn-realaudio" }, + { "rm", "audio/x-pn-realaudio" }, + { "ram", "audio/x-pn-realaudio" }, + { "pls", "audio/x-scpls" }, + { "sd2", "audio/x-sd2" }, + { "wav", "audio/x-wav" }, + { "alc", "chemical/x-alchemy" }, + { "cac", "chemical/x-cache" }, + { "cache", "chemical/x-cache" }, + { "csf", "chemical/x-cache-csf" }, + { "cbin", "chemical/x-cactvs-binary" }, + { "cascii", "chemical/x-cactvs-binary" }, + { "ctab", "chemical/x-cactvs-binary" }, + { "cdx", "chemical/x-cdx" }, + { "cer", "chemical/x-cerius" }, + { "c3d", "chemical/x-chem3d" }, + { "chm", "chemical/x-chemdraw" }, + { "cif", "chemical/x-cif" }, + { "cmdf", "chemical/x-cmdf" }, + { "cml", "chemical/x-cml" }, + { "cpa", "chemical/x-compass" }, + { "bsd", "chemical/x-crossfire" }, + { "csml", "chemical/x-csml" }, + { "csm", "chemical/x-csml" }, + { "ctx", "chemical/x-ctx" }, + { "cxf", "chemical/x-cxf" }, + { "cef", "chemical/x-cxf" }, + { "emb", "chemical/x-embl-dl-nucleotide" }, + { "embl", "chemical/x-embl-dl-nucleotide" }, + { "spc", "chemical/x-galactic-spc" }, + { "inp", "chemical/x-gamess-input" }, + { "gam", "chemical/x-gamess-input" }, + { "gamin", "chemical/x-gamess-input" }, + { "fch", "chemical/x-gaussian-checkpoint" }, + { "fchk", "chemical/x-gaussian-checkpoint" }, + { "cub", "chemical/x-gaussian-cube" }, + { "gau", "chemical/x-gaussian-input" }, + { "gjc", "chemical/x-gaussian-input" }, + { "gjf", "chemical/x-gaussian-input" }, + { "gal", "chemical/x-gaussian-log" }, + { "gcg", "chemical/x-gcg8-sequence" }, + { "gen", "chemical/x-genbank" }, + { "hin", "chemical/x-hin" }, + { "istr", "chemical/x-isostar" }, + { "ist", "chemical/x-isostar" }, + { "jdx", "chemical/x-jcamp-dx" }, + { "dx", "chemical/x-jcamp-dx" }, + { "kin", "chemical/x-kinemage" }, + { "mcm", "chemical/x-macmolecule" }, + { "mmd", "chemical/x-macromodel-input" }, + { "mmod", "chemical/x-macromodel-input" }, + { "mol", "chemical/x-mdl-molfile" }, + { "rd", "chemical/x-mdl-rdfile" }, + { "rxn", "chemical/x-mdl-rxnfile" }, + { "sd", "chemical/x-mdl-sdfile" }, + { "tgf", "chemical/x-mdl-tgf" }, + { "mcif", "chemical/x-mmcif" }, + { "mol2", "chemical/x-mol2" }, + { "b", "chemical/x-molconn-Z" }, + { "gpt", "chemical/x-mopac-graph" }, + { "mop", "chemical/x-mopac-input" }, + { "mopcrt", "chemical/x-mopac-input" }, + { "mpc", "chemical/x-mopac-input" }, + { "zmt", "chemical/x-mopac-input" }, + { "moo", "chemical/x-mopac-out" }, + { "mvb", "chemical/x-mopac-vib" }, + { "asn", "chemical/x-ncbi-asn1" }, + { "prt", "chemical/x-ncbi-asn1-ascii" }, + { "ent", "chemical/x-ncbi-asn1-ascii" }, + { "val", "chemical/x-ncbi-asn1-binary" }, + { "aso", "chemical/x-ncbi-asn1-binary" }, + { "pdb", "chemical/x-pdb" }, + { "ros", "chemical/x-rosdal" }, + { "sw", "chemical/x-swissprot" }, + { "vms", "chemical/x-vamas-iso14976" }, + { "vmd", "chemical/x-vmd" }, + { "xtel", "chemical/x-xtel" }, + { "xyz", "chemical/x-xyz" }, + { "gif", "image/gif" }, + { "ief", "image/ief" }, + { "jpeg", "image/jpeg" }, + { "jpg", "image/jpeg" }, + { "jpe", "image/jpeg" }, + { "pcx", "image/pcx" }, + { "png", "image/png" }, + { "svg", "image/svg+xml" }, + { "svgz", "image/svg+xml" }, + { "tiff", "image/tiff" }, + { "tif", "image/tiff" }, + { "djvu", "image/vnd.djvu" }, + { "djv", "image/vnd.djvu" }, + { "wbmp", "image/vnd.wap.wbmp" }, + { "cr2", "image/x-canon-cr2" }, + { "crw", "image/x-canon-crw" }, + { "ras", "image/x-cmu-raster" }, + { "cdr", "image/x-coreldraw" }, + { "pat", "image/x-coreldrawpattern" }, + { "cdt", "image/x-coreldrawtemplate" }, + { "erf", "image/x-epson-erf" }, + { "ico", "image/x-icon" }, + { "art", "image/x-jg" }, + { "jng", "image/x-jng" }, + { "bmp", "image/x-ms-bmp" }, + { "nef", "image/x-nikon-nef" }, + { "orf", "image/x-olympus-orf" }, + { "psd", "image/x-photoshop" }, + { "pnm", "image/x-portable-anymap" }, + { "pbm", "image/x-portable-bitmap" }, + { "pgm", "image/x-portable-graymap" }, + { "ppm", "image/x-portable-pixmap" }, + { "rgb", "image/x-rgb" }, + { "xbm", "image/x-xbitmap" }, + { "xpm", "image/x-xpixmap" }, + { "xwd", "image/x-xwindowdump" }, + { "eml", "message/rfc822" }, + { "igs", "model/iges" }, + { "iges", "model/iges" }, + { "msh", "model/mesh" }, + { "mesh", "model/mesh" }, + { "silo", "model/mesh" }, + { "wrl", "model/vrml" }, + { "vrml", "model/vrml" }, + { "x3dv", "model/x3d+vrml" }, + { "x3d", "model/x3d+xml" }, + { "x3db", "model/x3d+binary" }, + { "manifest", "text/cache-manifest" }, + { "ics", "text/calendar" }, + { "icz", "text/calendar" }, + { "css", "text/css" }, + { "csv", "text/csv" }, + { "323", "text/h323" }, + { "html", "text/html" }, + { "htm", "text/html" }, + { "shtml", "text/html" }, + { "uls", "text/iuls" }, + { "mml", "text/mathml" }, + { "asc", "text/plain" }, + { "txt", "text/plain" }, + { "text", "text/plain" }, + { "pot", "text/plain" }, + { "brf", "text/plain" }, + { "rtx", "text/richtext" }, + { "sct", "text/scriptlet" }, + { "wsc", "text/scriptlet" }, + { "tm", "text/texmacs" }, + { "ts", "text/texmacs" }, + { "tsv", "text/tab-separated-values" }, + { "jad", "text/vnd.sun.j2me.app-descriptor" }, + { "wml", "text/vnd.wap.wml" }, + { "wmls", "text/vnd.wap.wmlscript" }, + { "bib", "text/x-bibtex" }, + { "boo", "text/x-boo" }, + { "h++", "text/x-c++hdr" }, + { "hpp", "text/x-c++hdr" }, + { "hxx", "text/x-c++hdr" }, + { "hh", "text/x-c++hdr" }, + { "c++", "text/x-c++src" }, + { "cpp", "text/x-c++src" }, + { "cxx", "text/x-c++src" }, + { "cc", "text/x-c++src" }, + { "h", "text/x-chdr" }, + { "htc", "text/x-component" }, + { "c", "text/x-csrc" }, + { "d", "text/x-dsrc" }, + { "diff", "text/x-diff" }, + { "patch", "text/x-diff" }, + { "hs", "text/x-haskell" }, + { "java", "text/x-java" }, + { "lhs", "text/x-literate-haskell" }, + { "moc", "text/x-moc" }, + { "p", "text/x-pascal" }, + { "pas", "text/x-pascal" }, + { "gcd", "text/x-pcs-gcd" }, + { "pl", "text/x-perl" }, + { "pm", "text/x-perl" }, + { "py", "text/x-python" }, + { "scala", "text/x-scala" }, + { "etx", "text/x-setext" }, + { "tk", "text/x-tcl" }, + { "tex", "text/x-tex" }, + { "ltx", "text/x-tex" }, + { "sty", "text/x-tex" }, + { "cls", "text/x-tex" }, + { "vcs", "text/x-vcalendar" }, + { "vcf", "text/x-vcard" }, + { "3gp", "video/3gpp" }, + { "axv", "video/annodex" }, + { "dl", "video/dl" }, + { "dif", "video/dv" }, + { "dv", "video/dv" }, + { "fli", "video/fli" }, + { "gl", "video/gl" }, + { "mpeg", "video/mpeg" }, + { "mpg", "video/mpeg" }, + { "mpe", "video/mpeg" }, + { "mp4", "video/mp4" }, + { "qt", "video/quicktime" }, + { "mov", "video/quicktime" }, + { "ogv", "video/ogg" }, + { "mxu", "video/vnd.mpegurl" }, + { "flv", "video/x-flv" }, + { "lsf", "video/x-la-asf" }, + { "lsx", "video/x-la-asf" }, + { "mng", "video/x-mng" }, + { "asf", "video/x-ms-asf" }, + { "asx", "video/x-ms-asf" }, + { "wm", "video/x-ms-wm" }, + { "wmv", "video/x-ms-wmv" }, + { "wmx", "video/x-ms-wmx" }, + { "wvx", "video/x-ms-wvx" }, + { "avi", "video/x-msvideo" }, + { "movie", "video/x-sgi-movie" }, + { "mpv", "video/x-matroska" }, + { "mkv", "video/x-matroska" }, + { "ice", "x-conference/x-cooltalk" }, + { "sisx", "x-epoc/x-sisx-app" }, + { "vrm", "x-world/x-vrml" } + }; /// /// Returns the mime type for the requested file extension. Returns diff --git a/SlackAPI/Preferences.cs b/SlackAPI/Preferences.cs index 92f48a5..4584959 100644 --- a/SlackAPI/Preferences.cs +++ b/SlackAPI/Preferences.cs @@ -56,6 +56,9 @@ public class Preferences public string highlight_words; //public string newxp_slackbot_step; //I don't even... public SearchSort search_sort; + public SearchSort search_file_sort; + public SearchSort search_channel_sort; + public SearchSort search_people_sort; public string push_loud_channels; public string push_mention_channels; public string push_loud_channels_set; diff --git a/SlackAPI/RPCMessages/LoginResponse.cs b/SlackAPI/RPCMessages/LoginResponse.cs index d048f31..551f5df 100644 --- a/SlackAPI/RPCMessages/LoginResponse.cs +++ b/SlackAPI/RPCMessages/LoginResponse.cs @@ -6,20 +6,20 @@ namespace SlackAPI { - [RequestPath("rtm.start")] - public class LoginResponse : Response - { - public Bot[] bots; - public Channel[] channels; - public Channel[] groups; - public DirectMessageConversation[] ims; - public Self self; - public int svn_rev; - public int min_svn_rev; - public Team team; - public string url; - public User[] users; - } + [RequestPath("rtm.start")] + public class LoginResponse : Response + { + public Bot[] bots; + public Channel[] channels; + public Channel[] groups; + public DirectMessageConversation[] ims; + public Self self; + public int svn_rev; + public int min_svn_rev; + public Team team; + public string url; + public User[] users; + } public class Self { diff --git a/SlackAPI/RPCMessages/SearchResponseMessages.cs b/SlackAPI/RPCMessages/SearchResponseMessages.cs index c8fbf89..51b0fae 100644 --- a/SlackAPI/RPCMessages/SearchResponseMessages.cs +++ b/SlackAPI/RPCMessages/SearchResponseMessages.cs @@ -55,8 +55,10 @@ public class PaginationInformation public enum SearchSort { + not_set, score, - timestamp + timestamp, + relevant } public enum SearchSortDirection diff --git a/SlackAPI/Response.cs b/SlackAPI/Response.cs index 6c60a0d..7a0f35d 100644 --- a/SlackAPI/Response.cs +++ b/SlackAPI/Response.cs @@ -18,10 +18,21 @@ public abstract class Response /// public string error; + /// + /// May be supplied. + /// + public string needed; + public void AssertOk() { if (!(ok)) + { + if (error == "missing_scope") + { + throw new InvalidOperationException(String.Format("missing_scope: needed: {0}", needed)); + } throw new InvalidOperationException(string.Format("An error occurred: {0}", this.error)); + } } } } diff --git a/SlackAPI/SlackClient.cs b/SlackAPI/SlackClient.cs index 3948d33..511a3d6 100644 --- a/SlackAPI/SlackClient.cs +++ b/SlackAPI/SlackClient.cs @@ -48,7 +48,7 @@ public SlackClient(string token, IWebProxy proxySettings) APIToken = token; } - public virtual void Connect(Action onConnected = null, Action onSocketConnected = null) + public virtual void Connect(Action onConnected = null, Action onSocketConnected = null) { EmitLogin((loginDetails) => { @@ -127,10 +127,10 @@ public void GetUserList(Action callback) { APIRequestWithToken(callback); } - public void ChannelsCreate(Action callback, string name) { - APIRequestWithToken(callback, new Tuple("name", name)); - } - public void GetChannelList(Action callback, bool ExcludeArchived = true) + public void ChannelsCreate(Action callback, string name) { + APIRequestWithToken(callback, new Tuple("name", name)); + } + public void GetChannelList(Action callback, bool ExcludeArchived = true) { APIRequestWithToken(callback, new Tuple("exclude_archived", ExcludeArchived ? "1" : "0")); } @@ -473,6 +473,7 @@ public void Update( string parse = null, bool linkNames = false, Attachment[] attachments = null, + Block[] blocks = null, bool as_user = false) { List> parameters = new List>(); @@ -493,6 +494,9 @@ public void Update( if (attachments != null && attachments.Length > 0) parameters.Add(new Tuple("attachments", JsonConvert.SerializeObject(attachments))); + if (blocks != null && blocks.Length > 0) + parameters.Add(new Tuple("blocks", JsonConvert.SerializeObject(blocks))); + parameters.Add(new Tuple("as_user", as_user.ToString())); APIRequestWithToken(callback, parameters.ToArray()); @@ -516,7 +520,7 @@ public void PostMessage( string icon_url = null, string icon_emoji = null, bool? as_user = null, - string thread_ts = null) + string thread_ts = null) { List> parameters = new List>(); @@ -567,7 +571,7 @@ public void PostEphemeralMessage( bool linkNames = false, Attachment[] attachments = null, bool as_user = false, - string thread_ts = null) + string thread_ts = null) { List> parameters = new List>(); diff --git a/SlackAPI/SlackSocket.cs b/SlackAPI/SlackSocket.cs index c4915be..69f1c56 100644 --- a/SlackAPI/SlackSocket.cs +++ b/SlackAPI/SlackSocket.cs @@ -92,7 +92,7 @@ static SlackSocket() } } - public SlackSocket(LoginResponse loginDetails, object routingTo, Action onConnected = null, IWebProxy proxySettings = null) + public SlackSocket(LoginResponse loginDetails, object routingTo, Action onConnected = null, IWebProxy proxySettings = null) { BuildRoutes(routingTo); socket = new ClientWebSocket(); @@ -164,7 +164,7 @@ public void Send(SlackSocketMessage message) message.id = Interlocked.Increment(ref currentId); //socket.Send(JsonConvert.SerializeObject(message)); - if (string.IsNullOrEmpty(message.type)){ + if (string.IsNullOrEmpty(message.type)){ IEnumerable routes = message.GetType().GetTypeInfo().GetCustomAttributes(); SlackSocketRouting route = null; @@ -180,7 +180,7 @@ public void Send(SlackSocketMessage message) } } - sendingQueue.Push(JsonConvert.SerializeObject(message, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })); + sendingQueue.Push(JsonConvert.SerializeObject(message, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })); if (Interlocked.CompareExchange(ref currentlySending, 1, 0) == 0) Task.Factory.StartNew(HandleSending); } @@ -332,20 +332,20 @@ void HandleSending() currentlySending = 0; } - public void Close() - { + public void Close() + { try { this.socket.Abort(); } - catch (Exception) - { - // ignored - } + catch (Exception) + { + // ignored + } - if (Interlocked.CompareExchange(ref closedEmitted, 1, 0) == 0 && ConnectionClosed != null) + if (Interlocked.CompareExchange(ref closedEmitted, 1, 0) == 0 && ConnectionClosed != null) ConnectionClosed(); - } + } } public class SlackSocketMessage diff --git a/SlackAPI/SlackSocketClient.cs b/SlackAPI/SlackSocketClient.cs index 5aff2a3..44ccb84 100644 --- a/SlackAPI/SlackSocketClient.cs +++ b/SlackAPI/SlackSocketClient.cs @@ -230,9 +230,9 @@ public void ChannelMarked(ChannelMarked m) } - public void CloseSocket() - { - underlyingSocket.Close(); - } + public void CloseSocket() + { + underlyingSocket.Close(); + } } } diff --git a/SlackAPI/SlackTaskClient.cs b/SlackAPI/SlackTaskClient.cs index edc1eb4..fe729e4 100644 --- a/SlackAPI/SlackTaskClient.cs +++ b/SlackAPI/SlackTaskClient.cs @@ -439,6 +439,7 @@ public Task PostMessageAsync( string parse = null, bool linkNames = false, Attachment[] attachments = null, + Block[] blocks = null, bool unfurl_links = false, string icon_url = null, string icon_emoji = null, @@ -461,6 +462,9 @@ public Task PostMessageAsync( if (attachments != null && attachments.Length > 0) parameters.Add(new Tuple("attachments", JsonConvert.SerializeObject(attachments))); + if (blocks != null && blocks.Length > 0) + parameters.Add(new Tuple("blocks", JsonConvert.SerializeObject(blocks, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }))); + if (unfurl_links) parameters.Add(new Tuple("unfurl_links", "1"));