Found 23 repositories(showing 23)
BabyJ723
# Awesome Keycloak [](https://github.com/sindresorhus/awesome) # [<img src="https://www.keycloak.org/resources/images/keycloak_logo_480x108.png">](https://github.com/thomasdarimont/awesome-keycloak) > Carefully curated list of awesome Keycloak resources. A curated list of resources for learning about the Open Source Identity and Access Management solution Keycloak. Contains books, websites, blog posts, links to github Repositories. # Contributing Contributions welcome. Add links through pull requests or create an issue to start a discussion. [Please refer to the contributing guide for details](CONTRIBUTING.md). # Contents * [General](#general) * [Documentation](#docs) * [Keycloak Website](http://www.keycloak.org) * [Current Documentation](http://www.keycloak.org/documentation.html) * [Archived Documentation](http://www.keycloak.org/documentation-archive.html) * [Mailing Lists](#mailing-lists) * [User Mailing List](#user-mailing-list) * [Developer Mailing List](#dev-mailing-list) * [Mailing List Search](#mailing-list-search) * [Books](#books) * [Articles](#articles) * [Talks](#talks) * [Presentations](#presentations) * [Video Playlists](#video-playlists) * [Community Extensions](#community-extensions) * [Integrations](#integrations) * [Themes](#themes) * [Docker](#docker) * [Deployment Examples](#deployment-examples) * [Example Projects](#example-projects) * [Benchmarks](#benchmarks) * [Help](#help) * [Commercial Offerings](#commercial-offerings) * [Miscellaneous](#miscellaneous) # General ## Documentation * [Keycloak Website](http://www.keycloak.org/) * [Current Documentation](http://www.keycloak.org/documentation.html) * [Archived Documentation](http://www.keycloak.org/documentation-archive.html) * [Product Documentation for Red Hat Single Sign-On](https://access.redhat.com/documentation/en/red-hat-single-sign-on/) ## Discussion Groups and Mailing Lists * [Keycloak Users Google Group](https://groups.google.com/forum/#!forum/keycloak-user) * [Keycloak Developers Google Group](https://groups.google.com/forum/#!forum/keycloak-dev) * [Keycloak Discourse Group](https://keycloak.discourse.group/) * [Keycloak Developer Chat](https://keycloak.zulipchat.com) * [Inactive - User Mailing List](https://lists.jboss.org/mailman/listinfo/keycloak-user) * [Inactive - Developer Mailing List](https://lists.jboss.org/mailman/listinfo/keycloak-dev) * [Mailing List Search](http://www.keycloak.org/search) * [Keycloak Subreddit](https://www.reddit.com/r/keycloak) ## Books * [Keycloak - Identity and Access Management for Modern Applications](https://www.packtpub.com/product/keycloak-identity-and-access-management-for-modern-applications/9781800562493) ## Articles * [How to get Keycloak working with Docker](https://www.ivonet.nl/2015/05/23/Keycloak-Docker/) * [Single-Sign-On for Microservices and/or Java EE applications with Keycloak SSO](http://www.n-k.de/2016/06/keycloak-sso-for-microservices.html) * [Keycloak Admin Client(s) - multiple ways to manage your SSO system](http://www.n-k.de/2016/08/keycloak-admin-client.html) * [How to get the AccessToken of Keycloak in Spring Boot and/or Java EE](http://www.n-k.de/2016/05/how-to-get-accesstoken-from-keycloak-springboot-javaee.html) * [JWT authentication with Vert.x, Keycloak and Angular 2](http://paulbakker.io/java/jwt-keycloak-angular2/) * [Authenticating via Kerberos with Keycloak and Windows 2008 Active Directory](http://matthewcasperson.blogspot.de/2015/07/authenticating-via-kerberos-with.html) * [Deploying Keycloak with Ansible](https://adam.younglogic.com/2016/01/deploying-keycloak-via-ansible/) * [Easily secure your Spring Boot applications with Keycloak](https://developers.redhat.com/blog/2017/05/25/easily-secure-your-spring-boot-applications-with-keycloak/) * [How Red Hat re-designed its Single Sign On (SSO) architecture, and why](https://developers.redhat.com/blog/2016/10/04/how-red-hat-re-designed-its-single-sign-on-sso-architecture-and-why/) * [OAuth2, JWT, Open-ID Connect and other confusing things](http://giallone.blogspot.de/2017/06/oath2.html) * [X509 Authentication with Keycloak and JBoss Fuse](https://sjhiggs.github.io/fuse/sso/x509/smartcard/2017/03/29/fuse-hawtio-keycloak.html) * [Running Keycloak on OpenShift 3](https://medium.com/@sbose78/running-keycloak-on-openshift-3-8d195c0daaf6) * [Introducing Keycloak for Identity and Access Management](https://www.thomasvitale.com/introducing-keycloak-identity-access-management/) * [Keycloak Basic Configuration for Authentication and Authorisation](https://www.thomasvitale.com/keycloak-configuration-authentication-authorisation/) * [Keycloak on OpenShift Origin](https://medium.com/@james_devcomb/keycloak-on-openshift-origin-ee81d01dac97) * [Identity Management, One-Time-Passwords and Two-Factor-Auth with Spring Boot and Keycloak](http://www.hascode.com/2017/11/identity-management-one-time-passwords-and-two-factor-auth-with-spring-boot-and-keycloak/) * [Keycloak Identity Brokering with Openshift](https://developers.redhat.com/blog/2017/12/06/keycloak-identity-brokering-openshift/) * [OpenID Connect Identity Brokering with Red Hat Single Sign-On](https://developers.redhat.com/blog/2017/10/18/openid-connect-identity-brokering-red-hat-single-sign/) * [Authentication & user management is hard](https://eclipsesource.com/blogs/2018/01/11/authenticating-reverse-proxy-with-keycloak/) * [Securing Nginx with Keycloak](https://edhull.co.uk/blog/2018-06-06/keycloak-nginx) * [Secure kibana dashboards using keycloak](https://aboullaite.me/secure-kibana-keycloak/) * [Configuring NGINX for OAuth/OpenID Connect SSO with Keycloak/Red Hat SSO](https://developers.redhat.com/blog/2018/10/08/configuring-nginx-keycloak-oauth-oidc/) * [Keycloak Clustering Setup and Configuration Examples](https://github.com/fit2anything/keycloak-cluster-setup-and-configuration) * [MicroProfile JWT with Keycloak](https://kodnito.com/posts/microprofile-jwt-with-keycloak/) * [Keycloak Essentials](https://medium.com/keycloak/keycloak-essentials-86254b2f1872) * [SSO-session failover with Keycloak and AWS S3](https://medium.com/@georgijsr/sso-session-failover-with-keycloak-and-aws-s3-e0b1db985e12) * [KTOR and Keycloak: authentication with OpenId](https://medium.com/slickteam/ktor-and-keycloak-authentication-with-openid-ecd415d7a62e) * [Keycloak: Core concepts of open source identity and access management](https://developers.redhat.com/blog/2019/12/11/keycloak-core-concepts-of-open-source-identity-and-access-management) * [Who am I? Keycloak Impersonation API](https://blog.softwaremill.com/who-am-i-keycloak-impersonation-api-bfe7acaf051a) * [Setup Keycloak Server on Ubuntu 18.04](https://medium.com/@hasnat.saeed/setup-keycloak-server-on-ubuntu-18-04-ed8c7c79a2d9) * [Getting started with Keycloak](https://robferguson.org/blog/2019/12/24/getting-started-with-keycloak/) * [Angular, OpenID Connect and Keycloak](https://robferguson.org/blog/2019/12/29/angular-openid-connect-keycloak/) * [Angular, OAuth 2.0 Scopes and Keycloak](https://robferguson.org/blog/2019/12/31/angular-oauth2-keycloak/) * [Keycloak, Flowable and OpenLDAP](https://robferguson.org/blog/2020/01/03/keycloak-flowable-and-openldap/) * [How to exchange token from an external provider to a keycloak token](https://www.mathieupassenaud.fr/token-exchange-keycloak/) * [Building an Event Listener SPI (Plugin) for Keycloak](https://dev.to/adwaitthattey/building-an-event-listener-spi-plugin-for-keycloak-2044) * [Keycloak user migration – connect your legacy authentication system to Keycloak](https://codesoapbox.dev/keycloak-user-migration/) * [Keycloak Authentication and Authorization in GraphQL](https://medium.com/@darahayes/keycloak-authentication-and-authorization-in-graphql-ad0a1685f7da) * [Kong / Konga / Keycloak: securing API through OIDC](https://github.com/d4rkstar/kong-konga-keycloak) * [KeyCloak: Custom Login theme](https://codehumsafar.wordpress.com/2018/09/11/keycloak-custom-login-theme/) * [Keycloak: Use background color instead of background image in Custom Login theme](https://codehumsafar.wordpress.com/2018/09/21/keycloak-use-background-color-instead-of-background-image-in-custom-login-theme/) * [How to turn off the Keycloak theme cache](https://keycloakthemes.com/blog/how-to-turn-off-the-keycloak-theme-cache) * [How to add a custom field to the Keycloak registration page](https://keycloakthemes.com/blog/how-to-add-custom-field-keycloak-registration-page) * [How to setup Sign in with Google using Keycloak](https://keycloakthemes.com/blog/how-to-setup-sign-in-with-google-using-keycloak) * [How to sign in users on Keycloak using Github](https://keycloakthemes.com/blog/how-to-sign-in-users-on-keycloak-using-github) * [Extending Keycloak SSO Capabilities with IBM Security Verify](https://community.ibm.com/community/user/security/blogs/jason-choi1/2020/06/10/extending-keycloak-sso-capabilities-with-ibm-secur) * [AWS SAML based User Federation using Keycloak](https://medium.com/@karanbir.tech/aws-connect-saml-based-identity-provider-using-keycloak-9b3e6d0111e6) * [AWS user account OpenID federation using Keycloak](https://medium.com/@karanbir.tech/aws-account-openid-federation-using-keycloak-40d22b952a43) * [How to Run Keycloak in HA on Kubernetes](https://blog.sighup.io/keycloak-ha-on-kubernetes/) * [How to create a Keycloak authenticator as a microservice?](https://medium.com/application-security/how-to-create-a-keycloak-authenticator-as-a-microservice-ad332e287b58) * [keycloak.ch | Installing & Running Keycloak](https://keycloak.ch/keycloak-tutorials/tutorial-1-installing-and-running-keycloak/) * [keycloak.ch | Configuring Token Exchange using the CLI](https://keycloak.ch/keycloak-tutorials/tutorial-token-exchange/) * [keycloak.ch | Configuring WebAuthn](https://keycloak.ch/keycloak-tutorials/tutorial-webauthn/) * [keycloak.ch | Configuring a SwissID integration](https://keycloak.ch/keycloak-tutorials/tutorial-swissid/) * [Getting Started with Service Accounts in Keycloak](https://medium.com/@mihirrajdixit/getting-started-with-service-accounts-in-keycloak-c8f6798a0675) * [Building cloud native apps: Identity and Access Management](https://dev.to/lukaszbudnik/building-cloud-native-apps-identity-and-access-management-1e5m) * [X.509 user certificate authentication with Red Hat’s single sign-on technology](https://developers.redhat.com/blog/2021/02/19/x-509-user-certificate-authentication-with-red-hats-single-sign-on-technology) * [Grafana OAuth with Keycloak and how to validate a JWT token](https://janikvonrotz.ch/2020/08/27/grafana-oauth-with-keycloak-and-how-to-validate-a-jwt-token/) * [How to setup a Keycloak server with external MySQL database on AWS ECS Fargate in clustered mode](https://jbjerksetmyr.medium.com/how-to-setup-a-keycloak-server-with-external-mysql-database-on-aws-ecs-fargate-in-clustered-mode-9775d01cd317) * [Extending Keycloak: adding API key authentication](http://www.zakariaamine.com/2019-06-14/extending-keycloak) * [Extending Keycloak: using a custom email sender](http://www.zakariaamine.com/2019-07-14/extending-keycloak2) * [Integrating Keycloak and OPA with Confluent](https://goraft.tech/2021/03/17/integrating-keycloak-and-opa-with-confluent.html) * [UMA 2.0 : User Managed Access - how to use it with bash](https://blog.please-open.it/uma/) ## Talks * [JDD2015 - Keycloak Open Source Identity and Access Management Solution](https://www.youtube.com/watch?v=TuEkj25lbd0) * [2015 Using Tomcat and Keycloak in an iFrame](https://www.youtube.com/watch?v=nF_lw7uIxao) * [2016 You've Got Microservices Now Secure Them](https://www.youtube.com/watch?v=SfVhqf-rMQY) * [2016 Keycloak: Open Source Single Sign On - Sebastian Rose - AOE conf (german)](https://www.youtube.com/watch?v=wbKw0Bwyne4) * [2016 Sécuriser ses applications back et front facilement avec Keycloak (french)](https://www.youtube.com/watch?v=bVidgluUcg0) * [2016 Keycloak and Red Hat Mobile Application Platform](https://www.youtube.com/watch?v=4NBgiHM5aOA) * [2016 Easily secure your Front and back applications with KeyCloak](https://www.youtube.com/watch?v=RGp4HUKikts) * [2017 Easily secure your Spring Boot applications with Keycloak - Part 1](https://developers.redhat.com/video/youtube/vpgRTPFDHAw/) * [2017 Easily secure your Spring Boot applications with Keycloak - Part 2](https://developers.redhat.com/video/youtube/O5ePCWON08Y/) * [2018 How to secure your Spring Apps with Keycloak by Thomas Darimont @ Spring I/O 2018](https://www.youtube.com/watch?v=haHFoeWUj0w) * [2018 DevNation Live | A Deep Dive into Keycloak](https://www.youtube.com/watch?v=ZxpY_zZ52kU) * [2018 IDM Europe: WSO2 Identity Server vs. Keycloak (Dmitry Kann)](https://www.youtube.com/watch?v=hnjBiGsEDoU) * [2018 JPrime|Building an effective identity and access management architecture with Keycloak (Sebastien Blanc)](https://www.youtube.com/watch?v=bMqcGkCvUVQ) * [2018 WJAX| Sichere Spring-Anwendungen mit Keycloak](https://www.youtube.com/watch?v=6Z490EMcafs) * [2019 Spring I/O | Secure your Spring Apps with Keycloak](https://www.youtube.com/watch?v=KrOd5wIkqls) * [2019 DevoxxFR | Maitriser sa gestion de l'identité avec Keycloak (L. Benoit, T. Recloux, S. Blanc)](https://www.youtube.com/watch?v=0cziL__0-K8) * [2019 DevConf | Fine - Grained Authorization with Keycloak SSO (Marek Posolda)](https://www.youtube.com/watch?v=yosg4St0iUw) * [2019 VoxxedDays Minsk | Bilding an effective identity and access management architecture with Keycloak (Sebastien Blanc)](https://www.youtube.com/watch?v=RupQWmYhrLA) * [2019 Single-Sign-On Authentifizierung mit dem Keycloak Identity Provider | jambit CoffeeTalk](https://www.youtube.com/watch?v=dnY6ORaFNY8) * [2020 Keycloak Team | Keycloak Pitch](https://www.youtube.com/watch?v=GZTN_VXjoQw) * [2020 Keycloak Team | Keycloak Overview](https://www.youtube.com/watch?v=duawSV69LDI) * [2020 Please-open.it : oauth2 dans le monde des ops (french)](https://www.youtube.com/watch?v=S-9X50QajmY) ## Presentations * [Keycloak 101](https://stevenolen.github.io/kc101-talk/#1) ## Video Playlists * [Keycloak Identity and Access Management by Łukasz Budnik](https://www.youtube.com/playlist?list=PLPZal7ksxNs0mgScrJxrggEayV-TPZ9sA) * [Keycloak by Niko Köbler](https://www.youtube.com/playlist?list=PLNn3plN7ZiaowUvKzKiJjYfWpp86u98iY) * [Keycloak Playlist by hexaDefence](https://youtu.be/35bflT_zxXA) * [Keycloak Tutorial Series by CodeLens](https://www.youtube.com/watch?v=Lr9WeIMtFow&list=PLeGNmkzI56BTjRxNGxUhh4k30FD_gy0pC) ## Clients * [Official Keycloak Node.js Admin Client](https://github.com/keycloak/keycloak-admin-client/) ("Extremely Experimental") * [Keycloak Node.js TypeScript Admin Client by Canner](https://github.com/Canner/keycloak-admin/) * [Keycloak Go Client by Cloudtrust](https://github.com/cloudtrust/keycloak-client) * [Keycloak Nest.js Admin Client by Relevant Fruit](https://github.com/relevantfruit/nestjs-keycloak-admin) ## Community Extensions * [Keycloak Extensions List](https://www.keycloak.org/extensions.html) * [Keycloak Benchmark Project](https://github.com/keycloak/keycloak-benchmark) * [Keycloak: Link IdP Login with User Provider](https://github.com/ohioit/keycloak-link-idp-with-user) * [Client Owner Manager: Control who can edit a client](https://github.com/cyclone-project/cyclone-client-registration) * [Keyloak Proxy written in Go](https://github.com/gambol99/keycloak-proxy) * [Script based ProtocolMapper extension for SAML](https://github.com/cloudtrust/keycloak-client-mappers) * [Realm export REST resource by Cloudtrust](https://github.com/cloudtrust/keycloak-export) * [Keycloak JDBC Ping Setup by moremagic](https://github.com/moremagic/keycloak-jdbc-ping) * [SMS 2 Factor Authentication for Keycloak via AWS SNS](https://github.com/nickpack/keycloak-sms-authenticator-sns) * [SMS 2 Factor Authentiation for Keycloak via SMS by Alliander](https://github.com/Alliander/keycloak-sms-authenticator) * [Identity Provider for vk.com](https://github.com/mrk08/keycloak-vk) * [CAS Protocol Support](https://github.com/Doccrazy/keycloak-protocol-cas) * [WS-FED Support](https://github.com/cloudtrust/keycloak-wsfed) * [Keycloak Discord Support](https://github.com/wadahiro/keycloak-discord) * [Keycloak Login with User Attribute](https://github.com/cnieg/keycloak-login-attribute) * [zonaut/keycloak-extensions](https://github.com/zonaut/keycloak-extensions) * [leroyguillaume/keycloak-bcrypt](https://github.com/leroyguillaume/keycloak-bcrypt) * [SPI Authenticator in Nodejs](https://www.npmjs.com/package/keycloak-rest-authenticator) * [Have I Been Pwned? Keycloak Password Policy](https://github.com/alexashley/keycloak-password-policy-have-i-been-pwned) * [Keycloak Eventlistener for Google Cloud Pub Sub](https://github.com/acesso-io/keycloak-event-listener-gcpubsub) * [Enforcing Password policy based on attributes of User Groups](https://github.com/sayedcsekuet/keycloak-user-group-based-password-policy) * [Verify Email with Link or Code by hokumski](https://github.com/hokumski/keycloak-verifyemailwithcode) * [Role-based Docker registry authentication](https://github.com/lifs-tools/keycloak-docker-role-mapper) * [SCIM for keycloak](https://github.com/Captain-P-Goldfish/scim-for-keycloak) * [Keycloak Kafka Module](https://github.com/SnuK87/keycloak-kafka) ## Integrations * [Official Keycloak Node.js Connect Adapter](https://github.com/keycloak/keycloak-nodejs-connect) * [Keycloak support for Aurelia](https://github.com/waynepennington/aurelia-keycloak) * [Keycloak OAuth2 Auth for PHP](https://github.com/stevenmaguire/oauth2-keycloak) * [Jenkins Keycloak Authentication Plugin](https://github.com/jenkinsci/keycloak-plugin) * [Meteor Keycloak Accounts](https://github.com/mxab/meteor-keycloak) * [HapiJS Keycloak Auth](https://github.com/felixheck/hapi-auth-keycloak) * [zmartzone mod_auth_openidc for Apache 2.x](https://github.com/zmartzone/mod_auth_openidc) * [Duo Security MFA Authentication for Keycloak](https://github.com/mulesoft-labs/keycloak-duo-spi) * [Extension Keycloak facilitant l'utilisation de FranceConnect](https://github.com/InseeFr/Keycloak-FranceConnect) * [Ambassador Keycloak Support](https://www.getambassador.io/reference/idp-support/keycloak/) * [Keycloak Python Client](https://github.com/akhilputhiry/keycloak-client) * [Keycloak Terraform Provider](https://github.com/mrparkers/terraform-provider-keycloak) * [Keycloak ADFS OpenID Connect](https://www.michaelboeynaems.com/keycloak-ADFS-OIDC.html) * [React/NextJS Keycloak Bindings](https://github.com/panz3r/react-keycloak) * [Keycloak Open-Shift integration](https://github.com/keycloak/openshift-integration) * [Keycloak, Kong and Konga setup scripts (local development)](https://github.com/JaouherK/Kong-konga-Keycloak) * [SSO for Keycloak and Nextcloud with SAML](https://stackoverflow.com/questions/48400812/sso-with-saml-keycloak-and-nextcloud) * [Keycloak Connect GraphQL Adapter for Node.js](https://github.com/aerogear/keycloak-connect-graphql) * [python-keycloak](https://github.com/marcospereirampj/python-keycloak) * [Keycloak and PrivacyId3a docker-compose (local development)](https://github.com/JaouherK/keycloak-privacyIdea) * [Nerzal/gocloak Golang Keycloak API Package](https://github.com/Nerzal/gocloak) * [Apple Social Identity Provider for Keycloak](https://github.com/BenjaminFavre/keycloak-apple-social-identity-provider) ## Quick demo Videos * [Keycloak with istio envoy jwt-auth proxy](https://www.youtube.com/watch?v=wscX7JMfuBI) ## Themes * [Community Keycloak Ionic Theme](https://github.com/lfryc/keycloak-ionic-theme) * [A Keycloak theme based on the AdminLTE UI library](https://github.com/MAXIMUS-DeltaWare/adminlte-keycloak-theme) * [GOV.UK Theme](https://github.com/UKHomeOffice/keycloak-theme-govuk) * [Carbon Design](https://github.com/httpsOmkar/carbon-keycloak-theme) * [Modern](https://keycloakthemes.com/themes/modern) * [Adminlte](https://git.uptic.nl/uptic-public-projects/uptic-keyclock-theme-adminlte) * [keycloakify: Create Keycloak themes using React](https://github.com/InseeFrLab/keycloakify) ## Docker * [Official Keycloak Docker Images](https://github.com/jboss-dockerfiles/keycloak) * [Keycloak Examples as Docker Image](https://hub.docker.com/r/jboss/keycloak-examples) * [Keycloak Maven SDK for managing the entire lifecycle of your extensions with Docker](https://github.com/OpenPj/keycloak-docker-quickstart) ## Kubernetes * [Deprecated Keycloak Helm Chart](https://github.com/codecentric/helm-charts/tree/master/charts/keycloak) * [codecentric Keycloak Helm Chart](https://github.com/codecentric/helm-charts/tree/master/charts/keycloak) * [Import / Export Keycloak Config](https://gist.github.com/unguiculus/19618ef57b1863145262191944565c9d) * [keycloak-operator](https://github.com/keycloak/keycloak-operator) ## Tools * [keycloakmigration: Manage your Keycloak configuration with code](https://github.com/klg71/keycloakmigration) * [tool to autogenerate an OpenAPI Specification for Keycloak's Admin API](https://github.com/ccouzens/keycloak-openapi) * [oidc-bash-client](https://github.com/please-openit/oidc-bash-client) * [louketo-proxy (FKA Gatekeeper)](https://github.com/louketo/louketo-proxy) * [keycloak-config-cli: Configuration as Code for Keycloak](https://github.com/adorsys/keycloak-config-cli) * [Keycloak Pulumi](https://github.com/pulumi/pulumi-keycloak) * [Keycloak on AWS](https://github.com/aws-samples/keycloak-on-aws) * [aws-cdk construct library that allows you to create KeyCloak on AWS in TypeScript or Python](https://github.com/aws-samples/cdk-keycloak) * [keycloak-scanner Python CLI](https://github.com/NeuronAddict/keycloak-scanner) ## Deployment Examples * [Keycloak deployment with CDK on AWS with Fargate](https://github.com/aws-samples/cdk-keycloak) ## Example Projects * [Examples from Keycloak Book: Keycloak - Identity and Access Management for Modern Applications](https://github.com/PacktPublishing/Keycloak-Identity-and-Access-Management-for-Modern-Applications) * [Official Examples](https://github.com/keycloak/keycloak/tree/master/examples) * [Keycloak Quickstarts](https://github.com/keycloak/keycloak-quickstarts) * [Drupal 7.0 with Keycloak](https://gist.github.com/thomasdarimont/17fa146c4fb5440d7fc2ee6322ec392d) * [Securing Realm Resources With Custom Roles](https://github.com/dteleguin/custom-admin-roles) * [BeerCloak: a comprehensive KeyCloak extension example](https://github.com/dteleguin/beercloak) * [KeyCloak Extensions: Securing Realm Resources With Custom Roles](https://github.com/dteleguin/custom-admin-roles) * [Red Hat Single Sign-On Labs](https://github.com/RedHatWorkshops/red-hat-sso) * [Spring Boot Keycloak Tutorial](https://github.com/sebastienblanc/spring-boot-keycloak-tutorial) * [Custom Keycloak Docker Image of Computer Science House of RIT](https://github.com/ComputerScienceHouse/keycloak-docker) * [Example of custom password hash SPI for Keycloak](https://github.com/pavelbogomolenko/keycloak-custom-password-hash) * [Example for a custom http-client-provider with Proxy support](https://github.com/xiaoyvr/custom-http-client-provider) * [Monitor your keycloak with prometheus](https://github.com/larscheid-schmitzhermes/keycloak-monitoring-prometheus) * [Custom User Storage Provider .ear with jboss-cli setup](https://github.com/thomasdarimont/keycloak-user-storage-provider-demo) * [Keycloak - Experimental extensions by Stian Thorgersen/Keycloak](https://github.com/stianst/keycloak-experimental) * [Securing Spring Boot Admin & Actuator Endpoints with Keycloak](https://github.com/thomasdarimont/spring-boot-admin-keycloak-example) * [A Keycloak Mobile Implementation using Angular v4 and Ionic v3](https://github.com/tomjackman/keyonic-v2) * [Example for Securing Apps with Keycloak on Kubernetes](https://github.com/stianst/demo-kubernetes) * [Example for Securing AspDotNet Core Apps with Keycloak](https://github.com/thomasdarimont/kc-dnc-demo) * [Example for passing custom URL parameters to a Keycloak theme for dynamic branding](https://github.com/dteleguin/keycloak-dynamic-branding) * [Angular Webapp secured with Keycloak](https://github.com/CodepediaOrg/bookmarks.dev) * [Keycloak Theme Development Kit](https://github.com/anthonny/kit-keycloak-theme) * [Keycloak Clustering examples](https://github.com/ivangfr/keycloak-clustered) * [Keycloak Last Login Date Event Listener](https://github.com/ThoreKr/keycloak-last-login-event-listener) * [Keycloak Project Example (Customizations, Extensions, Configuration)](https://github.com/thomasdarimont/keycloak-project-example) * [Example of adding API Key authentication to Keycloak](https://github.com/zak905/keycloak-api-key-demo) ## Benchmarks * [Gatling based Benchmark by @rvansa](https://github.com/rvansa/keycloak-benchmark) ## Help * [Keycloak on Stackoverflow](https://stackoverflow.com/questions/tagged/keycloak) ## Commercial Offerings * [Red Hat Single Sign-On](https://access.redhat.com/products/red-hat-single-sign-on) * [INTEGSOFT UNIFIED USER CREDENTIALS WITH KEYCLOAK SSO](https://www.integsoft.cz/en/sso.html#what-is-sso) * [JIRA SSO Plugin by codecentric](https://marketplace.atlassian.com/plugins/de.codecentric.atlassian.oidc.jira-oidc-plugin/server/overview) * [Keycloak Competence Center by Inventage AG](https://keycloak.ch/) * [Keycloak as a Service](https://www.cloud-iam.com) ## Miscellaneous * [Find sites using Keycloak with google](https://www.google.de/search?q=inurl%3Aauth+inurl%3Arealms+inurl%3Aprotocol&oq=inurl%3A&client=ubuntu&sourceid=chrome&ie=UTF-8) * [Keycloak Dev Bookmarks](http://bookmarks.dev/search?q=keycloak) - Use the tag [keycloak](https://www.bookmarks.dev/tagged/keycloak) * [Use fail2ban to block brute-force attacks to keycloak server](https://gist.github.com/drmalex07/3eba8b98d0ac4a1e821e8e721b3e1816) * [Pentest-Report Keycloak 8.0 Audit & Pentest 11.2019 by Cure53](https://cure53.de/pentest-report_keycloak.pdf) * [Keycloak - CNCF Security SIG - Self Assesment](https://docs.google.com/document/d/14IIGliP3BWjdS-0wfOk3l_1AU8kyoSiLUzpPImsz4R0/edit#) # License [](https://creativecommons.org/publicdomain/zero/1.0/) To the extent possible under law, [Thomas Darimont](https://github.com/thomasdarimont) has waived all copyright and related or neighboring rights to this work.
TeehanLax
Carrot2 Document Clustering Server implementation for Node.js
ankane
Ruby client for Carrot2 - the open-source document clustering server
gardener
A simple server that exposes the OpenID discovery documents of a Kubernetes cluster.
zmarty
Carrot2 Document Clustering Server (DCS) Docker Image
githubhack
/*The MIT License (MIT) Copyright (c) 2015 Apostolique 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.*/ // ==UserScript== // @name AposBot // @namespace AposBot // @include http://agar.io/* // @version 3.568 // @grant none // @author http://www.twitch.tv/apostolique // ==/UserScript== var aposBotVersion = 3.568; //TODO: Team mode // Detect when people are merging // Split to catch smaller targets // Angle based cluster code // Better wall code // In team mode, make allies be obstacles. Number.prototype.mod = function(n) { return ((this % n) + n) % n; }; Array.prototype.peek = function() { return this[this.length - 1]; }; var sha = "efde0488cc2cc176db48dd23b28a20b90314352b"; function getLatestCommit() { window.jQuery.ajax({ url: "https://api.github.com/repos/apostolique/Agar.io-bot/git/refs/heads/master", cache: false, dataType: "jsonp" }).done(function(data) { console.dir(data["data"]); console.log("hmm: " + data["data"]["object"]["sha"]); sha = data["data"]["object"]["sha"]; function update(prefix, name, url) { window.jQuery(document.body).prepend("<div id='" + prefix + "Dialog' style='position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 100; display: none;'>"); window.jQuery('#' + prefix + 'Dialog').append("<div id='" + prefix + "Message' style='width: 350px; background-color: #FFFFFF; margin: 100px auto; border-radius: 15px; padding: 5px 15px 5px 15px;'>"); window.jQuery('#' + prefix + 'Message').append("<h2>UPDATE TIME!!!</h2>"); window.jQuery('#' + prefix + 'Message').append("<p>Grab the update for: <a id='" + prefix + "Link' href='" + url + "' target=\"_blank\">" + name + "</a></p>"); window.jQuery('#' + prefix + 'Link').on('click', function() { window.jQuery("#" + prefix + "Dialog").hide(); window.jQuery("#" + prefix + "Dialog").remove(); }); window.jQuery("#" + prefix + "Dialog").show(); } $.get('https://raw.githubusercontent.com/Apostolique/Agar.io-bot/master/bot.user.js?' + Math.floor((Math.random() * 1000000) + 1), function(data) { var latestVersion = data.replace(/(\r\n|\n|\r)/gm,""); latestVersion = latestVersion.substring(latestVersion.indexOf("// @version")+11,latestVersion.indexOf("// @grant")); latestVersion = parseFloat(latestVersion + 0.0000); var myVersion = parseFloat(aposBotVersion + 0.0000); if(latestVersion > myVersion) { update("aposBot", "bot.user.js", "https://github.com/Apostolique/Agar.io-bot/blob/" + sha + "/bot.user.js/"); } console.log('Current bot.user.js Version: ' + myVersion + " on Github: " + latestVersion); }); }).fail(function() {}); } getLatestCommit(); console.log("Running Apos Bot!"); var f = window; var g = window.jQuery; var aposBot = aposBot || {}; aposBot.name = "AposBot " + aposBotVersion; aposBot.mainLoop = function() {}; aposBot.utility = {}; var u = aposBot.utility; u.splitDistance = 710; console.log("Apos Bot!"); if (f.botList == null) { f.botList = []; g('#locationUnknown').append(g('<select id="bList" class="form-control" onchange="setBotIndex($(this).val());" />')); g('#locationUnknown').addClass('form-group'); } for (var i = f.botList.length - 1; i >= 0; i--) { if (f.botList[i][0] == "Human") { f.botList.splice(i, 1); } } //Given an angle value that was gotten from valueAndleBased(), //returns a new value that scales it appropriately. u.paraAngleValue = function(angleValue, range) { return (15 / (range[1])) * (angleValue * angleValue) - (range[1] / 6); }; u.valueAngleBased = function(angle, range) { var leftValue = (angle - range[0]).mod(360); var rightValue = (u.rangeToAngle(range) - angle).mod(360); var bestValue = Math.min(leftValue, rightValue); if (bestValue <= range[1]) { return u.paraAngleValue(bestValue, range); } return -1; }; u.computeDistance = function(x1, y1, x2, y2) { var xdis = x1 - x2; // <--- FAKE AmS OF COURSE! var ydis = y1 - y2; var distance = Math.sqrt(xdis * xdis + ydis * ydis); return distance; }; u.computeDistanceFromCircleEdge = function(x1, y1, x2, y2, s2) { var tempD = u.computeDistance(x1, y1, x2, y2); var offsetX = 0; var offsetY = 0; var ratioX = tempD / (x1 - x2); var ratioY = tempD / (y1 - y2); offsetX = x1 - (s2 / ratioX); offsetY = y1 - (s2 / ratioY); u.drawPoint(offsetX, offsetY, 5, ""); return u.computeDistance(x2, y2, offsetX, offsetY); }; u.compareSize = function(player1, player2, ratio) { if (player1.size * player1.size * ratio < player2.size * player2.size) { return true; } return false; }; u.canSplit = function(player1, player2) { return u.compareSize(player1, player2, 2.66) && !u.compareSize(player1, player2, 7); }; u.isItMe = function(player, cell) { if (u.getMode() == ":teams") { var currentColor = player[0].color; var currentRed = currentColor.substring(1,3); var currentGreen = currentColor.substring(3,5); var currentBlue = currentColor.substring(5,7); var currentTeam = u.getTeam(currentRed, currentGreen, currentBlue); var cellColor = cell.color; var cellRed = cellColor.substring(1,3); var cellGreen = cellColor.substring(3,5); var cellBlue = cellColor.substring(5,7); var cellTeam = getTeam(cellRed, cellGreen, cellBlue); if (currentTeam == cellTeam && !cell.isVirus()) { return true; } //console.log("COLOR: " + color); } else { for (var i = 0; i < player.length; i++) { if (cell.id == player[i].id) { return true; } } } return false; }; u.getTeam = function(red, green, blue) { if (red == "ff") { return 0; } else if (green == "ff") { return 1; } return 2; }; u.isFood = function(blob, cell) { if (!cell.isVirus() && u.compareSize(cell, blob, 1.33) || (cell.size <= 11)) { return true; } return false; } ; u.isThreat = function(blob, cell) { if (!cell.isVirus() && u.isFood(cell, blob)) { return true; } return false; /*if (!cell.isVirus() && compareSize(blob, cell, 1.33)) { return true; } return false;*/ }; u.isVirus = function(blob, cell) { if (cell.isVirus() && u.compareSize(cell, blob, 1.30)) { return true; } else if (cell.isVirus() && cell.color.substring(3,5).toLowerCase() != "ff") { return true; } return false; }; u.isSplitTarget = function(blob, cell) { /*if (u.canSplit(cell, blob)) { return true; }*/ return false; }; u.getTimeToRemerge = function(mass){ return ((mass*0.02) + 30); }; u.separateListBasedOnFunction = function(listToUse, blob) { var foodElementList = []; var threatList = []; var virusList = []; var splitTargetList = []; var player = u.getPlayer(); Object.keys(listToUse).forEach(function(element, index) { var isMe = u.isItMe(player, listToUse[element]); if (!isMe) { if (u.isFood(blob, listToUse[element])/* && listToUse[element].isNotMoving()*/) { //IT'S FOOD! foodElementList.push(listToUse[element]); if (u.isSplitTarget(blob, listToUse[element])) { u.drawCircle(listToUse[element].x, listToUse[element].y, listToUse[element].size + 50, 7); u.splitTargetList.push(listToUse[element]); } } else if (u.isThreat(blob, listToUse[element])) { //IT'S DANGER! threatList.push(listToUse[element]); } else if (u.isVirus(blob, listToUse[element])) { //IT'S VIRUS! virusList.push(listToUse[element]); } }/*else if(isMe && (getBlobCount(getPlayer()) > 0)){ //Attempt to make the other cell follow the mother one foodElementList.push(listToUse[element]); }*/ }); foodList = []; for (var i = 0; i < foodElementList.length; i++) { foodList.push([foodElementList[i].x, foodElementList[i].y, foodElementList[i].size]); } return [foodList, threatList, virusList, splitTargetList]; }; u.getAll = function(blob) { var dotList = []; var player = u.getPlayer(); var interNodes = u.getMemoryCells(); dotList = u.separateListBasedOnFunction(interNodes, blob); return dotList; }; u.clusterFood = function(foodList, blobSize) { var clusters = []; var addedCluster = false; //1: x //2: y //3: size or value //4: Angle, not set here. for (var i = 0; i < foodList.length; i++) { for (var j = 0; j < clusters.length; j++) { if (u.computeDistance(foodList[i][0], foodList[i][1], clusters[j][0], clusters[j][1]) < blobSize * 1.5) { clusters[j][0] = (foodList[i][0] + clusters[j][0]) / 2; clusters[j][1] = (foodList[i][1] + clusters[j][1]) / 2; clusters[j][2] += foodList[i][2]; addedCluster = true; break; } } if (!addedCluster) { clusters.push([foodList[i][0], foodList[i][1], foodList[i][2], 0]); } addedCluster = false; } return clusters; }; u.getAngle = function(x1, y1, x2, y2) { //Handle vertical and horizontal lines. if (x1 == x2) { if (y1 < y2) { return 271; //return 89; } else { return 89; } } return (Math.round(Math.atan2(-(y1 - y2), -(x1 - x2)) / Math.PI * 180 + 180)); }; u.slope = function(x1, y1, x2, y2) { var m = (y1 - y2) / (x1 - x2); return m; }; u.slopeFromAngle = function(degree) { if (degree == 270) { degree = 271; } else if (degree == 90) { degree = 91; } return Math.tan((degree - 180) / 180 * Math.PI); }; //Given two points on a line, finds the slope of a perpendicular line crossing it. u.inverseSlope = function(x1, y1, x2, y2) { var m = slope(x1, y1, x2, y2); return (-1) / m; }; //Given a slope and an offset, returns two points on that line. u.pointsOnLine = function(slope, useX, useY, distance) { var b = useY - slope * useX; var r = Math.sqrt(1 + slope * slope); var newX1 = (useX + (distance / r)); var newY1 = (useY + ((distance * slope) / r)); var newX2 = (useX + ((-distance) / r)); var newY2 = (useY + (((-distance) * slope) / r)); return [ [newX1, newY1], [newX2, newY2] ]; }; u.followAngle = function(angle, useX, useY, distance) { var slope = u.slopeFromAngle(angle); var coords = u.pointsOnLine(slope, useX, useY, distance); var side = (angle - 90).mod(360); if (side < 180) { return coords[1]; } else { return coords[0]; } }; //Using a line formed from point a to b, tells if point c is on S side of that line. u.isSideLine = function(a, b, c) { if ((b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]) > 0) { return true; } return false; }; //angle range2 is within angle range2 //an Angle is a point and a distance between an other point [5, 40] u.angleRangeIsWithin = function(range1, range2) { if (range2[0] == (range2[0] + range2[1]).mod(360)) { return true; } //console.log("r1: " + range1[0] + ", " + range1[1] + " ... r2: " + range2[0] + ", " + range2[1]); var distanceFrom0 = (range1[0] - range2[0]).mod(360); var distanceFrom1 = (range1[1] - range2[0]).mod(360); if (distanceFrom0 < range2[1] && distanceFrom1 < range2[1] && distanceFrom0 < distanceFrom1) { return true; } return false; }; u.angleRangeIsWithinInverted = function(range1, range2) { var distanceFrom0 = (range1[0] - range2[0]).mod(360); var distanceFrom1 = (range1[1] - range2[0]).mod(360); if (distanceFrom0 < range2[1] && distanceFrom1 < range2[1] && distanceFrom0 > distanceFrom1) { return true; } return false; }; u.angleIsWithin = function(angle, range) { var diff = (u.rangeToAngle(range) - angle).mod(360); if (diff >= 0 && diff <= range[1]) { return true; } return false; }; u.rangeToAngle = function(range) { return (range[0] + range[1]).mod(360); }; u.anglePair = function(range) { return (range[0] + ", " + u.rangeToAngle(range) + " range: " + range[1]); }; u.computeAngleRanges = function(blob1, blob2) { var mainAngle = u.getAngle(blob1.x, blob1.y, blob2.x, blob2.y); var leftAngle = (mainAngle - 90).mod(360); var rightAngle = (mainAngle + 90).mod(360); var blob1Left = u.followAngle(leftAngle, blob1.x, blob1.y, blob1.size); var blob1Right = u.followAngle(rightAngle, blob1.x, blob1.y, blob1.size); var blob2Left = u.followAngle(rightAngle, blob2.x, blob2.y, blob2.size); var blob2Right = u.followAngle(leftAngle, blob2.x, blob2.y, blob2.size); var blob1AngleLeft = u.getAngle(blob2.x, blob2.y, blob1Left[0], blob1Left[1]); var blob1AngleRight = u.getAngle(blob2.x, blob2.y, blob1Right[0], blob1Right[1]); var blob2AngleLeft = u.getAngle(blob1.x, blob1.y, blob2Left[0], blob2Left[1]); var blob2AngleRight = u.getAngle(blob1.x, blob1.y, blob2Right[0], blob2Right[1]); var blob1Range = (blob1AngleRight - blob1AngleLeft).mod(360); var blob2Range = (blob2AngleRight - blob2AngleLeft).mod(360); var tempLine = u.followAngle(blob2AngleLeft, blob2Left[0], blob2Left[1], 400); //drawLine(blob2Left[0], blob2Left[1], tempLine[0], tempLine[1], 0); if ((blob1Range / blob2Range) > 1) { drawPoint(blob1Left[0], blob1Left[1], 3, ""); drawPoint(blob1Right[0], blob1Right[1], 3, ""); drawPoint(blob1.x, blob1.y, 3, "" + blob1Range + ", " + blob2Range + " R: " + (Math.round((blob1Range / blob2Range) * 1000) / 1000)); } //drawPoint(blob2.x, blob2.y, 3, "" + blob1Range); }; u.debugAngle = function(angle, text) { var player = u.getPlayer(); var line1 = u.followAngle(angle, player[0].x, player[0].y, 300); u.drawLine(player[0].x, player[0].y, line1[0], line1[1], 5); u.drawPoint(line1[0], line1[1], 5, "" + text); }; //TODO: Don't let this function do the radius math. u.getEdgeLinesFromPoint = function(blob1, blob2, radius) { var px = blob1.x; var py = blob1.y; var cx = blob2.x; var cy = blob2.y; //var radius = blob2.size; /*if (blob2.isVirus()) { radius = blob1.size; } else if(canSplit(blob1, blob2)) { radius += splitDistance; } else { radius += blob1.size * 2; }*/ var shouldInvert = false; var tempRadius = u.computeDistance(px, py, cx, cy); if (tempRadius <= radius) { radius = tempRadius - 5; shouldInvert = true; } var dx = cx - px; var dy = cy - py; var dd = Math.sqrt(dx * dx + dy * dy); var a = Math.asin(radius / dd); var b = Math.atan2(dy, dx); var t = b - a; var ta = { x: radius * Math.sin(t), y: radius * -Math.cos(t) }; t = b + a; var tb = { x: radius * -Math.sin(t), y: radius * Math.cos(t) }; var angleLeft = u.getAngle(cx + ta.x, cy + ta.y, px, py); var angleRight = u.getAngle(cx + tb.x, cy + tb.y, px, py); var angleDistance = (angleRight - angleLeft).mod(360); /*if (shouldInvert) { var temp = angleLeft; angleLeft = (angleRight + 180).mod(360); angleRight = (temp + 180).mod(360); angleDistance = (angleRight - angleLeft).mod(360); }*/ return [angleLeft, angleDistance, [cx + tb.x, cy + tb.y], [cx + ta.x, cy + ta.y] ]; }; u.invertAngle = function(range) { var angle1 = u.rangeToAngle(badAngles[i]); var angle2 = (badAngles[i][0] - angle1).mod(360); return [angle1, angle2]; }; u.addWall = function(listToUse, blob) { //var mapSizeX = Math.abs(f.getMapStartX - f.getMapEndX); //var mapSizeY = Math.abs(f.getMapStartY - f.getMapEndY); //var distanceFromWallX = mapSizeX/3; //var distanceFromWallY = mapSizeY/3; var distanceFromWallY = 2000; var distanceFromWallX = 2000; if (blob.x < f.getMapStartX() + distanceFromWallX) { //LEFT //console.log("Left"); listToUse.push([ [90, true], [270, false], u.computeDistance(getMapStartX(), blob.y, blob.x, blob.y) ]); var lineLeft = u.followAngle(90, blob.x, blob.y, 190 + blob.size); var lineRight = u.followAngle(270, blob.x, blob.y, 190 + blob.size); u.drawLine(blob.x, blob.y, lineLeft[0], lineLeft[1], 5); u.drawLine(blob.x, blob.y, lineRight[0], lineRight[1], 5); u.drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob.x, blob.y, 5); } if (blob.y < getMapStartY() + distanceFromWallY) { //TOP //console.log("TOP"); listToUse.push([ [180, true], [0, false], u.computeDistance(blob.x, getMapStartY, blob.x, blob.y) ]); var lineLeft = u.followAngle(180, blob.x, blob.y, 190 + blob.size); var lineRight = u.followAngle(360, blob.x, blob.y, 190 + blob.size); u.drawLine(blob.x, blob.y, lineLeft[0], lineLeft[1], 5); u.drawLine(blob.x, blob.y, lineRight[0], lineRight[1], 5); u.drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob.x, blob.y, 5); } if (blob.x > getMapEndX() - distanceFromWallX) { //RIGHT //console.log("RIGHT"); listToUse.push([ [270, true], [90, false], u.computeDistance(getMapEndX(), blob.y, blob.x, blob.y) ]); var lineLeft = u.followAngle(270, blob.x, blob.y, 190 + blob.size); var lineRight = u.followAngle(90, blob.x, blob.y, 190 + blob.size); u.drawLine(blob.x, blob.y, lineLeft[0], lineLeft[1], 5); u.drawLine(blob.x, blob.y, lineRight[0], lineRight[1], 5); u.drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob.x, blob.y, 5); } if (blob.y > getMapEndY() - distanceFromWallY) { //BOTTOM //console.log("BOTTOM"); listToUse.push([ [0, true], [180, false], u.computeDistance(blob.x, getMapEndY(), blob.x, blob.y) ]); var lineLeft = u.followAngle(0, blob.x, blob.y, 190 + blob.size); var lineRight = u.followAngle(180, blob.x, blob.y, 190 + blob.size); u.drawLine(blob.x, blob.y, lineLeft[0], lineLeft[1], 5); u.drawLine(blob.x, blob.y, lineRight[0], lineRight[1], 5); u.drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob.x, blob.y, 5); } return listToUse; }; //listToUse contains angles in the form of [angle, boolean]. //boolean is true when the range is starting. False when it's ending. //range = [[angle1, true], [angle2, false]] u.getAngleIndex = function(listToUse, angle) { if (listToUse.length == 0) { return 0; } for (var i = 0; i < listToUse.length; i++) { if (angle <= listToUse[i][0]) { return i; } } return listToUse.length; }; u.addAngle = function(listToUse, range) { //#1 Find first open element //#2 Try to add range1 to the list. If it is within other range, don't add it, set a boolean. //#3 Try to add range2 to the list. If it is withing other range, don't add it, set a boolean. //TODO: Only add the new range at the end after the right stuff has been removed. var newListToUse = listToUse.slice(); var startIndex = 1; if (newListToUse.length > 0 && !newListToUse[0][1]) { startIndex = 0; } var startMark = u.getAngleIndex(newListToUse, range[0][0]); var startBool = startMark.mod(2) != startIndex; var endMark = u.getAngleIndex(newListToUse, range[1][0]); var endBool = endMark.mod(2) != startIndex; var removeList = []; if (startMark != endMark) { //Note: If there is still an error, this would be it. var biggerList = 0; if (endMark == newListToUse.length) { biggerList = 1; } for (var i = startMark; i < startMark + (endMark - startMark).mod(newListToUse.length + biggerList); i++) { removeList.push((i).mod(newListToUse.length)); } } else if (startMark < newListToUse.length && endMark < newListToUse.length) { var startDist = (newListToUse[startMark][0] - range[0][0]).mod(360); var endDist = (newListToUse[endMark][0] - range[1][0]).mod(360); if (startDist < endDist) { for (var i = 0; i < newListToUse.length; i++) { removeList.push(i); } } } removeList.sort(function(a, b){return b-a;}); for (var i = 0; i < removeList.length; i++) { newListToUse.splice(removeList[i], 1); } if (startBool) { newListToUse.splice(u.getAngleIndex(newListToUse, range[0][0]), 0, range[0]); } if (endBool) { newListToUse.splice(u.getAngleIndex(newListToUse, range[1][0]), 0, range[1]); } return newListToUse; }; u.getAngleRange = function(blob1, blob2, index, radius) { var angleStuff = u.getEdgeLinesFromPoint(blob1, blob2, radius); var leftAngle = angleStuff[0]; var rightAngle = u.rangeToAngle(angleStuff); var difference = angleStuff[1]; u.drawPoint(angleStuff[2][0], angleStuff[2][1], 3, ""); u.drawPoint(angleStuff[3][0], angleStuff[3][1], 3, ""); //console.log("Adding badAngles: " + leftAngle + ", " + rightAngle + " diff: " + difference); var lineLeft = u.followAngle(leftAngle, blob1.x, blob1.y, 150 + blob1.size - index * 10); var lineRight = u.followAngle(rightAngle, blob1.x, blob1.y, 150 + blob1.size - index * 10); if (blob2.isVirus()) { u.drawLine(blob1.x, blob1.y, lineLeft[0], lineLeft[1], 6); u.drawLine(blob1.x, blob1.y, lineRight[0], lineRight[1], 6); u.drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob1.x, blob1.y, 6); } else if(getCells().hasOwnProperty(blob2.id)) { u.drawLine(blob1.x, blob1.y, lineLeft[0], lineLeft[1], 0); u.drawLine(blob1.x, blob1.y, lineRight[0], lineRight[1], 0); u.drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob1.x, blob1.y, 0); } else { u.drawLine(blob1.x, blob1.y, lineLeft[0], lineLeft[1], 3); u.drawLine(blob1.x, blob1.y, lineRight[0], lineRight[1], 3); u.drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob1.x, blob1.y, 3); } return [leftAngle, difference]; }; //Given a list of conditions, shift the angle to the closest available spot respecting the range given. u.shiftAngle = function(listToUse, angle, range) { //TODO: shiftAngle needs to respect the range! DONE? for (var i = 0; i < listToUse.length; i++) { if (u.angleIsWithin(angle, listToUse[i])) { //console.log("Shifting needed!"); var angle1 = listToUse[i][0]; var angle2 = u.rangeToAngle(listToUse[i]); var dist1 = (angle - angle1).mod(360); var dist2 = (angle2 - angle).mod(360); if (dist1 < dist2) { if (u.angleIsWithin(angle1, range)) { return angle1; } else { return angle2; } } else { if (u.angleIsWithin(angle2, range)) { return angle2; } else { return angle1; } } } } //console.log("No Shifting Was needed!"); return angle; }; /** * This is the main bot logic. This is called quite often. * @param followMouse Is a boolean. If set to true, it means the user is asking for the bot to follow the mouse coordinates. * @return A 2 dimensional array with coordinates for every cells. [[x, y], [x, y]] */ u.findDestination = function(followMouse) { var player = getPlayer(); var interNodes = getMemoryCells(); //console.warn("findDestination(followMouse) was called from line " + arguments.callee.caller.toString()); if ( /*!toggle*/ 1) { //The following code converts the mouse position into an //absolute game coordinate. var useMouseX = u.screenToGameX(getMouseX()); var useMouseY = u.screenToGameY(getMouseY()); tempPoint = [useMouseX, useMouseY, 1]; //The current destination that the cells were going towards. var tempMoveX = getPointX(); var tempMoveY = getPointY(); //This variable will be returned at the end. //It will contain the destination choices for all the cells. //BTW!!! ERROR ERROR ABORT MISSION!!!!!!! READ BELOW ----------- // //SINCE IT'S STUPID NOW TO ASK EACH CELL WHERE THEY WANT TO GO, //THE BOT SHOULD SIMPLY PICK ONE AND THAT'S IT, I MEAN WTF.... var destinationChoices = []; //destination, size, danger //Just to make sure the player is alive. if (player.length > 0) { //Loop through all the player's cells. for (var k = 0; k < player.length; k++) { if (true) { u.drawPoint(player[k].x, player[k].y + player[k].size, 0, "" + (getLastUpdate() - player[k].birth) + " / " + (30000 + (player[k].birthMass * 57) - (getLastUpdate() - player[k].birth)) + " / " + player[k].birthMass); } } //Loops only for one cell for now. for (var k = 0; /*k < player.length*/ k < 1; k++) { //console.log("Working on blob: " + k); u.drawCircle(player[k].x, player[k].y, player[k].size + u.splitDistance, 5); //drawPoint(player[0].x, player[0].y - player[0].size, 3, "" + Math.floor(player[0].x) + ", " + Math.floor(player[0].y)); //var allDots = processEverything(interNodes); //loop through everything that is on the screen and //separate everything in it's own category. var allIsAll = u.getAll(player[k]); //The food stored in element 0 of allIsAll var allPossibleFood = allIsAll[0]; //The threats are stored in element 1 of allIsAll var allPossibleThreats = allIsAll[1]; //The viruses are stored in element 2 of allIsAll var allPossibleViruses = allIsAll[2]; //The bot works by removing angles in which it is too //dangerous to travel towards to. var badAngles = []; var obstacleList = []; var isSafeSpot = true; var isMouseSafe = true; var clusterAllFood = u.clusterFood(allPossibleFood, player[k].size); //console.log("Looking for enemies!"); //Loop through all the cells that were identified as threats. for (var i = 0; i < allPossibleThreats.length; i++) { var enemyDistance = u.computeDistanceFromCircleEdge(allPossibleThreats[i].x, allPossibleThreats[i].y, player[k].x, player[k].y, allPossibleThreats[i].size); allPossibleThreats[i].enemyDist = enemyDistance; } /*allPossibleThreats.sort(function(a, b){ return a.enemyDist-b.enemyDist; })*/ for (var i = 0; i < allPossibleThreats.length; i++) { var enemyDistance = u.computeDistance(allPossibleThreats[i].x, allPossibleThreats[i].y, player[k].x, player[k].y); var splitDangerDistance = allPossibleThreats[i].size + u.splitDistance + 150; var normalDangerDistance = allPossibleThreats[i].size + 150; var shiftDistance = player[k].size; //console.log("Found distance."); var enemyCanSplit = u.canSplit(player[k], allPossibleThreats[i]); for (var j = clusterAllFood.length - 1; j >= 0 ; j--) { var secureDistance = (enemyCanSplit ? splitDangerDistance : normalDangerDistance); if (u.computeDistance(allPossibleThreats[i].x, allPossibleThreats[i].y, clusterAllFood[j][0], clusterAllFood[j][1]) < secureDistance) clusterAllFood.splice(j, 1); } //console.log("Removed some food."); if (enemyCanSplit) { u.drawCircle(allPossibleThreats[i].x, allPossibleThreats[i].y, splitDangerDistance, 0); u.drawCircle(allPossibleThreats[i].x, allPossibleThreats[i].y, splitDangerDistance + shiftDistance, 6); } else { u.drawCircle(allPossibleThreats[i].x, allPossibleThreats[i].y, normalDangerDistance, 3); u.drawCircle(allPossibleThreats[i].x, allPossibleThreats[i].y, normalDangerDistance + shiftDistance, 6); } if (allPossibleThreats[i].danger && getLastUpdate() - allPossibleThreats[i].dangerTimeOut > 1000) { allPossibleThreats[i].danger = false; } /*if ((enemyCanSplit && enemyDistance < splitDangerDistance) || (!enemyCanSplit && enemyDistance < normalDangerDistance)) { allPossibleThreats[i].danger = true; allPossibleThreats[i].dangerTimeOut = f.getLastUpdate(); }*/ //console.log("Figured out who was important."); if ((enemyCanSplit && enemyDistance < splitDangerDistance) || (enemyCanSplit && allPossibleThreats[i].danger)) { badAngles.push(u.getAngleRange(player[k], allPossibleThreats[i], i, splitDangerDistance).concat(allPossibleThreats[i].enemyDist)); } else if ((!enemyCanSplit && enemyDistance < normalDangerDistance) || (!enemyCanSplit && allPossibleThreats[i].danger)) { badAngles.push(u.getAngleRange(player[k], allPossibleThreats[i], i, normalDangerDistance).concat(allPossibleThreats[i].enemyDist)); } else if (enemyCanSplit && enemyDistance < splitDangerDistance + shiftDistance) { var tempOb = u.getAngleRange(player[k], allPossibleThreats[i], i, splitDangerDistance + shiftDistance); var angle1 = tempOb[0]; var angle2 = u.rangeToAngle(tempOb); obstacleList.push([[angle1, true], [angle2, false]]); } else if (!enemyCanSplit && enemyDistance < normalDangerDistance + shiftDistance) { var tempOb = u.getAngleRange(player[k], allPossibleThreats[i], i, normalDangerDistance + shiftDistance); var angle1 = tempOb[0]; var angle2 = u.rangeToAngle(tempOb); obstacleList.push([[angle1, true], [angle2, false]]); } //console.log("Done with enemy: " + i); } //console.log("Done looking for enemies!"); var goodAngles = []; var stupidList = []; for (var i = 0; i < allPossibleViruses.length; i++) { if (player[k].size < allPossibleViruses[i].size) { u.drawCircle(allPossibleViruses[i].x, allPossibleViruses[i].y, allPossibleViruses[i].size + 10, 3); u.drawCircle(allPossibleViruses[i].x, allPossibleViruses[i].y, allPossibleViruses[i].size * 2, 6); } else { u.drawCircle(allPossibleViruses[i].x, allPossibleViruses[i].y, player[k].size + 50, 3); u.drawCircle(allPossibleViruses[i].x, allPossibleViruses[i].y, player[k].size * 2, 6); } } for (var i = 0; i < allPossibleViruses.length; i++) { var virusDistance = u.computeDistance(allPossibleViruses[i].x, allPossibleViruses[i].y, player[k].x, player[k].y); if (player[k].size < allPossibleViruses[i].size) { if (virusDistance < (allPossibleViruses[i].size * 2)) { var tempOb = u.getAngleRange(player[k], allPossibleViruses[i], i, allPossibleViruses[i].size + 10); var angle1 = tempOb[0]; var angle2 = u.rangeToAngle(tempOb); obstacleList.push([[angle1, true], [angle2, false]]); } } else { if (virusDistance < (player[k].size * 2)) { var tempOb = u.getAngleRange(player[k], allPossibleViruses[i], i, player[k].size + 50); var angle1 = tempOb[0]; var angle2 = u.rangeToAngle(tempOb); obstacleList.push([[angle1, true], [angle2, false]]); } } } if (badAngles.length > 0) { //NOTE: This is only bandaid wall code. It's not the best way to do it. stupidList = u.addWall(stupidList, player[k]); } for (var i = 0; i < badAngles.length; i++) { var angle1 = badAngles[i][0]; var angle2 = u.rangeToAngle(badAngles[i]); stupidList.push([[angle1, true], [angle2, false], badAngles[i][2]]); } //stupidList.push([[45, true], [135, false]]); //stupidList.push([[10, true], [200, false]]); stupidList.sort(function(a, b){ //console.log("Distance: " + a[2] + ", " + b[2]); return a[2]-b[2]; }); //console.log("Added random noob stuff."); var sortedInterList = []; var sortedObList = []; for (var i = 0; i < stupidList.length; i++) { //console.log("Adding to sorted: " + stupidList[i][0][0] + ", " + stupidList[i][1][0]); var tempList = u.addAngle(sortedInterList, stupidList[i]); if (tempList.length == 0) { console.log("MAYDAY IT'S HAPPENING!"); break; } else { sortedInterList = tempList; } } for (var i = 0; i < obstacleList.length; i++) { sortedObList = u.addAngle(sortedObList, obstacleList[i]); if (sortedObList.length == 0) { break; } } var offsetI = 0; var obOffsetI = 1; if (sortedInterList.length > 0 && sortedInterList[0][1]) { offsetI = 1; } if (sortedObList.length > 0 && sortedObList[0][1]) { obOffsetI = 0; } var goodAngles = []; var obstacleAngles = []; for (var i = 0; i < sortedInterList.length; i += 2) { var angle1 = sortedInterList[(i + offsetI).mod(sortedInterList.length)][0]; var angle2 = sortedInterList[(i + 1 + offsetI).mod(sortedInterList.length)][0]; var diff = (angle2 - angle1).mod(360); goodAngles.push([angle1, diff]); } for (var i = 0; i < sortedObList.length; i += 2) { var angle1 = sortedObList[(i + obOffsetI).mod(sortedObList.length)][0]; var angle2 = sortedObList[(i + 1 + obOffsetI).mod(sortedObList.length)][0]; var diff = (angle2 - angle1).mod(360); obstacleAngles.push([angle1, diff]); } for (var i = 0; i < goodAngles.length; i++) { var line1 = u.followAngle(goodAngles[i][0], player[k].x, player[k].y, 100 + player[k].size); var line2 = u.followAngle((goodAngles[i][0] + goodAngles[i][1]).mod(360), player[k].x, player[k].y, 100 + player[k].size); u.drawLine(player[k].x, player[k].y, line1[0], line1[1], 1); u.drawLine(player[k].x, player[k].y, line2[0], line2[1], 1); u.drawArc(line1[0], line1[1], line2[0], line2[1], player[k].x, player[k].y, 1); //drawPoint(player[0].x, player[0].y, 2, ""); u.drawPoint(line1[0], line1[1], 0, "" + i + ": 0"); u.drawPoint(line2[0], line2[1], 0, "" + i + ": 1"); } for (var i = 0; i < obstacleAngles.length; i++) { var line1 = u.followAngle(obstacleAngles[i][0], player[k].x, player[k].y, 50 + player[k].size); var line2 = u.followAngle((obstacleAngles[i][0] + obstacleAngles[i][1]).mod(360), player[k].x, player[k].y, 50 + player[k].size); u.drawLine(player[k].x, player[k].y, line1[0], line1[1], 6); u.drawLine(player[k].x, player[k].y, line2[0], line2[1], 6); u.drawArc(line1[0], line1[1], line2[0], line2[1], player[k].x, player[k].y, 6); //drawPoint(player[0].x, player[0].y, 2, ""); u.drawPoint(line1[0], line1[1], 0, "" + i + ": 0"); u.drawPoint(line2[0], line2[1], 0, "" + i + ": 1"); } if (followMouse && goodAngles.length == 0) { //This is the follow the mouse mode var distance = u.computeDistance(player[k].x, player[k].y, tempPoint[0], tempPoint[1]); var shiftedAngle = u.shiftAngle(obstacleAngles, u.getAngle(tempPoint[0], tempPoint[1], player[k].x, player[k].y), [0, 360]); var destination = u.followAngle(shiftedAngle, player[k].x, player[k].y, distance); destinationChoices = destination; u.drawLine(player[k].x, player[k].y, destination[0], destination[1], 1); //tempMoveX = destination[0]; //tempMoveY = destination[1]; } else if (goodAngles.length > 0) { var bIndex = goodAngles[0]; var biggest = goodAngles[0][1]; for (var i = 1; i < goodAngles.length; i++) { var size = goodAngles[i][1]; if (size > biggest) { biggest = size; bIndex = goodAngles[i]; } } var perfectAngle = (bIndex[0] + bIndex[1] / 2).mod(360); perfectAngle = u.shiftAngle(obstacleAngles, perfectAngle, bIndex); var line1 = u.followAngle(perfectAngle, player[k].x, player[k].y, verticalDistance()); destinationChoices = line1; u.drawLine(player[k].x, player[k].y, line1[0], line1[1], 7); //tempMoveX = line1[0]; //tempMoveY = line1[1]; } else if (badAngles.length > 0 && goodAngles == 0) { //When there are enemies around but no good angles //You're likely screwed. (This should never happen.) console.log("Failed"); destinationChoices = [tempMoveX, tempMoveY]; /*var angleWeights = [] //Put weights on the angles according to enemy distance for (var i = 0; i < allPossibleThreats.length; i++){ var dist = computeDistance(player[k].x, player[k].y, allPossibleThreats[i].x, allPossibleThreats[i].y); var angle = getAngle(allPossibleThreats[i].x, allPossibleThreats[i].y, player[k].x, player[k].y); angleWeights.push([angle,dist]); } var maxDist = 0; var finalAngle = 0; for (var i = 0; i < angleWeights.length; i++){ if (angleWeights[i][1] > maxDist){ maxDist = angleWeights[i][1]; finalAngle = (angleWeights[i][0] + 180).mod(360); } } var line1 = followAngle(finalAngle,player[k].x,player[k].y,f.verticalDistance()); drawLine(player[k].x, player[k].y, line1[0], line1[1], 2); destinationChoices.push(line1);*/ } else if (clusterAllFood.length > 0) { for (var i = 0; i < clusterAllFood.length; i++) { //console.log("mefore: " + clusterAllFood[i][2]); //This is the cost function. Higher is better. var clusterAngle = u.getAngle(clusterAllFood[i][0], clusterAllFood[i][1], player[k].x, player[k].y); clusterAllFood[i][2] = clusterAllFood[i][2] * 6 - u.computeDistance(clusterAllFood[i][0], clusterAllFood[i][1], player[k].x, player[k].y); //console.log("Current Value: " + clusterAllFood[i][2]); //(goodAngles[bIndex][1] / 2 - (Math.abs(perfectAngle - clusterAngle))); clusterAllFood[i][3] = clusterAngle; u.drawPoint(clusterAllFood[i][0], clusterAllFood[i][1], 1, ""); //console.log("After: " + clusterAllFood[i][2]); } var bestFoodI = 0; var bestFood = clusterAllFood[0][2]; for (var i = 1; i < clusterAllFood.length; i++) { if (bestFood < clusterAllFood[i][2]) { bestFood = clusterAllFood[i][2]; bestFoodI = i; } } //console.log("Best Value: " + clusterAllFood[bestFoodI][2]); var distance = u.computeDistance(player[k].x, player[k].y, clusterAllFood[bestFoodI][0], clusterAllFood[bestFoodI][1]); var shiftedAngle = u.shiftAngle(obstacleAngles, u.getAngle(clusterAllFood[bestFoodI][0], clusterAllFood[bestFoodI][1], player[k].x, player[k].y), [0, 360]); var destination = u.followAngle(shiftedAngle, player[k].x, player[k].y, distance); destinationChoices = destination; //tempMoveX = destination[0]; //tempMoveY = destination[1]; u.drawLine(player[k].x, player[k].y, destination[0], destination[1], 1); } else { //If there are no enemies around and no food to eat. destinationChoices = [tempMoveX, tempMoveY]; } u.drawPoint(tempPoint[0], tempPoint[1], tempPoint[2], ""); //drawPoint(tempPoint[0], tempPoint[1], tempPoint[2], "" + Math.floor(computeDistance(tempPoint[0], tempPoint[1], I, J))); //drawLine(tempPoint[0], tempPoint[1], player[0].x, player[0].y, 6); //console.log("Slope: " + slope(tempPoint[0], tempPoint[1], player[0].x, player[0].y) + " Angle: " + getAngle(tempPoint[0], tempPoint[1], player[0].x, player[0].y) + " Side: " + (getAngle(tempPoint[0], tempPoint[1], player[0].x, player[0].y) - 90).mod(360)); tempPoint[2] = 1; //console.log("Done working on blob: " + i); } //TODO: Find where to go based on destinationChoices. /*var dangerFound = false; for (var i = 0; i < destinationChoices.length; i++) { if (destinationChoices[i][2]) { dangerFound = true; break; } } destinationChoices.sort(function(a, b){return b[1] - a[1]}); if (dangerFound) { for (var i = 0; i < destinationChoices.length; i++) { if (destinationChoices[i][2]) { tempMoveX = destinationChoices[i][0][0]; tempMoveY = destinationChoices[i][0][1]; break; } } } else { tempMoveX = destinationChoices.peek()[0][0]; tempMoveY = destinationChoices.peek()[0][1]; //console.log("Done " + tempMoveX + ", " + tempMoveY); }*/ } //console.log("MOVING RIGHT NOW!"); //console.log("______Never lied ever in my life."); return destinationChoices; } }; /** * A conversion from the screen's horizontal coordinate system * to the game's horizontal coordinate system. * @param x in the screen's coordinate system * @return x in the game's coordinate system */ u.screenToGameX = function(x) { return (x - getWidth() / 2) / getRatio() + getX(); }; /** * A conversion from the screen's vertical coordinate system * to the game's vertical coordinate system. * @param y in the screen's coordinate system * @return y in the game's coordinate system */ u.screenToGameY = function(y) { return (y - getHeight() / 2) / getRatio() + getY(); }; u.drawPoint = function(x_1, y_1, drawColor, text) { f.drawPoint(x_1, y_1, drawColor, text); }; u.drawArc = function(x_1, y_1, x_2, y_2, x_3, y_3, drawColor) { f.drawArc(x_1, y_1, x_2, y_2, x_3, y_3, drawColor); }; u.drawLine = function(x_1, y_1, x_2, y_2, drawColor) { f.drawLine(x_1, y_1, x_2, y_2, drawColor); }; u.drawCircle = function(x_1, y_1, radius, drawColor) { f.drawCircle(x_1, y_1, radius, drawColor); }; /** * Some horse shit of some sort. * @return Horse Shit */ u.screenDistance = function() { var temp = f.getScreenDistance(); return temp; }; /** * Tells you if the game is in Dark mode. * @return Boolean for dark mode. */ u.getDarkBool = function() { return f.getDarkBool(); }; /** * Tells you if the mass is shown. * @return Boolean for player's mass. */ u.getMassBool = function() { return f.getMassBool(); }; /** * This is a copy of everything that is shown on screen. * Normally stuff will time out when off the screen, this * memorizes everything that leaves the screen for a little * while longer. * @return The memory object. */ u.getMemoryCells = function() { return f.getMemoryCells(); }; /** * [getCellsArray description] * @return {[type]} [description] */ u.getCellsArray = function() { return f.getCellsArray(); }; /** * This is the original "getMemoryCells" without the memory part. * @return Non memorized object. */ u.getCells = function() { return f.getCells(); }; /** * Returns an array with all the player's cells. * @return Player's cells */ u.getPlayer = function () { return f.getPlayer(); }; /** * The canvas' width. * @return Integer Width */ u.getWidth = function() { return f.getWidth(); }; /** * The canvas' height * @return Integer Height */ u.getHeight = function() { return f.getHeight(); }; /** * Scaling ratio of the canvas. The bigger this ration, * the further that you see. * @return Screen scaling ratio. */ u.getRatio = function() { return f.getRatio(); }; /** * [getOffsetX description] * @return {[type]} [description] */ u.getOffsetX = function() { return f.getOffsetX(); }; u.getOffsetY = function() { return f.getOffsetY(); }; u.getX = function() { return f.getX(); }; u.getY = function() { return f.getY(); }; u.getPointX = function() { return f.getPointX(); }; u.getPointY = function() { return f.getPointY(); }; /** * The X location of the mouse. * @return Integer X */ u.getMouseX = function() { return f.getMouseX(); }; /** * The Y location of the mouse. * @return Integer Y */ u.getMouseY = function() { return f.getMouseY(); }; /** * A timestamp since the last time the server sent any data. * @return Last update timestamp */ u.getUpdate = function() { return f.getLastUpdate(); }; /** * The game's current mode. (":ffa", ":experimental", ":teams". ":party") * @return {[type]} [description] */ u.getMode = function() { return f.getMode(); }; f.botList.push(["AposBot " + aposBotVersion, u.findDestination]); u.bList = g('#bList'); g('<option />', {value: (f.botList.length - 1), text: "AposBot"}).appendTo(bList);
ONLYOFFICE
The ansible tasks for deploy the documentserver cluster
bomccoy
This repository documents the homelab build series from [Crowbar Kernel Panic](https://www.youtube.com/channel/UCUyaCyldxB7S939WoRN-mLw). The goal is to build a medium-sized home server, run Proxmox for virtualization, and set up a lightweight Kubernetes cluster with k3s.
A system that provides replication of database of documents in a distributed environment where databases are stored in cluster of server. Client can connect to any of the server and push or pull his database (folder/repository). The server clusters provides highly available replication system.
quiet-node
☘️ version 2.0 allows users to fetch 5-10 clusters randomly from the Spring Boot backend server. It then feed the clusters to React+D3.js (Data-driven document) in the FE to form up a hierarchical tree
anjalisharma2611
. Topic Detection using keyword Clustering To find prominent topic in a collection of documents. We here propose a system to detect topic from a collection of document. We use an efficient method to discover topic in a collection of documents known as topic model. A topic model is a type of statistical model for discoveringtopics from collection of documents. One would expect particular words to appear in thedocument more or less frequently: “dog” and “bone” will appear more often in documentsabout dogs, “cat” and “meow” will appear in documents about cats, and “the” and “is” willappear equally in both. A document typically concerns multiple topics in differentproportions; thus, in a document that is 10% about cats and 90% about dogs, there wouldprobably be about 9 times more dog words than cat words. Our proposed system capturesthis intuition in a mathematical framework and will examine topic of particular set ofdocuments. Here the system will extract keywords and will use clustering algorithm in orderto discover topic from particular set of documents. System will extract keywords which occuroften and will cluster this keywords using clustering algorithm and will detect topic from acollection of documents. This system takes co occurrence of terms into account which givesbest result. This system can be useful for web crawlers and for web users. This system willhelp the web users to easily search information for particular topic. When the user will searchfor particular topic, system will extract various keywords from the set of documents whichwill match topic name mentioned by the web user and will cluster the keywords and willprovide topic related information to the user. Web users will get information quickly forrespective topic they are searching for. Advantages This system takes co occurrence of terms into account which gives best result. This system will help the web users to easily search information for particular topic. Web users will get information quickly for respective topic they are searching for. Feasibility Study This system will extract keywords which occur often from collection of documents and will cluster the words using clustering algorithm and system will detect topic from a collection of documents. Economic Feasibility This system will help the web users to easily search information for particular topic. This system will be useful for web crawlers. This system will provide economic benefits for many websites. It includes quantification and identification of all the benefits expected. Operational Feasibility This system is more reliable, maintainable, affordable and producible. These are the parameters which are considered during design and development of this project. During design and development phase of this project there was appropriate and timely application of engineering and management efforts to meet the previously mentioned parameters. Technical Feasibility The back end of this project is PHP Wamp server which stores parameters related to this project. There are basic requirement of hardware to run this application. This application will be online so this application can be accessed by using any device like (Personal Computers, Laptop and with some hand held devices). Module Description : This project is “Topic Detection Using Keyword Clustring” .The Website is named as “ GO DETECTCTION : SEARCH ON THE BRINK” . This project is basically a web tool which will help the users to detect the Topic of the paragraph or the lines which will be entered by the user . Our Website starts with a basic introduction about what it will do and how it is going to work. It gives the information to the users about some basic things that are used to make the topic detection tool like data mining, Knowledge Management and Business Intelligence. All the pages are designed with the help of HTML , CSS and Bootstrap. The validations are done in the website using Java Script. The data connectivity is mainly used for Sign Up and Sign In which is done by PHP using Wamp Server. With the help of tools such was web crawlers and Java Script ,when the user will enter the paragraph in the text box , the tool will detect the possible topics of the paragraph and will display all the results to he user . The user may choose any of the topic among them.
dcs2014
Document Clustering Server - carrot2, WEKA clustering
mariamelsehrawyy
This repo documents how to overwrite your ntp configuretion servers on openshift cluster by using machine config
hogikyan
A collection of text documents and dotfiles to get all those darn servers/clusters to work nicely.
AI-Trainer-Domains
This document guides you through setting up a Hadoop cluster, including configuring YARN's Timeline Server for tracking application history.
Rbedoyag
A Model Context Protocol (MCP) server implementation that provides Elasticsearch and OpenSearch interaction. This server enables searching documents, analyzing indices, and managing cluster through a set of tools.
chuangw6
Document how I set up a GKE cluster with an AI agent running and connecting to a remote MCP server and stick an Envoy gateway.
AuraAiLab
A project to document the installation and deployment of AI models on a Kubernetes cluster, focusing on Mistral 7b on Ollama and Whisper on Triton Inference Server.
adrghph
Documented solution for exposing a passive FTP server in a Tanzu Kubernetes Grid cluster using a hybrid setup with a standalone HAProxy to bypass Supervisor LoadBalancer limitations.
IPOUL2208
Built and managed an AWS EKS Kubernetes cluster using eksctl; deployed NGINX web server with LoadBalancer service; automated configuration via AWS CLI and kubectl; documented full workflow on GitHub. Tools: AWS, EKS, Kubernetes, eksctl, kubectl, CloudFormation, IAM
raahulgupta83
This document details the setup and management of a MongoDB sharded cluster, integrated with a web application consisting of frontend and backend services, running in Docker containers. The deployment also includes an Nginx web server and AdminMongo for database management.
Ndeta100
I am constructing a Proxmox home server to establish a Kubernetes cluster for hands-on learning. This approach allows me to bypass the expenses associated with cloud services like AWS or Google Cloud. Detailed updates and progress will be documented in the README.
cncwebphp
PHP is a broadly useful scripting language that is particularly suited to server-side web improvement yet in addition utilized as a universally useful dialect. PHP used to remain for the individual landing page however now it remains for Hypertext Preprocessor. On the off chance that you are searching for php training in pune to give a kick begin to your vocation in web improvement you can join cncwebworld without reluctance for getting prepared by master educators. PHP is a standout amongst the most mainstream and broadly utilized dialects found on the planet. We can make imaginative and appealing pages with the assistance of PHP. PHP is anything but difficult to learn yet has a rich arrangement of utilizations. In the event that you need to get prepared in this dialect join courses at CNC web world for php classes pune and increase most extreme direction to do the best. PHP course furnishes inclusion of PHP scripting dialect with themes like programming procedures, contingent tests, and occasions, PHP stream control, capacities clusters, OOPs, session, treats, document taking care of, record transferring, Ajax, MySQL, word press and Joomla with PHP. Framework Zero One Systems will give you each data in regards to this. You can learn php courses in pune and can build up any web application like in administration, container administration, internet shopping, and so on. PHP Code is typically handled by a PHP mediator actualized as a module in the web server or as a typical escape interface executable. And after that the web server blends the consequences of the translated and executed PHP code. To get more data about PHP course enlist yourself to Victorious Digital for any php certification course in pune and plan about taking in the course. The course is principally intended to grow an amateurs software engineer's comprehension of the PHP dialect. You will get a hands-on methodology with different models and handy activities. You can likewise upgrade your learning with a key advancement venture. You can discover more php training and placement in pune.
All 23 repositories loaded