axel3rd / mpg-coach-bot Goto Github PK
View Code? Open in Web Editor NEWMPG (Mon Petit Gazon) coach bot, to automate and optimize weekly actions
Home Page: https://axel3rd.github.io/mpg-coach-bot/
License: MIT License
MPG (Mon Petit Gazon) coach bot, to automate and optimize weekly actions
Home Page: https://axel3rd.github.io/mpg-coach-bot/
License: MIT License
JAR is not enough for simple usage from https://bintray.com/axel3rd/generic/mpg-coach-bot/.
Should be a ZIP which contains:
mpg.properties
config file.bat
/ .sh
) with correct call (jar version) and pause at end for WindowsDuring mercatos, the team is currently not used to verify out players ; only name & position used (position for all championship except L2).
To have better result, this name should be used to verify if players are really out.
It is not implemented because only TeamId are in mercato API.
Team name (to use for mapping in injured/suspended player) should be got in other API.
Describe the bug
When no more match are available in MPG season (Plus de match disponible. in Coach screen), this exception occurs:
========== League Name ==========
Exception in thread "main" javax.ws.rs.ProcessingException: Error reading entity from input stream.
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:889)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:321)
at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.java:115)
at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:389)
at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:264)
at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:112)
at org.blondin.mpg.AbstractClient.call(AbstractClient.java:117)
at org.blondin.mpg.AbstractClient.get(AbstractClient.java:63)
at org.blondin.mpg.root.MpgClient.getCoach(MpgClient.java:42)
at org.blondin.mpg.Main.process(Main.java:48)
at org.blondin.mpg.Main.main(Main.java:40)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Root name 'success' does not match expected ('data') for type [simple type, class org.blondin.mpg.root.model.Coach]
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@f9af83; line: 1, column: 2]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234)
at com.fasterxml.jackson.databind.ObjectReader._unwrapAndDeserialize(ObjectReader.java:1693)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1580)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:964)
at org.glassfish.jersey.jackson.internal.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:838)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1091)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
... 14 more
A clear and concise description of what the bug is, with a copy/paste of Java exception if present.
Join debug files
The result of GET /league/[yourLeagueId]/coach
is (in this case):
{"success":"noMoreGames"}
Expected behavior
It should not crash, but normal exist with correct message.
When MPG league is in normal mode and the transaction proposal feature is used, the endpoint /league/KJVB6L7C/transfer/buy
response is:
{
"success": false,
"error": "normalMode",
"code": 833
}
So no players and there is a fail with:
java.lang.NullPointerException
at org.blondin.mpg.Main.removeOutPlayers(Main.java:292)
at org.blondin.mpg.Main.processGames(Main.java:173)
at org.blondin.mpg.Main.processLeague(Main.java:90)
Describe the bug
Currently Pablo Chavarria (Reims) is injured.
Pablo (Bordeaux) is considered injured in this case.
Using player's team could limit this impact.
Currently, there is 2 substitutes by lines (1 for goalkeeper).
When you have not enough players (injured, suspended, really not enough), there are some blank on substitutes' bench.
In this case, they should be completed by valid users.
The most efficient player(s) should be used in this case.
In case of 5-4-1 and if the best player is an attacker, it is not the best strategy ; A defender or middlefield would be better.
But it is more complicated to implement and decide of one sustainable strategy ...
When player has no first or last name (ex: Neymar), the getName
could have space (start or end, see Player.java). A trim should be implemented.
In addition, use StringUtils.defaultIfBlack
, better than if
.
Suggestion: what about using the winning chance % from MPGStat to adjust the efficiency?
for example: player.matchs / championshipDays * player.average * (1 + player.goals() * efficiency.coeff * (50%/(1-winning chance) (not sure the math is right).
maybe 1+ln((50%/(1-winning chance)) would be better
Basically, efficiency is unchanged if the winning chance is 50/50. It decreases if eff is lower than 50% and increases if eff is higher than 50%.
Let me know what you think!
Cheers!
The main feature of v1 is to sort players by efficiency (probability to play, goal, ...).
Could be done with stats from:
Currently it is not compatible with JDK 11 because javax.activation package is not in JDK 9
When you have not many substitutes, the tactical substitutes could be dangerous.
Some (selected) players will be replaced, and you can have rotaldo as result.
So an option should be implemented to disable that (but with default value for change as currently):
tactical.substitutes = true
Describe the bug
Hello,
Maybe nothing or something that will correct itself later today but eff. is 0 for all my EPL players this morning.
Optimized team:
+---+---------------------+------+----+
| P | Player name | Eff. | Q. |
+---+---------------------+------+----+
| G | Fabianski Lukasz | 0.00 | 25 |
| G | Heaton Tom | 0.00 | 18 |
| G | Rui Patrício | 0.00 | 15 |
+---+---------------------+------+----+
| D | Diop Issa | 0.00 | 21 |
| D | Pieters Erik | 0.00 | 13 |
| D | Guilbert Frederic | 0.00 | 13 |
| D | Vestergaard Jannik | 0.00 | 12 |
| D | Cuco Martina | 0.00 | 12 |
| D | Stearman Richard | 0.00 | 12 |
| D | Kiko Femenía | 0.00 | 11 |
| D | Holebas José | 0.00 | 10 |
| D | Engels Björn | 0.00 | 10 |
| D | Angeliño | 0.00 | 9 |
| D | Cédric Soares | 0.00 | 9 |
| D | Dawson Craig | 0.00 | 6 |
+---+---------------------+------+----+
| M | Ndombele Tanguy | 0.00 | 22 |
| M | Kovacic Mateo | 0.00 | 13 |
| M | Fornals Pablo | 0.00 | 13 |
| M | Djenepo Moussa | 0.00 | 12 |
| M | Trossard Leandro | 0.00 | 11 |
| M | Zinchenko Oleksandr | 0.00 | 10 |
| M | Mount Mason | 0.00 | 10 |
| M | Jota | 0.00 | 7 |
| M | James Daniel | 0.00 | 1 |
+---+---------------------+------+----+
| A | Jiménez Raúl | 0.00 | 28 |
| A | Deulofeu Gerard | 0.00 | 18 |
| A | Wesley | 0.00 | 12 |
| A | Giroud Olivier | 0.00 | 10 |
| A | El Ghazi Anwar | 0.00 | 9 |
| A | Drmic Josip | 0.00 | 8 |
+---+---------------------+------+----+
Join debug files
Depending your championship, join data files set in attachment.
GET /user/dashboard
GET /league/[yourLeagueId]/coach
GET /league/[yourLeagueId]/transfer/buy
The Players statistics time update data : https://www.mpgstats.fr/json/leagues.json
The Injury / Suspended data, one full HTML from:
Expected behavior
A clear and concise description of what you expected to happen.
If problem on update team feature, please join the Request and Response of POST /league/[yourLeagueId]/coach
when you save your team in MPG.
Should be upgraded to xenial (an not bionic, no Jdk v8 could be installed):
Line 2 in 6d2b574
Due previous update (& compatibily), switch to openjdk8 :
Line 4 in 6d2b574
Due to previous update, Java binary changes in /usr/lib/jvm/java-1.8.0-openjdk-amd64
:
Line 18 in 6d2b574
During intermediate mercato step where MPG ask you to fill the name/acronym/stage information for your, mpg-coach-not fails with a 403.
In this case, the mercato
endpoint is not accessible.
With #2 & #1 implemented, an auto update can be done.
In configuration, an update=[true|false]
(default false
if not exist) properties should be implemented.
Technically, this is a POST
on /league/[leagueId]/coach
with content:
{
"playersOnPitch": {
"1": "player_42713",
"2": "player_93605",
...
"17": "player_219873",
"18": null <-- if no player seletect
},
"composition": 343,
"tacticalsubstitutes": [
{
"subs": "player_183779",
"start": "player_52782",
"rating": 3
},
{
"subs": "player_47654",
"start": "player_213198",
"rating": 3
}
... until 5
],
"bonusSelected": {
... should be investiguated --> should be the same as user selection
},
"matchId": "mpg_match_KLGXSSUG_1_6_4",
"realday": 9
}
Domino's Ligue 2 is new in MPG (#76). For other league, the best third-part website for injured/suspended players is http://www.equipeactu.fr/blessures-et-suspensions/fodbold/ (#1).
It exists for L2 (http://www.equipeactu.fr/blessures-et-suspensions/fodbold/france/ligue-2), but currently empty.
=> We should stay tuned on this website, and if no data after some L2 days, a switch should be done on other website for L2 (perhaps injured/suspended information from MPG itself, but seems not really up2date information this past year).
Linked to #76, when no data in MPG stat, efficiency calculation is to 0 for all players.
In the sort by efficiency, the player value should be the second criteria (for same efficiency, 0 or not).
With efficiency calculation we can propose:
Currently, the injured/suspended premiere league player link used is: http://www.equipeactu.fr/blessures-et-suspensions/fodbold/angleterre/championship
See bug_report.md or combination in code:
This link is invalid, http://www.equipeactu.fr/blessures-et-suspensions/fodbold/angleterre/premier-league should be used.
Not understand how not detected before 😭 !
-B
(Maven batch mode) should be added in last command, to use defaults options (for version, tag name, ...)
On SeriaA championship, execption:
Exception in thread "main" java.lang.UnsupportedOperationException: Unsupported status code: 301 Moved Permanently / Content: <!DOCTYPE HTML PUBLITF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://www.equipeactu.fr/blessures-et-suspensions/fodbold/italie/serie-a">here</a>.</p>
</body></html>
When league is in preparation (status 1, #39), suggest should be provided for mercato ; by line based on efficiency.
For cotation, https://api.monpetitgazon.com/mercato/1
(for French championship)
It would be convenient with #13
========== Rock on the grass ==========
Out: Thauvin Florian - SUSPENDED - 16/12: Marseille-Bordeaux - Points de sanction
Exception in thread "main" java.lang.UnsupportedOperationException: Player can't be found in stats: Oyongo Ambroise
at org.blondin.mpg.stats.model.Championship.getPlayer(Championship.java:46)
at org.blondin.mpg.Main.calculateEfficiency(Main.java:115)
at org.blondin.mpg.Main.process(Main.java:55)
at org.blondin.mpg.Main.main(Main.java:40)
After the weekend, when team substitutes are reseted, the update fail with :
Exception in thread "main" java.lang.UnsupportedOperationException: Unsupported status code: 400 Bad Request / Content: {"error":"badRequest"}
at org.blondin.mpg.AbstractClient.call(AbstractClient.java:124)
at org.blondin.mpg.AbstractClient.post(AbstractClient.java:85)
at org.blondin.mpg.AbstractClient.post(AbstractClient.java:81)
at org.blondin.mpg.root.MpgClient.updateCoach(MpgClient.java:95)
at org.blondin.mpg.Main.updateTeamWithRetry(Main.java:188)
at org.blondin.mpg.Main.processGames(Main.java:164)
at org.blondin.mpg.Main.processLeague(Main.java:90)
at org.blondin.mpg.Main.process(Main.java:68)
at org.blondin.mpg.Main.main(Main.java:59)
It is strange, because if you save you team on MPG as it is ... and execute mpg-coach-bot with update, it works.
Hey there,
I'm not very comfortable with java application, I put my credentials in mpg.properties and I tried to launch your sh script :
$ ./mpg-coach-bot.sh
./mpg-coach-bot.sh: ligne 3: ${project.artifactId}-${project.version}.jar : mauvaise substitution
I couldn't found any .jar anywhere and I don't know what these variables should contain 👍
${project.artifactId}-${project.version}.
Thanks for helping, I probably miss something.
Linked to #76, when league start and not datas exist in MPG stats, this error occurs:
Exception in thread "main" org.blondin.mpg.root.exception.PlayerNotFoundException: Player can't be found in stats: Tramoni Matteo
at org.blondin.mpg.stats.model.Championship.getPlayer(Championship.java:57)
at org.blondin.mpg.Main.calculateEfficiency(Main.java:338)
at org.blondin.mpg.Main.processGames(Main.java:150)
at org.blondin.mpg.Main.processLeague(Main.java:90)
at org.blondin.mpg.Main.process(Main.java:68)
at org.blondin.mpg.Main.main(Main.java:59)
come back of #35 ?
See :
Domino's Ligue 2 will be available on MPG. Support should be checked.
It would be useful to have proxy support in the properties
The best would be to relay the properties to the JVM (although I don't know how to do so)
At build:
[ERROR] OS=Windows and the assembly descriptor contains a *nix-specific root-relative-reference (starting with slash) /
Due to
mpg-coach-bot/src/assembly/src.xml
Line 15 in 6157ce6
Describe the bug
Exception in thread "main" javax.ws.rs.ProcessingException: Error reading entity from input stream.
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:865)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:784)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:297)
at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.java:91)
at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
at org.glassfish.jersey.internal.Errors.process(Errors.java:205)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:365)
at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:240)
at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:88)
at org.blondin.mpg.AbstractClient.call(AbstractClient.java:131)
at org.blondin.mpg.AbstractClient.get(AbstractClient.java:69)
at org.blondin.mpg.root.MpgClient.getDashboard(MpgClient.java:70)
at org.blondin.mpg.Main.process(Main.java:63)
at org.blondin.mpg.Main.main(Main.java:59)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of org.blondin.mpg.root.model.ChampionshipType
, problem: Championship type not supported: 5
at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 221] (through reference chain: org.blondin.mpg.root.model.Dashboard["leagues"]->java.util.ArrayList[0]->org.blondin.mpg.root.model.League["championship"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1608)
at com.fasterxml.jackson.databind.DeserializationContext.handleInstantiationProblem(DeserializationContext.java:1073)
at com.fasterxml.jackson.databind.deser.std.FactoryBasedEnumDeserializer.deserialize(FactoryBasedEnumDeserializer.java:146)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectReader._unwrapAndDeserialize(ObjectReader.java:1703)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1571)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:965)
at org.glassfish.jersey.jackson.internal.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:838)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:233)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:212)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:132)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1071)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:850)
... 14 more
Caused by: java.lang.UnsupportedOperationException: Championship type not supported: 5
at org.blondin.mpg.root.model.ChampionshipType.getNameByValue(ChampionshipType.java:23)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.fasterxml.jackson.databind.introspect.AnnotatedMethod.callOnWith(AnnotatedMethod.java:122)
at com.fasterxml.jackson.databind.deser.std.FactoryBasedEnumDeserializer.deserialize(FactoryBasedEnumDeserializer.java:138)
... 32 more
Join debug files
Depending your championship, join data files set in attachment.
GET /user/dashboard
GET /league/[yourLeagueId]/coach
GET /league/[yourLeagueId]/transfer/buy
The Players statistics time update datas : https://www.mpgstats.fr/json/leagues.json
The Injury / Suspended data, one full HTML from:
Expected behavior
A clear and concise description of what you expected to happen.
If problem on update team feature, please join the Request and Response (visible via F12 in your browser) of POST /league/[yourLeagueId]/coach
when you save your team in MPG.
Could be retrieved from (and/or ... better if json api available):
Describe the bug
Exception in thread "main" java.lang.UnsupportedOperationException: Unsupported status code: 403 Forbidden / Content: {"success":false,"error":"goodTry","code":839}
at org.blondin.mpg.AbstractClient.call(AbstractClient.java:124)
at org.blondin.mpg.AbstractClient.post(AbstractClient.java:85)
at org.blondin.mpg.AbstractClient.post(AbstractClient.java:81)
at org.blondin.mpg.root.MpgClient.updateCoach(MpgClient.java:95)
at org.blondin.mpg.Main.updateTeamWithRetry(Main.java:190)
at org.blondin.mpg.Main.processGames(Main.java:166)
at org.blondin.mpg.Main.processLeague(Main.java:90)
at org.blondin.mpg.Main.process(Main.java:68)
at org.blondin.mpg.Main.main(Main.java:59)
Join debug files
Depending your championship, join data files set in attachment.
GET /user/dashboard
GET /league/[yourLeagueId]/coach
GET /league/[yourLeagueId]/transfer/buy
The Players statistics time update datas : https://www.mpgstats.fr/json/leagues.json
The Injury / Suspended data, one full HTML from:
Expected behavior
A clear and concise description of what you expected to happen.
If problem on update team feature, please join the Request and Response (visible via F12 in your browser) of POST /league/[yourLeagueId]/coach
when you save your team in MPG.
The recent focus efficiency (8 days by default : #44) has problem when season starts (e.g: current day < number of focused days).
The previous season days are used in this case (=> mainly 0 for L2 #76).
=> In this case, we should focus on real days of season (=> get the current day and do the substraction). Until focused days < current season day, the result should be the same as if focus efficiency option not used.
During Transactions proposal process (#13) :
Some warning could be displayed:
Transactions proposal ...
WARN: Player can't be found in statistics: XXX
It should be removed, this information is optional during this process.
#58 has a bug, with this loop:
If there are 10 bad request, the team can not be updated without errors:
Updating team ...
Retrying ...
Retrying ...
Retrying ...
Retrying ...
Retrying ...
Retrying ...
Retrying ...
Retrying ...
Retrying ...
Retrying ...
In this case an error should be throwed.
Stats available on https://www.mpgstats.fr/ & injuries & suspended on http://www.equipeactu.fr/blessures-et-suspensions/fodbold/ (#1) => possible
As complement of #13, injured players should be removed.
Transactions proposal are to improve the current team, buying some injured player is not really a good idea ..
When update is successful, the loop is not broken, so update done 10 times.
When some league are not implemented (sample: #112), bugs, conveniance, an include/exclude leagues in configuration could be a good feature.
Parameters: leagues.include
& leagues.exclude
; separated by comma.
Datas from https://www.mpgstats.fr/ or https://www.equipeactu.fr/blessures-et-suspensions could be cached in file:
=> Generic cache process should be implemented on AbstractClient.get method
MPG provides a new Champions League mode.
It should be supported
OSS License should be used, MIT is great.
And some items should be fixed about that:
mpg-coach-bot/bintray-descriptor.json
Line 11 in 6157ce6
Why not having options at run-time to tweak the efficiency algorithm :
Champions League will be supported one day (#112), but without dedicated part in thirt-part website (stats, ...), it can't be supported now.
But bot should not crash when users's leagues contain a Champions League
The SonarCloud analysis display shallow clone warning, due to 50 commit depth by default.
.travis.yaml
should remove this limitation:
git:
depth: false
When last round mercato is ending (you have validate the round, but but another player), fails with:
java.lang.UnsupportedOperationException: Unsupported status code: 403 Forbidden / Content: {"success":false,"error":"notGoodStatus","code":801}
at org.blondin.mpg.AbstractClient.call(AbstractClient.java:123)
at org.blondin.mpg.AbstractClient.get(AbstractClient.java:73)
at org.blondin.mpg.AbstractClient.get(AbstractClient.java:61)
at org.blondin.mpg.root.MpgClient.getMercato(MpgClient.java:80)
at org.blondin.mpg.Main.processMercatoLeague(Main.java:99)
at org.blondin.mpg.Main.processLeague(Main.java:88)
at org.blondin.mpg.Main.process(Main.java:69)
at org.blondin.mpg.Main.main(Main.java:60)
``
The update team process:
Could fail with Http 400 Bad Request. If retry it works => implement a retry mechanism (5s wait, max 10).
On branch 1.2-SNAPSHOT for #40, the coefficient is strange
MpgStats is:
MPG Datas for infos:
And calulation is:
Verratti scoring should be reviewed too ...
When the season is starting, all average note are 0 (ex : PL).
In this case, the average of last season should be used.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.