From ca4402332a3f74c53280b4243aa73c67f1810873 Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 18:59:11 +0200 Subject: [PATCH 01/12] [CONFIG][BACKEND] Adds PR announcing to the game. Adds a C# program that allows you to parse GitHub Pull request opening notifications sent to an IRC and display them in-game. Adds authentication to the world/Topic() procs, allowing you to easily and securely input data into the game (EXPORT DOES NOT REQUIRE IT!) --- code/controllers/configuration.dm | 9 ++ code/modules/client/client procs.dm | 2 + code/world.dm | 7 + config/config.txt | 3 + interface/stylesheet.dm | 1 + .../PR_announcer_bot/Meebey.SmartIrc4net.dll | Bin 0 -> 137216 bytes tools/PR_announcer_bot/StarkSoftProxy.dll | Bin 0 -> 27648 bytes tools/PR_announcer_bot/config.txt | 7 + tools/PR_announcer_bot/output.txt | 1 + tools/PR_announcer_bot/sendkeys_ss13.exe | Bin 0 -> 9216 bytes tools/PR_announcer_bot/sendkeys_ss13.sln | 22 +++ tools/PR_announcer_bot/sendkeys_ss13.v12.suo | Bin 0 -> 35840 bytes .../PR_announcer_bot/sendkeys_ss13/App.config | 6 + .../sendkeys_ss13/Meebey.SmartIrc4net.dll | Bin 0 -> 137216 bytes .../PR_announcer_bot/sendkeys_ss13/Program.cs | 140 ++++++++++++++++++ .../sendkeys_ss13/Properties/AssemblyInfo.cs | 36 +++++ .../sendkeys_ss13/StarkSoftProxy.dll | Bin 0 -> 27648 bytes .../sendkeys_ss13/sendkeys_ss13.csproj | 68 +++++++++ 18 files changed, 302 insertions(+) create mode 100644 tools/PR_announcer_bot/Meebey.SmartIrc4net.dll create mode 100644 tools/PR_announcer_bot/StarkSoftProxy.dll create mode 100644 tools/PR_announcer_bot/config.txt create mode 100644 tools/PR_announcer_bot/output.txt create mode 100644 tools/PR_announcer_bot/sendkeys_ss13.exe create mode 100644 tools/PR_announcer_bot/sendkeys_ss13.sln create mode 100644 tools/PR_announcer_bot/sendkeys_ss13.v12.suo create mode 100644 tools/PR_announcer_bot/sendkeys_ss13/App.config create mode 100644 tools/PR_announcer_bot/sendkeys_ss13/Meebey.SmartIrc4net.dll create mode 100644 tools/PR_announcer_bot/sendkeys_ss13/Program.cs create mode 100644 tools/PR_announcer_bot/sendkeys_ss13/Properties/AssemblyInfo.cs create mode 100644 tools/PR_announcer_bot/sendkeys_ss13/StarkSoftProxy.dll create mode 100644 tools/PR_announcer_bot/sendkeys_ss13/sendkeys_ss13.csproj diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 23543be4bc7..6fd8dc91218 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -101,6 +101,9 @@ var/rename_cyborg = 0 var/ooc_during_round = 0 + var/comms_key = "default_pwd" //Server API key + var/comms_allowed = 0 //By default, the server does not allow messages to be sent to it, unless the key is strong enough (this is to prevent misconfigured servers from becoming victims) + //Used for modifying movement speed for mobs. //Unversal modifiers var/run_speed = 0 @@ -265,6 +268,12 @@ Tickcomp = 1 if("automute_on") automute_on = 1 + if("comms_key") + comms_key = value + if(value == "default_pwd" || length(value) <= 6) //It's the default value or less than 6 characters long, warn badmins + message_admins("The server's API key is either too short or is the default value! Consider changing it immediately!") + else + comms_allowed = 1 else diary << "Unknown setting in configuration: '[name]'" diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 1f8cbdc07b7..92b5aba183a 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -130,6 +130,8 @@ var/next_external_rsc = 0 if(holder) add_admin_verbs() admin_memo_show() + if(config.comms_key == "default_pwd" || length(config.comms_key) <= 6) //It's the default value or less than 6 characters long, warn badmins + src << "The server's API key is either too short or is the default value! Consider changing it immediately!" log_client_to_db() diff --git a/code/world.dm b/code/world.dm index b620dfeff18..279a6e99ef8 100644 --- a/code/world.dm +++ b/code/world.dm @@ -160,6 +160,13 @@ s["map_name"] = map_name ? map_name : "Unknown" return list2params(s) + else if (copytext(T,1,9) == "announce") + var/input[] = params2list(T) + if(config.comms_allowed) + if(input["key"] != config.comms_key) + return "Bad Key" + else + world << "New pull request created: [input["announce"]]" /world/Reboot(var/reason) diff --git a/config/config.txt b/config/config.txt index 91dabaf17c1..e084f8176d8 100644 --- a/config/config.txt +++ b/config/config.txt @@ -144,3 +144,6 @@ TICKCOMP 0 ## Comment this out to disable automuting #AUTOMUTE_ON + +## Communication key for receiving data through world/Topic(), you don't want to give this out +COMMS_KEY default_pwd \ No newline at end of file diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index a425073e7f1..69fe141385b 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -50,6 +50,7 @@ h1.alert, h2.alert {color: #000000;} .userdanger {color: #ff0000; font-weight: bold;} .danger {color: #ff0000;} .warning {color: #ff0000; font-style: italic;} +.announce {color: #228b22; font-weight: bold;} .rose {color: #ff5050;} .info {color: #0000CC;} .notice {color: #000099;} diff --git a/tools/PR_announcer_bot/Meebey.SmartIrc4net.dll b/tools/PR_announcer_bot/Meebey.SmartIrc4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..851c94700f71c4d3e0d6d9a18873fa0a22b8da4c GIT binary patch literal 137216 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 literal 0 HcmV?d00001 diff --git a/tools/PR_announcer_bot/StarkSoftProxy.dll b/tools/PR_announcer_bot/StarkSoftProxy.dll new file mode 100644 index 0000000000000000000000000000000000000000..a5210bed38ab45344483317c1f8abf17b510e760 GIT binary patch literal 27648 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 literal 0 HcmV?d00001 diff --git a/tools/PR_announcer_bot/config.txt b/tools/PR_announcer_bot/config.txt new file mode 100644 index 00000000000..dfaa1046567 --- /dev/null +++ b/tools/PR_announcer_bot/config.txt @@ -0,0 +1,7 @@ +serverip = 127.0.0.1 //SS13 server IP +serverport = 7812 +commskey = this_is_a_test_key +GitHub_bot_name = testbot_github //It'll get the data from this bot +IRC_bot_name = testbot_BYOND //This'll be our name +IRC_server = irc.rizon.net:6670 //format - server:port +IRC_channel = #ircchannel \ No newline at end of file diff --git a/tools/PR_announcer_bot/output.txt b/tools/PR_announcer_bot/output.txt new file mode 100644 index 00000000000..07db6152b6d --- /dev/null +++ b/tools/PR_announcer_bot/output.txt @@ -0,0 +1 @@ +0131022900006397110110111117110991016191451161034511511697116105111110933286105115116978079876532111112101110101100321121171081083211410111311710111511632651001001153211511110910132981111141033210210197116117114101115329710811511132102105120101115321151111091013211511611710210246323551485248583210997115116101114464646106117115116951111101019510911111410195116101115116951001111101169510710510810895109101413210411611611211558474710310511610411798469911110947116103115116971161051111104745116103451151169711610511111047112117108108475148524832381071011216111610410511595105115959795116101115116951071011210 diff --git a/tools/PR_announcer_bot/sendkeys_ss13.exe b/tools/PR_announcer_bot/sendkeys_ss13.exe new file mode 100644 index 0000000000000000000000000000000000000000..d27522e25f7e0a2d4735895143c0ce83b5290833 GIT binary patch literal 9216 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 F|NlHSqA~yg literal 0 HcmV?d00001 diff --git a/tools/PR_announcer_bot/sendkeys_ss13/App.config b/tools/PR_announcer_bot/sendkeys_ss13/App.config new file mode 100644 index 00000000000..8e15646352e --- /dev/null +++ b/tools/PR_announcer_bot/sendkeys_ss13/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tools/PR_announcer_bot/sendkeys_ss13/Meebey.SmartIrc4net.dll b/tools/PR_announcer_bot/sendkeys_ss13/Meebey.SmartIrc4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..851c94700f71c4d3e0d6d9a18873fa0a22b8da4c GIT binary patch literal 137216 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 literal 0 HcmV?d00001 diff --git a/tools/PR_announcer_bot/sendkeys_ss13/Program.cs b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs new file mode 100644 index 00000000000..0e61ae16a59 --- /dev/null +++ b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using Meebey.SmartIrc4net; +using System.Net; +using System.Net.Sockets; +using System.IO; + +namespace sendkeys_ss13 +{ + public class Program + { + //default values + public static string serverIP = "127.0.0.1"; + public static int serverPort = 11111; + public static string commskey = "this_is_a_test_key"; + public static string IRC_bot_name = "testbot_github"; + + public static IrcClient irc = new IrcClient(); + public static void Main(string[]args) + { + ReadConf(ref serverIP, ref serverPort); + irc.OnChannelMessage += new IrcEventHandler(OnChannelMessage); + irc.SupportNonRfc = true; + irc.Connect("irc.rizon.net" , 6670); + Console.WriteLine("{DBG} Connected to IRC"); + irc.Login("vista_fun_bot", "vistas_fun_bot"); + Console.WriteLine("{DBG} Logged in"); + irc.RfcJoin("#fukkentestchannel"); + Console.WriteLine("{DBG} Joining #coderbus"); + irc.Listen(); + } + + public static void ReadConf(ref string IP, ref int port) + { + if (File.Exists("config.txt")) + { + StreamReader reader = new StreamReader("config.txt"); + string[] line = reader.ReadLine().Split(' '); + if (line[2] != null) + { + Match match1 = Regex.Match(line[2], @"(\d{1,3}.?){4}"); //rudimentary IP validation + if (match1.Success) + { + serverIP = line[2]; + Console.WriteLine("Read IP: " + serverIP); + } + else { Console.WriteLine("IP cannot be validated."); return; } + } + line = reader.ReadLine().Split(' '); + if (line[2] != null) + { + Match match2 = Regex.Match(line[2], @"\d{1,5}"); //rudimentary port validation + if (match2.Success && (Convert.ToInt32(line[2]) < 65535)) + { + serverPort = Convert.ToInt32(line[2]); + Console.WriteLine("Read port: " + serverPort); + } + else { Console.WriteLine("Port cannot be validated."); return; } + } + line = reader.ReadLine().Split(' '); + if (line[2] != null) + { + commskey = line[2]; + Console.WriteLine("Commskey read."); + } + else { Console.WriteLine("No Commskey!"); return; } + line = reader.ReadLine().Split(' '); + if(line[2] != null) + { + IRC_bot_name = line[2]; + Console.WriteLine("Read IRC bot name: " + IRC_bot_name); + } + else { Console.WriteLine("No botname found."); return; } + reader.Close(); + } + else { Console.WriteLine("Config file doesn't exist, using defaults"); return; } + } + public static void OnChannelMessage(object sender, IrcEventArgs e) + { + if(e.Data.Nick == IRC_bot_name) + { + StreamWriter output = new StreamWriter("output.txt"); + string[] msg = e.Data.Message.Split(' '); + for (int i = 0; i < msg.Length; i++) + { + msg[i] = Regex.Replace(msg[i], @"[\x02\x1F\x0F\x16]|\x03(\d\d?(,\d\d?)?)?", String.Empty); //Sanitizing color codes + msg[i] = Regex.Replace(msg[i], @"[\\\&\=\;]", " "); //Filtering out some iffy characters + Console.Write(msg[i] + " "); + } + Console.WriteLine(); + if (msg[2] == "opened") + { + byte[] PACKETS = CreatePacket(msg); + PACKETS[1] = 0x83; + int len = 0; + for (int i = 0; i < msg.Length; i++) + { + len += msg[i].Length + 1; + } + len += 14 + commskey.Length + 6; + PACKETS[3] = (byte) len; + + StringBuilder test = new StringBuilder(); + for (int i = 0; i < PACKETS.Length; i++) + { + test.Append(Convert.ToString(PACKETS[i])); + } + output.WriteLine(Convert.ToString(test)); + Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + IPEndPoint ip = new IPEndPoint(IPAddress.Parse(serverIP), serverPort); + + server.Connect(ip); + server.Send(PACKETS); + output.Close(); + } + } + } + + private static byte[] CreatePacket(string[] msg) + { + StringBuilder packet = new StringBuilder(); + packet.Append((char)'\x00'); + byte x83 = 0x83 ; + packet.Append((char)x83); + packet.Append((char)'\x00',6); + packet.Append("?announce="); + for (int i = 0; i < msg.Length; i++) + { + packet.Append(msg[i] + " "); + } + packet.Append("&key="); + packet.Append(commskey); + packet.Append((char)'\x00'); + return Encoding.ASCII.GetBytes(packet.ToString()); + } + } +} diff --git a/tools/PR_announcer_bot/sendkeys_ss13/Properties/AssemblyInfo.cs b/tools/PR_announcer_bot/sendkeys_ss13/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..669b610fc09 --- /dev/null +++ b/tools/PR_announcer_bot/sendkeys_ss13/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("sendkeys_ss13")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("sendkeys_ss13")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("197641d3-a97a-4255-b833-d6481ca4ef54")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tools/PR_announcer_bot/sendkeys_ss13/StarkSoftProxy.dll b/tools/PR_announcer_bot/sendkeys_ss13/StarkSoftProxy.dll new file mode 100644 index 0000000000000000000000000000000000000000..a5210bed38ab45344483317c1f8abf17b510e760 GIT binary patch literal 27648 zcmd^o3wT@AmF_wZJ#EXD9Bk*U5CXywlaK_QkdipIk_h~YEhmA{8pTo)5n0DbauO3< zOzBXVLYtIFDU-IL({|`ARQC3|vb2XzADaXlF{_1NUERpCcXl z5kkwI@4H_Ww9a08uf6tq?Y-CDl1$H)$H*We6Yp1FC3+A~er*^eo<}=a)g7|AMGN z{;ND~RFTln-$ryfmrvr&hM4|(n5cGo-Ra;_B4|*4`GIdQV?=GG%#jlCt`PvViLSQX zz~mJry1K1UEHH`4b`no^)IPjjugx$>TOpIPKq#_4j7H{l4c@NTW}+=FREp7?R1M3f zlZURqlqlClq)jJ0O?-(SL)T#ITh-IpP=k&IRE-rOQSdt5nDju2)-T!ZF$1;hh3E`7 z5qg+<^w?6ON%S*Y8&~PnW6N-=u4dDv%*>2(FkcGaQ{i0jExd`D!*(KpFgF$BCHhfD zThD}KQb2`_$Q4ppQ21+fZbiLF&h=8Dg{!>uC5(V>Vb!>SBUUkVDfTHIdjg?+onqZ2 za;dVCQ}l=|W2Gtl(yT&lU zxn7t0SP&$NbxjO91$`FcF<9&MH~HU{wIFa%_r~hWa$6zP+>Vj8x*}?Wjb>A$r|FtT zuQyLm?O^*S z(7*ko0KVw25Ez>){QSlr!*37s+gTRs5tGIioR(0mPi@5Qm=*J@MFmsxs=$OT4C)6C zRl-fdc1#yqdSR>yR`f2taCgufy=MdF)7hvlZ1>QZE3jNq6>A2)VrYmv);|b$VD5V8 z9P~s?hUW#1rNO09s|A$Jx5IOY(xr9px8?&!a5UY^zJ+rdSDEye=!0N~JWVz8Y7Lo& z)&dZou^B{E_#p%_Vhbx{7D`?k6N={DK|?UFwFvDshS%r4!di@CZBv~;V#Jo9xIwra zK_534Juu0p(+ywqZVT&A(24>~vX5I2=|>UP<_1VbP3=5uRfV+-B)mc(#Ld>i zR@%?x;Q-w9>k+)9H&1dOo6T}&^Niiy#r`bR>+>ctnM^!b1ieZ1E3QD3)UeGALRb@) z0mL(c+zfha^y|6cGh*;vu!M+Q=;amqyr9>&`5E>O&x2F-i=DFHJ1`!m6~<$!*25W9 zDzXlR9tma z;%T5%qx;0ZPooSgI_u%el~f1UYu{D|T@PzOK{lzb9~FOy&rJ)?mZ7xbA?CYAq+#3Y zlwy{6*_+{oewbq|+OIR3uZV*=PYhy9aXexQQ9EV_72zdsD-#03CV&GB3mehjxD9=D zwaQf{0DAFw89e!Q%JCpOVfqmaOzoH>Wby{>Z8eMQ)B{FmZ1D8P%z^{IPB|vq8390; zhtwVgFg?5{V;D~nJD5D-5P1%r&bTIB3oiV6&2ibT%kXYz4_3wvnZ=9Mh$tb1ce)bGCsezfPIwsKn~6 z982(6>8cb|d7`S9+^yLF6>DaJAr@ioc8biA zn=6^4VB_dFEpt@sWINsUB&|2GPV&Be0{+DE5)OGbV8Nxr^)Nw$NB6`qxHqVW%-B{G zRE8Mxs1$K&02$(Ll?w)%7Mut)nL7FPk&&EJOfLZw&{csXbL!Kr4ic> zo=b#5qiKZArX`X#o*g!uk1xIQ5?)@B7h;meFulC3?90nghb4(~k_g2v!blsi+L95& ziV(Eg0h;a&KFy1UomxK+MVjs8%cwSlh4l;DkG*fyQ{$Pm%(2Hg;D8+?+#=HP?iJ-T z!=4yYs^AH4vqIl&qdZ@IR1X5A#9@0~8x1(~+-N=?Tp)~Unrhp575DiK|AO7ePxza6 z*ZLQ1`gd&Vz9RO(V4WJU(S$XO`NvPd6h;d_nqnK#-01Nx-E&3U01FS^y!pt&d=?6Y z8!%v_w;d5mh3}{`tU`smgHn%;+Rl>uYAQB?72)t;>`eg5JYWGzo77)RV+(Ebh50~Y zerQFDNA2P(<_Baq`_PI75s%`6lc>YR7xtC&RGknLPM&%uinHXY?CrvjFkDqK`W;Sp zkizw%dsPa@73CBTS+JyVTxq9p(vG2=6s}C~q;T9v@#SS-QaI@@Q77YBuqvl;eM~uT zl3S6&Nk5gsaSh_9Iv3l4O3C54@H%q1>HV*R2v&MRK1QJ-4Lo-a$A+Kn@^BfEWE9)D0z6X@bYF7L!{fSlFKY8~VPu&EYV zSwkI!*WNnG>muCm(XwUpoc*%W?&>gK2^z@k+8Pp2;CrL&my64Rz|VPB;ImNE0%Z zd^5#SszL@4C1fgDkkhcRlKe;k6=D)ja-^`J@KLD7*${UWLMfm^v|&OiphCRL6;hD< zFyl|okC>O8AF+gU5~LW;F<9HU$0<@H zZmy(8f{mkJbw=QvA=~NL<0?1$xU%W`W{x?r=6c@0aRsmw4BN4F67~cxbIf>%?<2#q zF7puT{>|R{eN78b_?lZz_*$Ay_~y5q@cNp3_ViVozH{e>H79tszxjAwAj(%=o10{8 z;kOA*h0k&vPeAzV0xg@DNh1reVLILZdKcY~g^t6*+RWRU=px14^IeNmGcQg`XKDQQ z30cnU8mJz`qJ!(RGNV`r>ca3Fs|l5CB$wsvH42u5Vq zL6w3kmozIkAlFp5$}PqG%5vUjm0GvX<5)B0evZdcMmn7w)ufML=tlHW^F_s{ZpQW@ znsA$9#`dF7i?sg$o^=a&7iw`u$3n?R0T9ArbH49{-`TscQwg<_(CtErVU^=oyAij- z@MEJd>}}b^^C;|FAH+isd$2=agYg|d_QOZ>(2g{^203x998T(*8cn}_7gIpDb(nZ; z+;8LEz6yx3;5eUI_!8QqhW9o#`r0u$3AfTdBkWs<1U!rzLx|uDdp5m*R8y=S_FCJ} z(MiSqVSkgcDC}Wsf3vaBF4+mW+5QMPswv(WXle|q5dz_$5e{;S9}Z%KAj+G5i~+&{ zN%I?P!ZngRJA>4QYnzOv0g%@=8%y|6=05`dOB<95&^n|Bs0)XTa7YFSVSrFLw6sA~ z2-m3*>cjO_BQ%5?Fv1yN-Oy|-oyX7e5Ey}cFeWleF(PIe;fjiI|46Ix=75Ds2#Y(l z?*=HW57St%{V*5rkYbLDH4&~&aj{d1SeK|UF2&2a_`jvNnTv}XnRXo)AC@A!Tg|?f zd9L$`HvN1Ooa1;h^K`-o6LZGFBpeQ_>55}TiPudp26k?SxuSfmI0S@mhPl!{R!IAq zhz|Q^xJ>UHE4Yv9Q9f2kcXg}~a{E|;?T3#QT!k$}`l(|D*QnTc-|@oM>RiEv*Kw|x z-tTnJ6(ThUfvwFlD6Ky9`vTnKoGbE}r;5NiSBO5Zcrhod&J}ibk*imN)hX_Vne>l1 zS74q@J6EuU=RQ}kVeE4S7jdo-j~r!B%zmzbF&1KJ!6wXCqG4U-abG#Z$unhP3hLH& z)-M52!s$!1E@KoOg2AUb)Xo->u)3*xm}ZJzOkONq+Ct>FJj-~sn*B*LCqjqT zwykPgvue$1oS%5@;AP-h=(_x^_>KS+S%uAJ`CzG#&F_cniLQr5zRB%FgVYT}@=CLO z+fV{qDP6@l46%Gm&f3ewcwy;p*tPU?fdF))-)U>uI9S{XA;kAU1kvSv3{L}ZoDk_M zyqN~1^3l7ACmWuF`9i$GQ`-6Il!+EKav!Gr9R;)?#kD@b?`uESyi}(L0PhGe{J6lc z349SSNNa+9sP7E+1-&#C=I>DU(wBo@L;Z`vp9414aLvLRu1VD#sPWP<)CB3J z8XiTf<<>|o*RMl4Ncq|y1KuX^Uj*uPOj)So)*I?>tqanf0zU%irEj6$OV0{?S!h;= zShh_euHPx}0AP^rLw%4Q3NeRA1)BBDd2{_hy_YP3-;4Zbge{`%!d}EknTfiGvBLIJ1`AxJ;2@v>}=_`OZr`EW7hzS(xr61v`tFeCR!`ly9FD- zZo?xm-}liGD$x`s%>R(Kqrg~}hk$(y{y#)ow1IvEEKJvf7HwJ$;6jL@(b-xEaFx_- z&?2;BYA@<{OkIbX9aG1pe80di3C&lvCeZ(vwg9kMUjlfJz6>7>{0B-qr?%=Lz{>?D z1@0GkjlhDyqXO>|_(6f66!?(9uM7NFfj<=ZQ-Qw{NCxwd2wW_%Rp17JT>^UqzC~b8 z;H?7h5qO`#j|%*Pz;6irp}=1W44XX4a)B2M+$wN~z_h?3U`6Y5LH|yZ;W2^l75G8G z9aC(#*(}M{uJ*-8%^Dh<`g>CYe8OA__?*C(1$sPObGE<%fwu!{G`mNtIX~=SkAFkp zGoDo_D_<+wUh=TV4ev_8`2x=sxKrTU1%5!_BLaUeaG{UsI|XJ1-Xri60v{6iU4btN zTD!{pPtk{1QEPri)^?F+%Lj6%p3%a@G-arekvy59{fLK_vPeG#%W(l-UWk-pvVfN=)J&SA7|A*8O>b8 z>#;iKGG8IUmxvp(Syy<_B~?-eX)!^W5j49c45`_qOp>$ zR+z-n8d}B)za3d?=-e`vFxJq8W$duFmNu5L-y0XvwlX%Vt*8DnHmPl(D+PPZ&)ROJ zv|x|WW#NFikq)><@1U_VmM}W#SQ$I4ZK3DO*zb)l8ftaq9M!hbEoE#{+fF|eOhx%+ z^rDTiS1zOfurc<^<@7rnW3OCJ#(B*1u>i~2O+mqK_P2%^i`dwP@F=i_g1r!6kM+=U z8)J|4(D@3J8PH4p=QGboG}gACek0gTv@?94Hbhr*8bdeHf$%xzPP)^^0u2|MyXXPl zTG7U{<4XF4U}^^Jq52EB?PfpEfIZZ#Fqr{+Xs2Lm2JE3@f~gs>haR^vj$LF)tC-6R zG6UXBcM7Ivz%c#H#&`y#sEgAkJ0?b`yNo4_5z3XZQ7ug;%Gjiqq2H9TUFLpDuW`7% z#k_`I5={9hPrtS?_EDaY2;lWXfPG|<-^SQS7KLq$eKbZbg5B(&f{(^1YGdz#kH+X+ z8~ZTYuBFvB_Bpg&OY*59MqvLHXp6MH5Mcims9Ry;zar(%R$w)JaUeCgxYQFvhc0u1pUm$*wfe3_Dh&j`Su3dXJhQ! z8z`?Z@$C)tDZ!L)Z=jzDrhIz?MK>}RwYp8wZiR_&Z=|0IrhI!7b-jrx)#~;abiH7A z(Avm9n(v^eY-}U2TWBLb&r^PX!n~Dw73S}XB#ql>XSpq_-9~RIW23vG&&hz_;4BO^nax6339y~)}ThmcY(P6n3V6DQNFT#RAHbZo6^4X@yJ297|D#zQQ*Dl2-nbG0rr zwR3ZJ^K|RtF25V2Xr$otGU87G4f>_jFRJHOhB}=kKo%*-vr?uMwe~t1F zXi436y_U|c>(kjjquLMYNZo|~BIG%#|AOwRyI=n;eWvbjQS;@x&+3}?gSs!Ed~e`O zxEJ{Mx<~aJ#bRNN?G~m$C<~41L!Snp1)-mTa%t$-`ZBF6^k4dFZ8YRHUZfjCAw$#N z5t?VP_2wfxy*sqjSg+k5T45x#Z-mYR{8w<;q1_u;Wh}#3S&iYSz;>zGWMt8r#jh?} zuwjO15v_;kqx3Gov*-@g#ONNBH{%TLr!M*^;CA{1U^hJg*pJh+pOW+sfV=6R0I#A) z0k5X70;cJo0T0l30CV&d;21p(Sfb|ukI;_+ucw~@PSGy_-%h^*yoG)bcpHM#Pshju zcqat`@4>fY{P>p9JiwDQAMnGp1n_=Z4){rm0X{%00Y6I@0zOC=1AdV<0zOO~fREBv zz{lxwz$d65@S8LQ_+7dZ@F^Mw{5MJiJ}>(Igm&tF$hQaZ=X5pTFDZi)_HXDKl>Z=B zB8{zNYE!6b(Qem0v`BjoU{t#k@GR|az?gOq;Q89UfUC392y$)zk zp+2Ym3*eaaDoOc>@VQ=UrnG-U>)W+w0B_Nr1-wmr4)B=vJm8%|d5=(@5XzIn;lomY zztn$H>K_mZKPw|XsJ(!`U(|jA_^|dVtO0DqJ*AFsY1N~C37}3(aZ9CPo`z9ghIXCKlpD3>fI4m{ zS(XhnA2gQ$>iF~p_i6MdKpi(`ivc%*hlY8*6y*-^(C{OnWhf_TIpAfq0&q7zAJpgy zK%K6{PN2~qKpk`ZJis^O234cC0P=S#EptIYLxc^>U5CS0Os)BEu9Y2#jr%T zZcf3eRjXy~1^mrN@xeWJ~Umj0DW5fU_woo4}*MV;AvC`wY%%wC~N)-+kt$n4o z-b|^jzhE7ipzWp7n3Otm*-XA9_&}yOX61{SPW&RRNC|hdl#>%<8FJNbO^uYS!UPRk zBL|CXQ?3@fYDUev88sc_r2`m0JCZ78tvn5tvbiF47BZ<4#K`9}BV654oXC%KTBBpR zOevF&A3}$Y0&cv8Tl~mKW=uLCO6A5g!^0#5+f(^;E>pOAH4RP_OPNs`9%IF~Tg8%H z?6(Ri7N9gMtV&7#4cc&NWXv{8vRqPJ#Dc7Erc|Wu$z=a<|3KgFD~7w`TRVojlf(Ue z14(y%XJ2n`yfZo6+0#Y4Iugm@t$hQ-T^-4e;Y4pTKCrW+ds=le(G%|*N|IvR+tCxJ z;S{UC%PJhq;4GCIIk>-Ijpx&Lg)J9b$I8PnaC#-n91}Z zcnTPfwa)I#V(6h_rXXQK$qXz~NEIdqGU;pqfdt#72Qt@=XAl8H`IHjyI`rvJO^iY$ zZUbQ&>2xN~oYh!88K{#6+L6myhegGbQa80XXHSYsD8pJ-zRb=ZGnpODSmPx& z=Du7O;%sBn_Cqo&pN65V{MJ;KJz~?x!KE~jw5;w_VSmP{9U4e*m6hKQ9g5>)P!SgI zfr=@ao_6O<(t>?OfjEYx$IJr&t&33#-x z^YX#jW|TCn9o`uq7)5vj^0hp-hV6OguG*65?Q-J-@&4{Bh6mz1hT?Hkni5u@4#)RG4k?1}x+Rl#N-agEBd)6oWh7(=!-sI^F)0Nn|H9i1h zr;A#z*fPDTQ7ligeD$Y_#lu!1ZKE7=Dm0a*>#7$bG26OX&9)Af7{mhPsI_jmV<@@Z zw(M}TQFA9sLPMTp85n zGX!~f!5i-H7#!TyH(*=Mmdqwfbo6!%qdl>$7rucLx5bCI#J44SXX7{FDi( zxsx*kwL;d>)dlAb4kxeZkIzoa6w;dL-?`RNrCiz7*VB=}+QVD2J+aDd=x~v2J$X#k zX>%0oy`9ET-`;C@A8O;Yi7H73a+z^nZhOabxynXeNmtYd{FEp%L0=(0I#!y%PiT=^7!B)H#}i4w8{ySGi1=%Zc8J2J$S1DTNw zGLS9f`}SoDgW2mc#9g=t_-+}`=2)e}wm3X&$Jkf~X$JG@N|jO_XDF#`CH#4_is%?HpYwXOdKUDGiIz8t#H(m9gX)z~*r#0kNFOEfKku z{?((F``BdA**ch^5}$5lR`H(86WN|)&X!wlL#85S8nH%^lBQ`~r7sTYYbT% zj!zxwG=c!}Dd!J9IZ#)=$N|Qa5a}I`PKo|XS=3N{y0e%oAhcPiIL9nSmR7<9ks#iZ z<@A|rV3eeV$+P+*_>W;(Qpp@Ta~uuKy*rcNUpgQX3U0ICni|a_tFFc*n}i7b+*+_k zm9N;QB_y(3YuCi{<1&e5tdx>pI@__#l3`kpsBx{0E)X4%+kc&SvA zTjud}p{iYgWs%pJ;n$#=wR!fVsLy(=S^bA~caxuy$u9)(e?-)h>pQvTk|ehbIuQU;NT zb->kP%Vf_NXDYLpc2$+=6`9db5(GS}W3dud>e5B1l;pglOGz}ccdQw~;X6A1VZ&FY zD2>v%&_!|2m%%;ceo$m^^H%~a059RzKLzelx=v~=lo(IrnL|wx|J+m;;f8P>?h5hI zcwjp|Pr%&}zKGdBL#`-fXIaODYY7s&Wf?&WYm|a+Ja!82Lx4F*o8j*n;s<|@rjAx_ z3OBDeT(4B8NSB8sBaksG7~6ntQ}I9)mQy~6;#-NUXcDcg71KD@KZ?6muHPq`vOUwR z-B2fPMSJlt4*w?6uKI7lQ_(w?y#RO{c-P@3bvybD&O*&?{HCezRE!qIK@2QfC+=|A3qQxm`9UGcjcwlE>MH zx0<~ilLs-L1=&=5?H4)rLLxRiYs#{50O0#O(zXMdwqp)6T#NR7=*`?l<;hxb(5Tu` z^mc;hb-HfqrvDz-sYsdbx}#7K@iX;awk&Hf3fW?`}0_8 zo0~pWt`G{2Otr;wpWKY`ILNq#pK6SmBXIDtB)o<)6$c(KCr)6)djZ~LSq{2j2;7`S zft~3NVTZ~IT=c9T#MaV@KeIT9U1g>#b>B>xHwK;DYg+diKsrl7~-E89wQO62YyfOFY zp<+)(^7QS=*_e2Ws}z%?OR4G@jyH{R0y_2i(^G-%S#6K$qR+ihkqPLN{Og#paS-A?pegL_W4RgvlS{j&9-c***ZRL7O7#?{H-Jp6-88j zQ=O)sW2biKK$*(g?euZWH2YklsUIZm2zC-TTtXM7&JB`Y@ zfajjtM%AX_j5!xqw+B?bJ1SM?nc5T7Hq4%_I zvKC*8;PsDZz@ORPv9J<}&U)V~QxLm}tF0e(d>}k5&aB=Ka3Gxej1xB%c5^RGX)xh+ zG>RzZZI)*{ul_u@8FM14h$tN^$B&9OH~;F%%!{My$>&SXc`KVTXSkJZw8$yX)LpMf zWDa{?{@YYOUa59y)4Z_}ZcvY_? zv-NZ+xtDW(O2CZjZlYIwr9$nXP^i6NE{dIW5qtCsp1^zt;)II#ksNS7YmFc!;*sWB zDXNV)GZ&%5PDIYW2Tr$E4kPoaOhxQoN&DP!JC_^<*jSy@c$3F%&c)8StWn9Hd~6XX z@8*q)9nbTJZ*%rae_HMItHi)-^hh~9X4lZ^&13C@lq?@73`#erFSqhZlD)`t+buK2 z9V#brby5)CkX6PO!yQKw-&#Evy;&Rf8K>uC_O!#YGj*TCh6NqPKWE0V6FAgn6U=S= z>P4g4b+d(PwTf;|v%8UYITFq_Jvb;iTOWa1JfoGwuO$gheUKSD2LR4V-{>^O?d9sz zT(uGAQ2a(;(oR_1JL{j}o?7RQG5X?Vt(U+2^5O2g{%QU*=lK5?U)uEgy=O!`T4a^( z4H@2Wt>KLX@UFu|o2EPTsrG{okH7#V4 zriVOHT?;AbhlY`J@onc&WMydaA~Q;n)t;yZj2qUYxY!f&MGZXsesJ-l?B_C`A%21) z5)Yw8$D7$}etera6k4h1_t+sJfx!m_5Kk0=^;Nzbv@MJM=KE0BSZYJ zwn4-1J{y+c%fm~^AJkNUu=qMlzNiIbYLS${3|BA0(2MlNi@e<0h;O&EA9M!%2NFzn zVyJRT(nnSskj(VKMP8rjhg$+*q3j*<>8fCxA4JN)ku2CQ zUK9zl5f?>9;o(R_c%C0a;t>h>qXrj3{$SLj3ZYPK)Tu>^eKz)dNptj!UhZGJYzh{vz65>{lc&?T4><6M5(Gc6;fmP8gBWsZG2h9I$YHJpTF*^o%7c|dn>}!ezn}>l!)56 z9IfE)QnXAr+=)+(bGe>WHc#@AS|($EgogiP$_k2Zc6a;#yv%~m z`0wKI%f#EoR_eL{@z*o3*c8A=-LrGn&Nu7)I!k&bB|GPjhjNn7sL$EB{RVo#^n)q> zZUnN(0yyx^{7g>ILoECz6aOv-?^QUw?*+tPcY#D2E;LnYsP2St2PC0%maC1AXL;o1 z<)f}mbH30x<8>i5DRzO|)5l8&WyL z@S!p1l7Ka4yB&n?>hqz>QIN;Pq{4XJ7-zrqWG%;_1539bi5JcbBA3#kLZ__FIU6U- z%%3fyX#4TI6b=4XJlNVSlcT?LtR?ZrT(Y&{B)}&gekmI(x$$)**bd*a15ZAE^DBzC d(xaMYy7idu&;B)~{+~gc*ZkRA;?L3m{}%~yM7aO} literal 0 HcmV?d00001 diff --git a/tools/PR_announcer_bot/sendkeys_ss13/sendkeys_ss13.csproj b/tools/PR_announcer_bot/sendkeys_ss13/sendkeys_ss13.csproj new file mode 100644 index 00000000000..f9ea695d25a --- /dev/null +++ b/tools/PR_announcer_bot/sendkeys_ss13/sendkeys_ss13.csproj @@ -0,0 +1,68 @@ + + + + + Debug + AnyCPU + {5D939FCB-F326-4B9B-8CEC-B2538126392E} + Exe + Properties + sendkeys_ss13 + sendkeys_ss13 + v4.5 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + .\Meebey.SmartIrc4net.dll + + + .\StarkSoftProxy.dll + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 1d8fd374a992bd87341652a4eab0c144e72a2c59 Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 19:04:29 +0200 Subject: [PATCH 02/12] updates the code --- .../PR_announcer_bot/sendkeys_ss13/Program.cs | 72 +++++++++++++++---- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/tools/PR_announcer_bot/sendkeys_ss13/Program.cs b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs index 0e61ae16a59..a6da1ef8d23 100644 --- a/tools/PR_announcer_bot/sendkeys_ss13/Program.cs +++ b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs @@ -1,4 +1,20 @@ -using System; +////////////////////////////////////////////////////////////////// +/////GitHub pull request announcer bot for IRC//////////////////// +/////Made by VistaPOWA for the /tg/station 13 code project./////// +/////This software is licensed under GPL3.//////////////////////// +/////Prequisites: Meebey's SmartIrc4Net library (incl, under GPL)/ +///// StarkSoft Proxy library (incl, under GPL)/////// +/////Usage: Edit the config.txt file to match the settings//////// +/////of your server's. Start the executable. Set up a Github hook/ +/////if you hadn't before to send IRC notifications to the//////// +/////channel of your choosing. Leave it running.////////////////// +/////IT IS PREFERABLE IF YOU RAN THIS LOCALLY. YOUR SERVER'S////// +/////API/COMMS KEY WILL BE SENT PLAINTEXT! ENSURE THAT THE API//// +/////KEY IS NOT PUBLICALLY AVAILABLE! IF LEAKED, CHANGE IT./////// +/////Support available @ Rizon's #coderbus, ask for VistaPOWA.//// +////////////////////////////////////////////////////////////////// + +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -16,24 +32,28 @@ namespace sendkeys_ss13 public static string serverIP = "127.0.0.1"; public static int serverPort = 11111; public static string commskey = "this_is_a_test_key"; - public static string IRC_bot_name = "testbot_github"; + public static string Github_bot_name = "testbot_github"; + public static string IRC_bot_name = "testbot"; + public static string IRC_server = "test.net"; + public static int IRC_port = 11111; + public static string IRC_channel = "#channel"; public static IrcClient irc = new IrcClient(); public static void Main(string[]args) { - ReadConf(ref serverIP, ref serverPort); + ReadConf(); irc.OnChannelMessage += new IrcEventHandler(OnChannelMessage); irc.SupportNonRfc = true; - irc.Connect("irc.rizon.net" , 6670); - Console.WriteLine("{DBG} Connected to IRC"); - irc.Login("vista_fun_bot", "vistas_fun_bot"); - Console.WriteLine("{DBG} Logged in"); - irc.RfcJoin("#fukkentestchannel"); - Console.WriteLine("{DBG} Joining #coderbus"); + irc.Connect(IRC_server , IRC_port); + Console.WriteLine("Connected to IRC"); + irc.Login(IRC_bot_name, IRC_bot_name); + Console.WriteLine("Logged in"); + irc.RfcJoin(IRC_channel); + Console.WriteLine("Joining {0}", IRC_channel); irc.Listen(); } - public static void ReadConf(ref string IP, ref int port) + public static void ReadConf() { if (File.Exists("config.txt")) { @@ -70,17 +90,43 @@ namespace sendkeys_ss13 line = reader.ReadLine().Split(' '); if(line[2] != null) { - IRC_bot_name = line[2]; - Console.WriteLine("Read IRC bot name: " + IRC_bot_name); + Github_bot_name = line[2]; + Console.WriteLine("Read Github bot name: " + Github_bot_name); } else { Console.WriteLine("No botname found."); return; } + line = reader.ReadLine().Split(' '); + if(line[2] != null) + { + IRC_bot_name = line[2]; + Console.WriteLine("Read IRC bot name: " + Github_bot_name); + } + else { Console.WriteLine("No botname found."); return; } + line = reader.ReadLine().Split(' '); + if (line[2] != null) + { + Match match3 = Regex.Match(line[2], @"(.+)\:(\d{1,5})"); //rudimentary port validation + if (match3.Success) + { + IRC_server = Convert.ToString(match3.Groups[1]); + Int32.TryParse(Convert.ToString(match3.Groups[2]), out IRC_port); + Console.WriteLine("Read IRC server: " + IRC_server + ":" + Convert.ToString(IRC_port)); + } + else { Console.WriteLine("Server:port invalid."); return; } + } + line = reader.ReadLine().Split(' '); + if (line[2] != null) + { + IRC_channel = line[2]; + Console.WriteLine("Read channel: " + IRC_channel); + } + else { Console.WriteLine("No channel found."); return; } reader.Close(); } else { Console.WriteLine("Config file doesn't exist, using defaults"); return; } } public static void OnChannelMessage(object sender, IrcEventArgs e) { - if(e.Data.Nick == IRC_bot_name) + if(e.Data.Nick == Github_bot_name) { StreamWriter output = new StreamWriter("output.txt"); string[] msg = e.Data.Message.Split(' '); From 00176c1b8cb8572355aef62443031c1dba472aa9 Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 19:07:09 +0200 Subject: [PATCH 03/12] Removes an useless message_admins. --- code/controllers/configuration.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 6fd8dc91218..f0f0f727089 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -270,9 +270,7 @@ automute_on = 1 if("comms_key") comms_key = value - if(value == "default_pwd" || length(value) <= 6) //It's the default value or less than 6 characters long, warn badmins - message_admins("The server's API key is either too short or is the default value! Consider changing it immediately!") - else + if(value != "default_pwd" && length(value) > 6) //It's the default value or less than 6 characters long, warn badmins comms_allowed = 1 else diary << "Unknown setting in configuration: '[name]'" From 8453cf9af8cf64d625b6605efdd98746d231a9a3 Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 19:10:30 +0200 Subject: [PATCH 04/12] Removes a redundant message part. --- code/world.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/world.dm b/code/world.dm index 279a6e99ef8..352d1b3fe8e 100644 --- a/code/world.dm +++ b/code/world.dm @@ -166,7 +166,7 @@ if(input["key"] != config.comms_key) return "Bad Key" else - world << "New pull request created: [input["announce"]]" + world << "[input["announce"]]" /world/Reboot(var/reason) From 19d46a7084544ae28127cc302c1941f4290e6be3 Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 19:16:10 +0200 Subject: [PATCH 05/12] Adds a separate config option for enabling comms/API --- code/controllers/configuration.dm | 9 +++++---- config/config.txt | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index f0f0f727089..4b2d5e28e4d 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -268,10 +268,11 @@ Tickcomp = 1 if("automute_on") automute_on = 1 - if("comms_key") - comms_key = value - if(value != "default_pwd" && length(value) > 6) //It's the default value or less than 6 characters long, warn badmins - comms_allowed = 1 + if("comms_enabled") //Whether comms are enabled at all + if("comms_key") //The actual password + comms_key = value + if(value != "default_pwd" && length(value) > 6) //It's the default value or less than 6 characters long, warn badmins + comms_allowed = 1 else diary << "Unknown setting in configuration: '[name]'" diff --git a/config/config.txt b/config/config.txt index e084f8176d8..3b1ba3afeca 100644 --- a/config/config.txt +++ b/config/config.txt @@ -145,5 +145,6 @@ TICKCOMP 0 ## Comment this out to disable automuting #AUTOMUTE_ON -## Communication key for receiving data through world/Topic(), you don't want to give this out +## Communication key for receiving data through world/Topic(), you don't want to give this out. Comms_enabled will be on if it's uncommented AND it's not the default value. +COMMS_ENABLED COMMS_KEY default_pwd \ No newline at end of file From 2459f5c17fa8165fb9056cd1983b79dcba0816fd Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 19:18:16 +0200 Subject: [PATCH 06/12] Makes the nag message not activate if comms are not enabled This nag message should only come up when something has gone horribly wrong. --- code/modules/client/client procs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 92b5aba183a..6256c3001df 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -130,7 +130,7 @@ var/next_external_rsc = 0 if(holder) add_admin_verbs() admin_memo_show() - if(config.comms_key == "default_pwd" || length(config.comms_key) <= 6) //It's the default value or less than 6 characters long, warn badmins + if(config.comms_key == "default_pwd" || length(config.comms_key) <= 6 && !config.comms_enabled) //It's the default value or less than 6 characters long, but it somehow didn't disable comms. src << "The server's API key is either too short or is the default value! Consider changing it immediately!" log_client_to_db() From 08e44ad812e59eed89195241bf8992f3318ff9f5 Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 19:19:10 +0200 Subject: [PATCH 07/12] Revert "Adds a separate config option for enabling comms/API" This reverts commit 19d46a7084544ae28127cc302c1941f4290e6be3. --- code/controllers/configuration.dm | 9 ++++----- config/config.txt | 3 +-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 4b2d5e28e4d..f0f0f727089 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -268,11 +268,10 @@ Tickcomp = 1 if("automute_on") automute_on = 1 - if("comms_enabled") //Whether comms are enabled at all - if("comms_key") //The actual password - comms_key = value - if(value != "default_pwd" && length(value) > 6) //It's the default value or less than 6 characters long, warn badmins - comms_allowed = 1 + if("comms_key") + comms_key = value + if(value != "default_pwd" && length(value) > 6) //It's the default value or less than 6 characters long, warn badmins + comms_allowed = 1 else diary << "Unknown setting in configuration: '[name]'" diff --git a/config/config.txt b/config/config.txt index 3b1ba3afeca..e084f8176d8 100644 --- a/config/config.txt +++ b/config/config.txt @@ -145,6 +145,5 @@ TICKCOMP 0 ## Comment this out to disable automuting #AUTOMUTE_ON -## Communication key for receiving data through world/Topic(), you don't want to give this out. Comms_enabled will be on if it's uncommented AND it's not the default value. -COMMS_ENABLED +## Communication key for receiving data through world/Topic(), you don't want to give this out COMMS_KEY default_pwd \ No newline at end of file From c470ce545a0557511136a81c12f0a31c23133572 Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 19:22:28 +0200 Subject: [PATCH 08/12] oops, mistyped there --- code/modules/client/client procs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 6256c3001df..e5421b8db88 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -130,7 +130,7 @@ var/next_external_rsc = 0 if(holder) add_admin_verbs() admin_memo_show() - if(config.comms_key == "default_pwd" || length(config.comms_key) <= 6 && !config.comms_enabled) //It's the default value or less than 6 characters long, but it somehow didn't disable comms. + if(config.comms_key == "default_pwd" || length(config.comms_key) <= 6 && !config.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms. src << "The server's API key is either too short or is the default value! Consider changing it immediately!" log_client_to_db() From d804f9408e09ae674ca4d4d201987db26b451021 Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 19:23:48 +0200 Subject: [PATCH 09/12] Config_key now starts out uncommented in config I wonder how much stress am I putting on Travis with my minutely commits! --- config/config.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.txt b/config/config.txt index e084f8176d8..8f71955fac1 100644 --- a/config/config.txt +++ b/config/config.txt @@ -146,4 +146,4 @@ TICKCOMP 0 #AUTOMUTE_ON ## Communication key for receiving data through world/Topic(), you don't want to give this out -COMMS_KEY default_pwd \ No newline at end of file +#COMMS_KEY default_pwd \ No newline at end of file From d8d16e5eae2d109b6f9d38ffa1823379e019201f Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Sun, 13 Apr 2014 20:27:27 +0200 Subject: [PATCH 10/12] Adds a bit more sanitization to the PR announcer Shouldn't be parsing any HTML tags inside the PR name. --- tools/PR_announcer_bot/sendkeys_ss13.exe | Bin 9216 -> 9216 bytes .../PR_announcer_bot/sendkeys_ss13/Program.cs | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/PR_announcer_bot/sendkeys_ss13.exe b/tools/PR_announcer_bot/sendkeys_ss13.exe index d27522e25f7e0a2d4735895143c0ce83b5290833..fe2d39efbf1befcfcd4ccc9d98222367ae95396f 100644 GIT binary patch delta 353 zcmZqhXz-ZO!L;Yv#I7>F0t*HPZw4T6U|>jKov0|xlfb~h1LRwnGcd?ZR%Ftd9Lczw zM?jE)fti7cfsuiMZSq4&gUtaX-=7O`{8DoUPg$)>=VzB!7Gkx`@+ zD3xyplu{Gp(UxFi0?X&KOEGp&?qaugpAM9602;=kkgmph6Y3S#{SvDknthz@p;nBZg{js!^+pi1S?V1@&H3=9H5mn*x6db$AV3!7UxT6m>o zqZwkrPz^}h0a%r$}*&%bOikW?Lq9i*bF3=0N^UjKov0|xlfb~h1LPZ+Gcd?ZR%Ftd9Lczw zheMEofti7cfsuiMZSq4&gUtaX-=7O`{8DvF+L$)>;T(R(=^HPID?^)M<58wPl%!NsG_5m+&XaF6=AOm!t f4=@ybCI?E2GqP>Ylw@aQoG`gi%5d{6sWeUilT1mG diff --git a/tools/PR_announcer_bot/sendkeys_ss13/Program.cs b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs index a6da1ef8d23..96b58717010 100644 --- a/tools/PR_announcer_bot/sendkeys_ss13/Program.cs +++ b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs @@ -133,7 +133,7 @@ namespace sendkeys_ss13 for (int i = 0; i < msg.Length; i++) { msg[i] = Regex.Replace(msg[i], @"[\x02\x1F\x0F\x16]|\x03(\d\d?(,\d\d?)?)?", String.Empty); //Sanitizing color codes - msg[i] = Regex.Replace(msg[i], @"[\\\&\=\;]", " "); //Filtering out some iffy characters + msg[i] = Regex.Replace(msg[i], @"[\\\&\=\;\<\>]", " "); //Filtering out some iffy characters Console.Write(msg[i] + " "); } Console.WriteLine(); From 10889bd303782d51300768d536981bc01d57b97b Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Mon, 14 Apr 2014 21:07:00 +0200 Subject: [PATCH 11/12] huge update Makes the announcer better in every aspect (less bugs, less fun, more merging announcement capability)! Also makes it require *just* .Net 4.0 instead of 4.5. Adds the option for players to disable the PR announcements. --- code/__DEFINES/preferences.dm | 3 +- code/modules/client/client procs.dm | 2 +- code/modules/client/preferences.dm | 4 +- code/modules/client/preferences_toggles.dm | 9 ++ code/world.dm | 7 +- tools/PR_announcer_bot/sendkeys_ss13.exe | Bin 9216 -> 10240 bytes tools/PR_announcer_bot/sendkeys_ss13.v12.suo | Bin 35840 -> 0 bytes .../PR_announcer_bot/sendkeys_ss13/App.config | 8 +- .../PR_announcer_bot/sendkeys_ss13/Program.cs | 113 +++++++++++++++--- .../sendkeys_ss13/sendkeys_ss13.csproj | 3 +- 10 files changed, 121 insertions(+), 28 deletions(-) delete mode 100644 tools/PR_announcer_bot/sendkeys_ss13.v12.suo diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index d1ae438525c..3074c797f6e 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -11,8 +11,9 @@ #define CHAT_PRAYER 256 #define CHAT_RADIO 512 #define MEMBER_PUBLIC 1024 +#define CHAT_PULLR 2048 -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC) +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC|CHAT_PULLR) #define BE_TRAITOR 1 #define BE_OPERATIVE 2 diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index e5421b8db88..d87d0e987a4 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -130,7 +130,7 @@ var/next_external_rsc = 0 if(holder) add_admin_verbs() admin_memo_show() - if(config.comms_key == "default_pwd" || length(config.comms_key) <= 6 && !config.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms. + if((config.comms_key == "default_pwd" || length(config.comms_key) <= 6) && config.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms. src << "The server's API key is either too short or is the default value! Consider changing it immediately!" log_client_to_db() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 34b340c0e29..55122f4da47 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -203,6 +203,7 @@ datum/preferences dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
" dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
" dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
" + dat += "Pull requests: [(toggles & CHAT_PULLR) ? "Yes" : "No"]
" if(config.allow_Metadata) dat += "OOC Notes: Edit
" @@ -674,7 +675,8 @@ datum/preferences if("ghost_sight") toggles ^= CHAT_GHOSTSIGHT - + if("pull_requests") + toggles ^= CHAT_PULLR if("save") save_preferences() save_character() diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 31eb62cd73d..2fc6ef47c14 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -55,6 +55,15 @@ src << "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat." feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/verb/togglePRs() + set name = "Show/Hide Pull Request Announcements" + set category = "Preferences" + set desc = "Toggles receiving a notification when new pull requests are created." + prefs.toggles ^= CHAT_PULLR + prefs.save_preferences() + src << "You will [(prefs.toggles & CHAT_PULLR) ? "now" : "no longer"] see new pull request announcements." + feedback_add_details("admin_verb","TPullR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/verb/toggletitlemusic() set name = "Hear/Silence LobbyMusic" set category = "Preferences" diff --git a/code/world.dm b/code/world.dm index 352d1b3fe8e..506b0cdd7b4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -166,8 +166,11 @@ if(input["key"] != config.comms_key) return "Bad Key" else - world << "[input["announce"]]" - + #define CHAT_PULLR 2048 + for(var/client/C in clients) + if(C.prefs && (C.prefs.toggles & CHAT_PULLR)) + C << "PR: [input["announce"]]" + #undef CHAT_PULLR /world/Reboot(var/reason) #ifdef dellogging diff --git a/tools/PR_announcer_bot/sendkeys_ss13.exe b/tools/PR_announcer_bot/sendkeys_ss13.exe index fe2d39efbf1befcfcd4ccc9d98222367ae95396f..ed9a5a16ffcc748d45603008b3361a3419b60b9c 100644 GIT binary patch delta 3380 zcmYjU4Nz3q6+ZX<+RAS^Br0r?aET8Lnz5P=jGMHHH(X2mCL13Y}Y7>QGM zjhQsGlQ#4D!sfAgM1>%X3|Z4S`C?&Mn{!D+P%?^2 zYbXC)v^?qrxN%oR;J~A##L|$lgMia0ONuU+wjkb z;~e_92Vm!ba}Z&qe8Fw2F02CVkg%3~Zgppr2%9&3Rk^HaoLUw4tX`m0Deh%`k!$I9 zX(3-_jqBwVDI?tDGd$mpFaMn~7 z--k7M!c)!xVOS2g`nX`=IyvWB&{`_T=Y3jjFPs z&-8_yQ^L*kg|h&;&TleWo+p0_`a5WoRbhJyA|?PuTjMf8>ifRh1=~Ik|-+6&a&@^yeMpc8AGB2Aa`6rY`(Z3 z+9>u4XWf8qRWUt4BQrR+O&uBbUU~dpKceY`HnYxC3l~sm<^V7S+ z#}#8L!&c@9`SW&WSb4(XyZmkL4Bd{vGyP1-HqB+0b>KFh0A5*w3bmF|Oe_~aXAG0m zqE*rUN}{xAmGiXV#K~}`g@ny$&P5@KyVAKXBykI8W{CUP`G?@}Jkn&_LRz8|+0x>^ zuP9W?H$kZ&a?6axjXuOE87JC{aRyOJx{^+OxIZBlQ-_C=A?)2V*D`J7JVXa1c>+B19)7$K!|y8OV=IbI%)*)CGDK{dgb9X&Y-~oE~Q*z{3(xOMFM- zhY~%Cuog>flsKwvRX9yZ{Jvy(irU^M$TMefO&`<4Jh32P?61#z%hNX2}TAu*pr5Q~G{Xovm(M5#&^)z;`K3ol(@74$_|}AJ6^2&1!$4A~fXXl8o(Nv>2LEDzr(;VpX^qPR?pM zY#G{hrcBtL%q?Pd*jb0vCUej5B52}$QikKmsEXk}QfP%#R!OX9MO4HZXo(HT0e z_JNvF2k3RWq&7%q7}h_kb@W^MSWVJJOm0A(?$XBSCf%)lo&JvAK0%B!l1?@V*UzVY-Yd2^K z6UmC$Ey-}*i)23i16sy}|4mw?-;ilO0aoj`u-rPmk5EDEQY8Bfa*wXEW$ZLI(*)kj zV(eu-%;Jy>Sra>BfK>ifCpJnl_Y(ER~2f-Kc9l%w* zpG~kjeTYr6&AbktyZ9(O%ntH>>;>#~KRbg24Kn>fCKhp&Wzk7&!^C#5IEgj5y-#gr zH58;zf%#-8HB=(8QsN59;}nB$mQ0t#2dEUxBh(2@&_lp|vQI~A7 z_9nME@ucODJ+i%h*xEfB8;mE%sNYI%@34mZlLI8}?tjfp<_~e$ck&M3HN)FiWkw9VU4(n_@JS45y5Vcy#*+8>IdrLeqVkcrd1}(~n z7RhX2hZ9z2!mQkuOpe@XgWP7tc3MueJveCfCFAz6+(O&kl1-49u-VGY&UjL{6Q`QK zzNGC;p9{p*R38nJjXGPjlPKG!5lF+c+7QMVv?SdF+X#)qZ{QA_L;V@eY=B=BHV67H z!qu>1i^rl5`>{8Ie&Qyf|i&?ah*fgi!*;?##A zNy!ewYcEyPqw=pBscfVi0yBznP=@aVw^J^QWp(1Kxr?@7DH%H!w%}g5rD1rDVli%8 z=sA34)QtSBs;P8Q+fTwbFW>NYjgs-p#~$38xANMA!u<+2R35>gs63FR6JrrS-mQ4y zD6Almtr7G4-AMS{0+{?TMadAH&Z8`lKI(oHu1Mv3vIFU7BYwjl(G3GEuIB^kS0ZY} z&k1h7_TwcONWZQ}Sw#11QO3M_6vUgJs0zj~q;_87I|%GI)9+?`G)#=>@Cu|aX0oZC zsDkjS;qj;#b)%Kh!kXp{_ib6{#D=U#ZRe4yt(KF(QEA+>vIgG~Tl_hO_l zbAAoxL~mQ7E8SzcN0$=K{VyZl-vx|l2H%G>_(I;?)zWqRjq32BiCZn{hL&FyTzX86 sOvm#)%&(#BbHBnycYNVOp80oVdTOD@ru_xCbfva&+ARKvP1bt;4==Eh2LJ#7 delta 2199 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 F|NlHSqA~yg diff --git a/tools/PR_announcer_bot/sendkeys_ss13/App.config b/tools/PR_announcer_bot/sendkeys_ss13/App.config index 8e15646352e..72a71af99a7 100644 --- a/tools/PR_announcer_bot/sendkeys_ss13/App.config +++ b/tools/PR_announcer_bot/sendkeys_ss13/App.config @@ -1,6 +1,6 @@ - + - - - \ No newline at end of file + + + diff --git a/tools/PR_announcer_bot/sendkeys_ss13/Program.cs b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs index 96b58717010..ac79ba7df6d 100644 --- a/tools/PR_announcer_bot/sendkeys_ss13/Program.cs +++ b/tools/PR_announcer_bot/sendkeys_ss13/Program.cs @@ -38,6 +38,9 @@ namespace sendkeys_ss13 public static int IRC_port = 11111; public static string IRC_channel = "#channel"; + public static string[] merge_archive; + public static bool mergeflag = false; + public static IrcClient irc = new IrcClient(); public static void Main(string[]args) { @@ -67,7 +70,11 @@ namespace sendkeys_ss13 serverIP = line[2]; Console.WriteLine("Read IP: " + serverIP); } - else { Console.WriteLine("IP cannot be validated."); return; } + else + { + Console.WriteLine("IP cannot be validated."); + return; + } } line = reader.ReadLine().Split(' '); if (line[2] != null) @@ -78,7 +85,11 @@ namespace sendkeys_ss13 serverPort = Convert.ToInt32(line[2]); Console.WriteLine("Read port: " + serverPort); } - else { Console.WriteLine("Port cannot be validated."); return; } + else + { + Console.WriteLine("Port cannot be validated."); + return; + } } line = reader.ReadLine().Split(' '); if (line[2] != null) @@ -86,21 +97,33 @@ namespace sendkeys_ss13 commskey = line[2]; Console.WriteLine("Commskey read."); } - else { Console.WriteLine("No Commskey!"); return; } + else + { + Console.WriteLine("No Commskey!"); + return; + } line = reader.ReadLine().Split(' '); - if(line[2] != null) + if (line[2] != null) { Github_bot_name = line[2]; Console.WriteLine("Read Github bot name: " + Github_bot_name); } - else { Console.WriteLine("No botname found."); return; } + else + { + Console.WriteLine("No botname found."); + return; + } line = reader.ReadLine().Split(' '); - if(line[2] != null) + if (line[2] != null) { IRC_bot_name = line[2]; Console.WriteLine("Read IRC bot name: " + Github_bot_name); } - else { Console.WriteLine("No botname found."); return; } + else + { + Console.WriteLine("No botname found."); + return; + } line = reader.ReadLine().Split(' '); if (line[2] != null) { @@ -111,7 +134,11 @@ namespace sendkeys_ss13 Int32.TryParse(Convert.ToString(match3.Groups[2]), out IRC_port); Console.WriteLine("Read IRC server: " + IRC_server + ":" + Convert.ToString(IRC_port)); } - else { Console.WriteLine("Server:port invalid."); return; } + else + { + Console.WriteLine("Server:port invalid."); + return; + } } line = reader.ReadLine().Split(' '); if (line[2] != null) @@ -119,10 +146,18 @@ namespace sendkeys_ss13 IRC_channel = line[2]; Console.WriteLine("Read channel: " + IRC_channel); } - else { Console.WriteLine("No channel found."); return; } + else + { + Console.WriteLine("No channel found."); + return; + } reader.Close(); } - else { Console.WriteLine("Config file doesn't exist, using defaults"); return; } + else + { + Console.WriteLine("Config file doesn't exist, using defaults"); + return; + } } public static void OnChannelMessage(object sender, IrcEventArgs e) { @@ -134,19 +169,36 @@ namespace sendkeys_ss13 { msg[i] = Regex.Replace(msg[i], @"[\x02\x1F\x0F\x16]|\x03(\d\d?(,\d\d?)?)?", String.Empty); //Sanitizing color codes msg[i] = Regex.Replace(msg[i], @"[\\\&\=\;\<\>]", " "); //Filtering out some iffy characters - Console.Write(msg[i] + " "); } - Console.WriteLine(); - if (msg[2] == "opened") + if (msg[2] == "closed") { + merge_archive = msg; + mergeflag = true; + output.Close(); + } + else if ((msg[2] == "opened" || mergeflag) && msg[1] != "meant:") //Either we open a new PR or a PR was closed in the last message. Also protection from Whibyl's correction thingy! + { + if(msg[2] == "pushed") + { + msg = merge_archive; //We copy the "close" message and replace "close" with merge! The players won't know what him 'em! + msg[2] = "merged"; + } + mergeflag = false; + merge_archive = null; + string URL = ShortenURL(msg[msg.Length - 1]); + msg[5] = "" + msg[5] + ""; + msg[0] = ""; //Stripping the useless string parts. + msg[msg.Length - 1] = ""; byte[] PACKETS = CreatePacket(msg); PACKETS[1] = 0x83; int len = 0; - for (int i = 0; i < msg.Length; i++) + for (int i = 1; i < msg.Length; i++) { - len += msg[i].Length + 1; + len += msg[i].Length + 1; //The length of the word and the space following it. + Console.Write(msg[i] + " "); } - len += 14 + commskey.Length + 6; + len -= 1; //Compensating for the lack of space at the end. + len += 14 + commskey.Length + 6; //Argument names + Commskey length + 6 null bytes PACKETS[3] = (byte) len; StringBuilder test = new StringBuilder(); @@ -161,9 +213,31 @@ namespace sendkeys_ss13 server.Connect(ip); server.Send(PACKETS); output.Close(); + Console.WriteLine("- sent ;)"); + Console.WriteLine(); + } + else + { + mergeflag = false; + merge_archive = null; + output.Close(); } } } + private static string ShortenURL(string URL) //derived from GitIoSharp by dimapasko + { + WebRequest request = WebRequest.Create("http://git.io"); + request.ContentType = "application/x-www-form-urlencoded"; + request.Method = "POST"; + byte[] packet = Encoding.ASCII.GetBytes("url=" + URL); + request.ContentLength = packet.Length; + using(Stream stream = request.GetRequestStream()) + { + stream.Write(packet, 0, packet.Length); + } + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + return Convert.ToString(new Uri(response.Headers[HttpResponseHeader.Location])); + } private static byte[] CreatePacket(string[] msg) { @@ -173,9 +247,12 @@ namespace sendkeys_ss13 packet.Append((char)x83); packet.Append((char)'\x00',6); packet.Append("?announce="); - for (int i = 0; i < msg.Length; i++) + for (int i = 1; i < msg.Length; i++) { - packet.Append(msg[i] + " "); + if(i == msg.Length - 1) + packet.Append(msg[i]); + else + packet.Append(msg[i] + " "); } packet.Append("&key="); packet.Append(commskey); diff --git a/tools/PR_announcer_bot/sendkeys_ss13/sendkeys_ss13.csproj b/tools/PR_announcer_bot/sendkeys_ss13/sendkeys_ss13.csproj index f9ea695d25a..07e25db3b15 100644 --- a/tools/PR_announcer_bot/sendkeys_ss13/sendkeys_ss13.csproj +++ b/tools/PR_announcer_bot/sendkeys_ss13/sendkeys_ss13.csproj @@ -9,8 +9,9 @@ Properties sendkeys_ss13 sendkeys_ss13 - v4.5 + v4.0 512 + AnyCPU From 157af51bb99935b23e2a38f5de62b688f0da6559 Mon Sep 17 00:00:00 2001 From: VistaPOWA Date: Tue, 15 Apr 2014 21:51:11 +0200 Subject: [PATCH 12/12] Updates a bunch of things Branch info no longer included in PR message. Exception handling everywhere. Retrying connection is now a feature, also it won't crash anymore if the server goes down for some reason when it tried to send. Refactored code. Removed 54331321314314135 counts of /client/proc/fun() --- tools/PR_announcer_bot/sendkeys_ss13.exe | Bin 10240 -> 11776 bytes .../PR_announcer_bot/sendkeys_ss13/Program.cs | 144 ++++++++++++++---- 2 files changed, 111 insertions(+), 33 deletions(-) diff --git a/tools/PR_announcer_bot/sendkeys_ss13.exe b/tools/PR_announcer_bot/sendkeys_ss13.exe index ed9a5a16ffcc748d45603008b3361a3419b60b9c..4f9332811d96c633b60d655faeb75d65115812ad 100644 GIT binary patch delta 5389 zcmcgwdvH|c6+hqI``AZVayQ9tLbBw>z_O4K0@MehH33725P<|rQqdA%4Nb-6;C9Kv$WZ|CV-6?8At3m0w zQ{Jycb*KOe4yfK65f@k|V3DtdxE0c9-BhCDav}j9x9%;Q*r-Js1N5P{LTPs61$a|O zmZS!GOmsU`^4#G|W(^CKiJS05N;_}mC*Wg6b5T;z`Q;vuA zoU#BYIfX|ioJPl;s(A&b&a>MQGa{ploQ_VGjQiJ_&*o$&pV>D(XIQEua>LV{?WaT~ zjT&u4k7MJ_fL)IO?CAi%@C~5quN@W70ORjlk=!+Z)57scU4w4u#;|jYy*ENDJrnS# zFRW8(z-a^cLL<@TMhtyd->ld5cpAH_BWJ2?)ahyTI~vDy+M%4A1q)#XRbR_XWgH2m z5JHlPLKvvqv!QWG4vSdprZKJQ;X$6Bvydke!;Z@n--7C#i$+yacwgEF`+R#xdj9 zQEu(U5SutVxff-mvkr$6-Qz;l(LsLtUCEsB=Gaj(_T~uqsnja2wB&qG8@24eLE_Su z;%ki%Qu5FKiIlpMdid-ThPyc}30y4b-;M@sT zk;j+a3Le?*>bt?U7qYJ11}q91ameheK*tMFWHS;D*6TsPt|OhPL6#v=9wc3XMDKxF z$()hs8Lvq0)>K`YQ)-N6=v!7w)REK(>8`y9-tuTHfj7fq(A5dM9YgMFfZY6PrpkLN zu1~;gs&If@iZr)9J1aeFB{kp&7zQT-)+C_DdV8K0+q|K~d3 zt$+>(&z~-S&-m4yHc?6ABP~45dpR`O-2#)fgG3);L@}tgGw<|edu4o0XxbtetzFSc zi}88GpBS~RE85UOvJsMem)7{)=Tw8eshZ?-MPf3zhb1>eNl}lJ@Rk(M4be(58(B0> z@wrW6E@if?Go)YQ{o(n%@W%rE|b_Tu}5N`#GA<7B|2!UWVT7XL*fu{B|QSX zmi7T#>1p5^GU>~}df<4qgAULPHA{!6Ma|O@>Q%olX&2b9-VU8j>JB8;d_*(R}7tkK)WHqgsOx0s=> z0^Xvpg@qQihK9slx+8{!r?-Rt32=}2wZ2vC5eIb_^4Ik3z(47Cy5bRWRND=Pj30}A zqS1Ir96+v*i9;~mj!-_+o|8emBto*>u&J%h$v2I-J+!Q`EU3lNq262)%#B zQlXYDYcm7+K0E8BN+x^DORo1`Ea~$uD$RI5C@b~uFa6lNx2zZc&2ihP12wczt_(S} zNuou4;4OS~XQ>CW9`I{u1LiEyd0?K_ORk@6>IapDqyh2{&}$*f;*TlT^U{Mc@tOxq;*~L;BNRJHIlC$jSM$Bx5Q$B$mgsA6DE~&|Kgk>y83>akdl6yTLh< zV5^`B4Oh1;U*PogXExj3;i`8NH1?|`zE7!25bbWpUF-ce85h<2-%1)H_U1hPa`CT! zFl`Oh#FZ2C_UqL_;jNz7=tZrZxti!O+ZeqD*6zRCvb9i?|Dz<$-fyNp5krl}e*o7_ BqA~yg delta 3872 zcmb7HeQ;FO6+icV-1qin^UB+W-NfuByDThAvV;IqlM;|f<-=kDnMkNQ1!+vv3J>1~ zrx_)?h-0M|HN1+Nk+C|J(N1ZlQD&l38>ecgGxY;Hw%Q^C?R0=~)H>+2<&VAtXA>naD3 zZ7)nCa)z)DW5}EYKLJ^g`{FFtX!uEqKq82}7|F(h58q z!ER1~sX_)5Y6UGd!NY98t7)DHQ1vf8sr<`}{(IQ}Z_ASbY9rMES3q3I!a?T31){ly zNw$LYjo?oll&K$1N7@CzXOTa;bY#o3RAlR7dKJSKRQ7 zYC$)GKo>ble+E};CZK}e<#~w9PTfU$+2WPtp^*r5!Mf=*T&@PATDL|a-d+p!8y)nE;I{mfG3qSxLT*}!4^PO zXeWE3wsn91{NHnt`&iCli*c(G!J3j42Ppk{kTtW$j!BI<&Ja&^+<}8)B}anYJTV_? z9sMk+L;T@M-J(0h&T#mG$02(%p}blMo7^~3K$FQ@tD#{p4ycGny=Wph#9Cf783EJ< zzpiriR>KJR%Yxrj`N9IVszmTQ^HpyXbOC)=mfR`H3{EpWmWZ3lxNMp2nU*I<{L5jP z?CFUsu38Os)E7eT$z)F)r<#lMmS-k6@)gqL4)L*4hCL~^^o)AXJoZ@W%P@&siMZWT z=UJZN*~0}~V2!(Rd-U)_h`O{`ZnSK&%Xo2%8Fs`hJQr>LRLC=;(7S$o0X*kCDi9T{8z z?RSBe!7>BnRUiw?0Kv6jHFetkuY#}P3Vg@EnpOSfK=erhB7X(w6OLV!w!aeOap|wZ zFo2p0Ty@ugZc6%JqcS~=yxK8D zuW~Yx^1sev8EoKu+nG*ATZ*>E?Xw^%HG8BgZJEmSdTWKw#Rrmwh+^7}SfoUcRx75rmN72N&A)@bL9EX$K`hlQ-TVIKj zX~&1$=K1dRwA3R)aVfW=dlfd0)`EW!w?^)&Tm73^84p;oVVXubhD7IQE+Bk@aZCxV z%5#MHgzWH9CqfS7ve*b~qq*|?^dd>xAQlTrcZu!5M-?7X__o3i6fw<0}%TlmjGKOyI3wc{5K@)1Pbp`_@u(;Wq5n-rt;bh3QGIwJ!(MB z&rEQCr7TMPT&_CzFPaI?&NDYm5mCgsczS}HD&}Ed#_)+Ex~DEH+Odw+iW{yQlUZ=Q zm$R^)f{H+m7ASh5!j7`YQdV@*Y=!d_b|~ypxJuzVg&P%aR@e{hqT3WbsBo9UJ;3Gk zC~!4B0c@vdfa}Pk+w={AVDQFBt7qPj4EhC|efqDA%Wq(==Ofu&g+*B+_&cENXs0^8_25r6%*V za`6dpj(HyGwwqh116J)Sz<)sZn7WuJj$koekUL_tc+O0Ue$b7gOB~emz&Fe}f>)oV zK~X+ot`URc?`9{MPl3BcL|!j;iMYHG@|3(8xKQ?qJ)+&*Du%^%vK^YY$Q|NQv0vUH zp21poi7^D|RN?mvPU3)w(9>9khvgtSg{?TpheRvI=~G|>*;*^*maCyf;Q}>*p2fs6 zC0VcV2FgS7U0Mq)(M`ZR=oa8^^0n8{PWOtZM$b)|FT##kF?=ajw7RcbOS7Z>{d%)*D6>ec{%GAH_x1 zyLqcp55m7BZV9`Sr^Bw~)UdOzZ}f@!<68J}DiQ8X4TM(u&hVASfqj{0J!;+li(*&4 zY30w7XWu#PuHO-kXNqNmgzHKYX*2EW84^ZD2$w-K0p2PmZ8M{ZR2>Uq-AubS%!I2* z*TgR^HwA&l4qTZLX*Z3tt;Ke_EYYCgx-JxK)^$@UGefb;UMR*YgsO{b@J0lmEiQ*?4&v_V6W1=Xn!`DrseADt`yuXhs)a]", " "); //Filtering out some iffy characters + } + FormMessage(msg); + } + } + + private static void FormMessage(string[] msg, bool ShortenedURL = false) + { + using (StreamWriter output = new StreamWriter("output.txt")) { - StreamWriter output = new StreamWriter("output.txt"); - string[] msg = e.Data.Message.Split(' '); - for (int i = 0; i < msg.Length; i++) - { - msg[i] = Regex.Replace(msg[i], @"[\x02\x1F\x0F\x16]|\x03(\d\d?(,\d\d?)?)?", String.Empty); //Sanitizing color codes - msg[i] = Regex.Replace(msg[i], @"[\\\&\=\;\<\>]", " "); //Filtering out some iffy characters - } if (msg[2] == "closed") { merge_archive = msg; @@ -178,45 +208,40 @@ namespace sendkeys_ss13 } else if ((msg[2] == "opened" || mergeflag) && msg[1] != "meant:") //Either we open a new PR or a PR was closed in the last message. Also protection from Whibyl's correction thingy! { - if(msg[2] == "pushed") + if (msg[2] == "pushed") { msg = merge_archive; //We copy the "close" message and replace "close" with merge! The players won't know what him 'em! msg[2] = "merged"; } mergeflag = false; merge_archive = null; - string URL = ShortenURL(msg[msg.Length - 1]); + string URL = msg[msg.Length - 1]; + if(!ShortenedURL) + URL = ShortenURL(URL); msg[5] = "" + msg[5] + ""; - msg[0] = ""; //Stripping the useless string parts. - msg[msg.Length - 1] = ""; + msg[0] = ""; //Repo name + msg[msg.Length - 1] = ""; //The URL itself + msg[msg.Length - 2] = ""; //Branch info byte[] PACKETS = CreatePacket(msg); PACKETS[1] = 0x83; int len = 0; - for (int i = 1; i < msg.Length; i++) + for (int i = 1; i < msg.Length - 1; i++) { len += msg[i].Length + 1; //The length of the word and the space following it. Console.Write(msg[i] + " "); } len -= 1; //Compensating for the lack of space at the end. len += 14 + commskey.Length + 6; //Argument names + Commskey length + 6 null bytes - PACKETS[3] = (byte) len; - + PACKETS[3] = (byte)len; StringBuilder test = new StringBuilder(); for (int i = 0; i < PACKETS.Length; i++) { test.Append(Convert.ToString(PACKETS[i])); } output.WriteLine(Convert.ToString(test)); - Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - IPEndPoint ip = new IPEndPoint(IPAddress.Parse(serverIP), serverPort); - - server.Connect(ip); - server.Send(PACKETS); - output.Close(); - Console.WriteLine("- sent ;)"); - Console.WriteLine(); + SendPacket(output, PACKETS); } - else + else { mergeflag = false; merge_archive = null; @@ -224,6 +249,41 @@ namespace sendkeys_ss13 } } } + + public static int ServerReconnectAttempt = 0; + private static void SendPacket(StreamWriter output, byte[] PACKETS) + { + Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + IPEndPoint ip = new IPEndPoint(IPAddress.Parse(serverIP), serverPort); + try + { + server.Connect(ip); + server.Send(PACKETS); + Console.WriteLine("- sent ;)"); + output.Close(); + Console.WriteLine(); + } + catch (Exception) + { + ServerReconnectAttempt++; + if(ServerReconnectAttempt <= 5) + { + Console.WriteLine("Server is not available at the moment. Reconnect attempt {0}...", ServerReconnectAttempt); + System.Threading.Thread.Sleep(5000); //Reconnecting after 5 seconds. + SendPacket(output, PACKETS); + } + else + { + output.Close(); + Console.WriteLine("Server appears to be down for good. Press ENTER when you have restarted the server to continue."); + Console.ReadLine(); + ServerReconnectAttempt = 0; + SendPacket(output, PACKETS); + } + } + } + + public static int GitReconnectAttempt = 0; private static string ShortenURL(string URL) //derived from GitIoSharp by dimapasko { WebRequest request = WebRequest.Create("http://git.io"); @@ -231,10 +291,31 @@ namespace sendkeys_ss13 request.Method = "POST"; byte[] packet = Encoding.ASCII.GetBytes("url=" + URL); request.ContentLength = packet.Length; - using(Stream stream = request.GetRequestStream()) + try { - stream.Write(packet, 0, packet.Length); + using (Stream stream = request.GetRequestStream()) + { + stream.Write(packet, 0, packet.Length); + GitReconnectAttempt = 0; + } } + catch (Exception) + { + GitReconnectAttempt++; + if (GitReconnectAttempt <= 3) + { + Console.WriteLine("Git.IO is not available at the moment. Reconnect attempt {0}...", GitReconnectAttempt); + System.Threading.Thread.Sleep(3000); //Attempt to reconnect after 3 seconds. + ShortenURL(URL); + } + else + { + Console.WriteLine("Git.IO is down. Returning long URL."); + GitReconnectAttempt = 0; //Reset counter + return URL; + } + } + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); return Convert.ToString(new Uri(response.Headers[HttpResponseHeader.Location])); } @@ -242,14 +323,11 @@ namespace sendkeys_ss13 private static byte[] CreatePacket(string[] msg) { StringBuilder packet = new StringBuilder(); - packet.Append((char)'\x00'); - byte x83 = 0x83 ; - packet.Append((char)x83); - packet.Append((char)'\x00',6); + packet.Append((char)'\x00', 8); //packet[1] is 0x83, packet[3] contain length packet.Append("?announce="); - for (int i = 1; i < msg.Length; i++) + for (int i = 1; i < msg.Length - 1; i++) { - if(i == msg.Length - 1) + if(i == msg.Length - 2) packet.Append(msg[i]); else packet.Append(msg[i] + " ");