From f468adefbcb63088f7bda558b86047158671760c Mon Sep 17 00:00:00 2001 From: Kabir Goel Date: Fri, 22 Jul 2022 15:50:58 -0700 Subject: [PATCH] initial commit --- COPYING | 675 +++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 21 ++ cmd/dir.go | 18 ++ cmd/game.go | 56 ++++ cmd/install.go | 57 +++++ cmd/root.go | 27 ++ cmd/search.go | 31 +++ games.toml | 3 + go.mod | 34 +++ go.sum | 114 +++++++++ logo.png | Bin 0 -> 54319 bytes main.go | 7 + server/main.go | 7 + 13 files changed, 1050 insertions(+) create mode 100644 COPYING create mode 100644 README.md create mode 100644 cmd/dir.go create mode 100644 cmd/game.go create mode 100644 cmd/install.go create mode 100644 cmd/root.go create mode 100644 cmd/search.go create mode 100644 games.toml create mode 100644 go.mod create mode 100644 go.sum create mode 100644 logo.png create mode 100644 main.go create mode 100644 server/main.go diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..de54ba6 --- /dev/null +++ b/COPYING @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..67b2449 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ + + +# Gameover + +> Play text-based games right in your terminal. + +Gameover is a platform for distributing text-based games for the terminal. It consists of a web-based directory of games and a program for installing and playing them. + +## Features + +1. Search for and install games +2. Compete with friends through shared leaderboards and multiplayer games +3. Easily publish games without worrying about compiling and distributing binaries + +## Develop a game + +Games are written in Go. I recommend using the [Charm](https://charm.sh) libraries. To make your game installable through Gameover, just send a PR adding your game to `games.yml`. + +## License + +Licensed under GNU GPLv3. See COPYING. diff --git a/cmd/dir.go b/cmd/dir.go new file mode 100644 index 0000000..ff6aed0 --- /dev/null +++ b/cmd/dir.go @@ -0,0 +1,18 @@ +package cmd + +import "path/filepath" + +var ( + // GameoverDir is the directory where games are installed. + GameoverDir = "~/.gameover" + // BinariesDir is the directory where binaries are installed. + BinariesDir = "~/.gameover/bin" +) + +func gameoverDir(path string) string { + return filepath.Join(GameoverDir, path) +} + +func binariesDir(path string) string { + return filepath.Join(BinariesDir, path) +} diff --git a/cmd/game.go b/cmd/game.go new file mode 100644 index 0000000..40ef995 --- /dev/null +++ b/cmd/game.go @@ -0,0 +1,56 @@ +package cmd + +import ( + "fmt" + "net/http" + + "github.com/BurntSushi/toml" + "github.com/kbrgl/fuzzy" +) + +type Game struct { + Name string `toml:"name"` + Repo string `toml:"repo"` +} + +func (g *Game) String() string { + return fmt.Sprintf("%s (%s)", g.Name, g.Repo) +} + +func FindGame(name string, games []*Game) *Game { + for _, g := range games { + if g.Name == name { + return g + } + } + return nil +} + +func FilterGames(query string, games []*Game) []*Game { + result := make([]*Game, 0) + for _, g := range games { + if fuzzy.MatchFold(g.Name, query) { + result = append(result, g) + } + } + return result +} + +func FetchGames() ([]*Game, error) { + resp, err := http.Get("https://raw.githubusercontent.com/kbrgl/gameover/master/games.toml") + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + return nil, fmt.Errorf("could not fetch games: %s", resp.Status) + } + var config struct { + games []*Game + } + _, err = toml.NewDecoder(resp.Body).Decode(&config) + if err != nil { + return nil, fmt.Errorf("could not decode games") + } + return config.games, nil +} diff --git a/cmd/install.go b/cmd/install.go new file mode 100644 index 0000000..64899c9 --- /dev/null +++ b/cmd/install.go @@ -0,0 +1,57 @@ +package cmd + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + + "github.com/go-git/go-git/v5" + "github.com/spf13/cobra" +) + +var ( + installCmd = &cobra.Command{ + Use: "install [game]", + Short: "Install a game", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + games, err := FetchGames() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + Install(FindGame(args[0], games)) + }, + } +) + +func init() { + rootCmd.AddCommand(installCmd) +} + +func buildAndAdd(fp string) error { + cmd := exec.Command("go", "build", "-o", binariesDir(filepath.Base(fp)), fp) + err := cmd.Run() + if err != nil { + return err + } + return nil +} + +func Install(g *Game) error { + fp := gameoverDir(g.Name) + _, err := git.PlainClone(fp, false, &git.CloneOptions{ + URL: g.Repo, + }) + if err != nil { + return err + } + + err = buildAndAdd(fp) + if err != nil { + return err + } + + return nil +} diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..e54171b --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,27 @@ +package cmd + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" +) + +var rootCmd = &cobra.Command{ + Use: "gameover", + Short: "Gaming for your terminal", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, +} + +func init() { + rootCmd.CompletionOptions.HiddenDefaultCmd = true +} + +func Execute() { + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/cmd/search.go b/cmd/search.go new file mode 100644 index 0000000..83056e6 --- /dev/null +++ b/cmd/search.go @@ -0,0 +1,31 @@ +package cmd + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" +) + +var ( + searchCmd = &cobra.Command{ + Use: "search [game]", + Short: "Search for a game", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + games, err := FetchGames() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + results := FilterGames(args[0], games) + for _, g := range results { + fmt.Printf("%s\n", g) + } + }, + } +) + +func init() { + rootCmd.AddCommand(searchCmd) +} diff --git a/games.toml b/games.toml new file mode 100644 index 0000000..53d14d5 --- /dev/null +++ b/games.toml @@ -0,0 +1,3 @@ +[[games]] +name = "flapioca" +repo = "https://github.com/kbrgl/flapioca" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f23470b --- /dev/null +++ b/go.mod @@ -0,0 +1,34 @@ +module github.com/kbrgl/gameover + +go 1.18 + +require ( + github.com/BurntSushi/toml v1.2.0 + github.com/go-git/go-git/v5 v5.4.2 + github.com/kbrgl/fuzzy v0.0.0-20170220072903-a71013a9994d +) + +require ( + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect +) + +require ( + github.com/Microsoft/go-winio v0.4.16 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect + github.com/acomagu/bufpipe v1.0.3 // indirect + github.com/emirpasic/gods v1.12.0 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/sergi/go-diff v1.1.0 // indirect + github.com/spf13/cobra v1.5.0 + github.com/xanzy/ssh-agent v0.3.0 // indirect + golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect + golang.org/x/net v0.0.0-20210326060303-6b1517762897 // indirect + golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..3d9907f --- /dev/null +++ b/go.sum @@ -0,0 +1,114 @@ +github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= +github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/kbrgl/fuzzy v0.0.0-20170220072903-a71013a9994d h1:v8JKBsRM1IyUxaNNjJmgBqssd5MlAUloiLYwxBiMigE= +github.com/kbrgl/fuzzy v0.0.0-20170220072903-a71013a9994d/go.mod h1:VSBeFN9Mhv+mJAuGOsubXQWc3bl0cjhqXlPKeCWJPvg= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210326060303-6b1517762897 h1:KrsHThm5nFk34YtATK1LsThyGhGbGe1olrte/HInHvs= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79 h1:RX8C8PRZc2hTIod4ds8ij+/4RQX3AqhYj3uOHmyaz4E= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c17d76aef2f5a366b015eae5212575c2111b656a GIT binary patch literal 54319 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 z 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�|3Y|+m_`X1_OrBb6_iqq1nS&)_O8@OOS0N=w%qan>Y63| zuck>bn?Wfj(AuqD0w|QO@p0#`)P340d);c{1 zHD!Ki3z*S42wbO+lud{ay!JWP{v_nAvWUygxSE0d=0>O21&TLc8dXSoQx6Li7A2+k zVuLwmYxxb=8NwgBUmO=8KCM+Bu55$UA4SRc4c+sDb%8qgDSu%{>>5ny8ZYhEiJ&c% ze>K7N+*$lffuCybdtx1Qumy7}wGcdZ1zS$ne>RR8FCN$2GQ+}efaFtS>Z zFuw49uwA=Kh~8#q-_{_+6g+R0V&J++w3W9+JT!pPh!38Jg>fEJR6vwzIWw*0x|E_eKXHVpt#Ibs2cHAY49mzT)UhfA#E_IkZsl z)qwHi09=6|s^3xnTriO2=|2r|PFKJ061u!I)4$#jN@DImN zg^wOqS`vs@xIzAbfq~-%FgK|&YAA50ot- zxo`;hA6s9&o^BHIF1?-=z}wB!olp6>(g9u7dpF48f;XHUnH~G8`ckv_;=&CJF?bo~ zclh$Tt$o_3%|~9DF?7wjZqdB>2WO{F#4}ND_N#FV`Mg|at=T^gzOKV~=6=$-#VOI3 z7rb{8q()|J8jbNdC^rllI@w4wD3oos&=StW7|2Lx=6sGg<5pLi5bm*7|M4!-=3~_I zD-B;jzdn4emW>6->&C5yCGpt)b|oJ2!{nVVhPiWsHe;KO_) zqxb6+t=sR-0OeUXGOi28pVosqWR_+RA5Ch;H|Tv{5Nvh(7ld}xJE+y!4{&aOU+s*` zm{i31)c_W~#eIK&m?}JKAyEkEQr!7ciGk@UBsL36c@Kp}u?8aFYx#=Kli=`~-bBq% zpmoRf;mH0Xu8KtWf|>KX=*}|KfK1)PuK3zCF@D&OZ5H40602Ze)AfNzql@r?euBN8 zhVj4F6Rw8`(!FO-bqIOQnI=G~r9bPR8Yc4h);6$=4JmwgPl&Tu<5CWJ%3tolACZYEdlToPY|WAHm_3|5Jx?bTmu3^TRz9A zcP4bcak`N~-==qJP-mV7{H+ko`3j#E>w@A?zb|*-)oJnKv9U44Jvn@s zA9``iHANk5H*2H8S=_R(KNPD_%OkuG$ZO-!MGkKL>qy8NUW~6OZR5zC&+ABqoL3Z9 z&kC?sD;|*O5CU@P?hY1)_z{;q-j>;UxcGL%e5dZ|Y^y>pmN$$Dqx!9abUV#VRM3#5O~fXZ?eBP^M1qc`!;?!Ku0y+ zzNCGz5fXd?GnSFU<1%!|W1qnCWi~fwU=nPKYxW^fN?Y`Z*u}iONC*I&H znz?QEY>|06`g(aUCei)4mFZ#d(YnYJ;8w@_@gUbSh@TI|u561npBE^p5&Y>*f?v*Ac4-EN!i=mGDgGo~MPE^fogyUA$q4&7n1`wu~f2 zkuExBicB6+ZT8RZyzre+A2b_*+17vkH##V<^5Sx7LbWjLwt_ES?^@VlzutpMr_Yn& z683#*2RUo0#GptI?>e_U_2b!n4ByG&H}4*w5#B}xpFDodD0C#tSIaQRn6+;n-R8bW z+ZExqzqY1}q%m*b4&cANfZuRgZ#omFnt&5(qFbb5#48Ei0 zFQnAqE{<~PMRN^()`MzQ_B*rmqJnvGs;#@Cwfv*UQ`Nk#oeq{vh^sr^9^r5EH5z$U zEBVIL)a}hyg3b!F&9q`mxo$I$A@sS}b()8om;qX%^jzE%Q(Ztmp8#&1qM8(95|SC= zI-l*~ngVjJ-_w4bt3oKjGnkdoa=}zWERX?6fCs=oM@BEoUn4SAoVJ+Gx=+OSxQwP{ z|ITYYr4`zCwWX?>W_*rN|D!`6ViAhgvB!Dj`^GCMk^A14C?b0}E|zQ!2nr!nlcP?>8&n>g z7psSGhQgL1%kv%AK3YCF>pXHV&_1bXcFNBD}^0cg^qV$M^G!J3_2Qw*J{iWU(Ec<++Cw7M>~+^d`w)AJd(@gK1k4#KcE zR_iz2G_fT{rmXK$^Vl4;%Po65yf5;*d{Nn*Xn5zgdUHOQxU(Uvu&ep~o}U0by1W4q z%^Wet29LdkB}+TC7g7a$&>GWNDyNu<{;eF9PkbwsD%i8Lh)RNgPbAQKsfC83)d=~C zGn_+~Sw!CoRe+Luf;K0A1K0xGWs=aYC}R0PkFv9ZRb8RlxtYPTu!xL7&4Sm>?-F4|VYlt{wRtj9rb5JMk{GEP0G5F!1v>6QlRW28qjhD8vN?(S}o&Sl@_|9ii{ z>^?JhX6`-roHK=B%KR{1l9rG7cB56Q>orln9F%&aEQ;PHjy8eJ;cQ?eD@sgJM zl@5)~;i8$5*nh}T_w;P^M1s@r42=y)5$!2Ar1vi0zg+}+dJbY@UVJG&-46iO2M9*u zduHsn&GL)?Y*}qxd@H`w8whAiC#JP9O?Fy28qKW__iR+Pt+6TR&lB|4Gse}|HxMH{g!4~QBGyuFeGsS zS2+&8G{gZ}{s!e%b?`AGDrqX_qJt}qKlr+r_bA_}i~qTW790Q;)*27) z5xxp2KXw#1{gRT=uf68OTtzHO&w>C|zFmLYZ%U%+>eJ+W#xo~MXqC#o)%aeA{j7W> z{m^!ImvVnqChym`Y@g~upFv+&JpbkndyHBowzb;GO<+qm|#dzkkcI*UQfBN>u%pke#@E4ygv|>ij)+EyFMv@)AF}{~l`B zW7{|fwp%p4GYurlGM2~_d_FL;jg|U(t8Epo4t=^jZH+Ia>WEb3BmW851IN%IrZUiI zHk&0F7chK3zFV`JGa)7v*YN>_ncy6+pR|q9$&&&Pv27EC*xr|=QE`oIRvjiYptJf`; z`aD3J(d;F~Cx2shPzfXThh6f7(9(>v`FD=(;kK(zL>kLnP55X@U=!@O4QAv7A4{3u zB1bl}AVp6F&>}~3YH=XIM;-|1opF4x2YmWEv4L}olUnPsnZpcYEE?GlCQr*0Bt(kS z>HD_+Sc0yIf95+INwOq;ZT5tu)$K(W9?~D2vtT{`l#31_v2K%g0sJDM5$9m{SNuaj z*otc8`f{Zp_jzIM{(McE3pz*AYzI1m#l8k`H zoqWgW=?S~psLGKj_Lw-Dq=%QZ4AbGF#Of4^FCiUO|w8&qO zd@)j`Wl_+pHrW+n6^fo14Z#*heoZ|?$jayLzIoxA0AfjVH^UGgW;LHfvB$MQ<#serv|g!J z%R(Yg94?QaR{Xbsyq|e6IsUSnw#F0>03)kXfWwlwFCq*4x&$cg87ggT5q-c2@&(- z#3Yh^jQbHh@1kqH+#9xP7$|N_#>Y(JfZ1|Y=hf|>L}eYvNk-wnPh&gr_r3RabK)Z$ zN+Nb@xtJTjq3nsul{%E-1OI{7PA85X3e?=EuGR4Kdx{(sthnga3Cfjn?5z!&#c{=i zv9_D!V$yyOTYS9ek#}ZG?NDr_PxhS@SV$FjH>#~+yGaO}8)_w*qtajfM-O^3oicsi zl*m9hZjnvVdY1iW zb+ndfJH&p92Uz3ae3^W6#I$NN&AS+md;K*}I{Uj63-9=zFPYl(#jwTzeZ(#I0#=E~yH#vUt9Fi+NJJK731X-Pn^+P(AFOE9FBSc&u>1 z6!@>?FbO)E^M1b~?+OPR@X*|u__9#`@q^2g&v|~%0~44gM3SAe<+tAFuEptF187rZ zZKJaK&oH=ho$uuc&fErp#p-LfxKCICtK;67KGd{NI|-M1oI-4Hj&uOi=ACW_CMRUS$}5gfR1qQ_p(frJbu>j$^{MhOkq9M z7*1`{=cQ9`YRAlC-Ejqc4QuS^b;i8hmv?1`1frqXjUQJOVdgo2xtja2g~4fm@#p0`gb%9u3{$`+P?25K;YAv{ql_?&dS^HB zo)_7*(GoENkz6gc_bt~z4N2-RDJle+ONN2BkU0%U|8j8pXS*r)&TaOwrsIzMYUJ8 zjk3fjUROdoF=?fAJ#V}1^66B6uY>RoG~}Q_o*(=W`f&>%^}vXoq%|ihQN?smLpSe3 zvZfmrjW=LPLbF(=bnw4;GJEv0IKpUvs6t!5GNeAQWzPX>mS&azphv#J>2=0O{;YBQ z0KdA}JHNPmlFw5W0DS|#4)lG7)EQlfQKxTHrb9U=@i*vW&Jy_WGe8fVFQxLgA>JVS%0A;le_i)T2`Hlq2|}`XQ^S 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 QIN0N+r7if4#qaR{0?q9rjsO4v literal 0 HcmV?d00001 diff --git a/main.go b/main.go new file mode 100644 index 0000000..d10d54b --- /dev/null +++ b/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/kbrgl/gameover/cmd" + +func main() { + cmd.Execute() +} diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..f7b60bd --- /dev/null +++ b/server/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello, world!") +}