<span id="LC1" class="line" lang="csharp"><span class="k">using</span> <span class="nn">Microsoft.AspNetCore.Hosting</span><span class="p">;</span></span>
<span id="LC2" class="line" lang="csharp"><span class="k">using</span> <span class="nn">Microsoft.AspNetCore.Mvc</span><span class="p">;</span></span>
<span id="LC3" class="line" lang="csharp"><span class="k">using</span> <span class="nn">Microsoft.Extensions.Logging</span><span class="p">;</span></span>
<span id="LC4" class="line" lang="csharp"><span class="k">using</span> <span class="nn">Q1.Foundation.RepoLibs</span><span class="p">;</span></span>
<span id="LC5" class="line" lang="csharp"><span class="k">using</span> <span class="nn">Q1.LuckyCat.Cache</span><span class="p">;</span></span>
<span id="LC6" class="line" lang="csharp"><span class="k">using</span> <span class="nn">Q1.LuckyCat.Models.Enum</span><span class="p">;</span></span>
<span id="LC7" class="line" lang="csharp"><span class="k">using</span> <span class="nn">Q1.LuckyCat.Service.Attributes</span><span class="p">;</span></span>
<span id="LC8" class="line" lang="csharp"><span class="k">using</span> <span class="nn">Q1.LuckyCat.Service.Models</span><span class="p">;</span></span>
<span id="LC9" class="line" lang="csharp"><span class="k">using</span> <span class="nn">System</span><span class="p">;</span></span>
<span id="LC10" class="line" lang="csharp"><span class="k">using</span> <span class="nn">System.Drawing</span><span class="p">;</span></span>
<span id="LC11" class="line" lang="csharp"><span class="k">using</span> <span class="nn">System.Drawing.Imaging</span><span class="p">;</span></span>
<span id="LC12" class="line" lang="csharp"><span class="k">using</span> <span class="nn">System.IO</span><span class="p">;</span></span>
<span id="LC13" class="line" lang="csharp"><span class="k">using</span> <span class="nn">System.Linq</span><span class="p">;</span></span>
<span id="LC14" class="line" lang="csharp"><span class="k">using</span> <span class="nn">System.Runtime.InteropServices</span><span class="p">;</span></span>
<span id="LC15" class="line" lang="csharp"><span class="k">using</span> <span class="nn">System.Threading.Tasks</span><span class="p">;</span></span>
<span id="LC16" class="line" lang="csharp"><span class="k">using</span> <span class="nn">ZXing</span><span class="p">;</span></span>
<span id="LC17" class="line" lang="csharp"><span class="k">using</span> <span class="nn">ZXing.QrCode</span><span class="p">;</span></span>
<span id="LC18" class="line" lang="csharp"><span class="k">using</span> <span class="nn">DataEntity</span> <span class="p">=</span> <span class="n">Q1</span><span class="p">.</span><span class="n">LuckyCat</span><span class="p">.</span><span class="n">Models</span><span class="p">.</span><span class="n">DataEntity</span><span class="p">;</span></span>
<span id="LC19" class="line" lang="csharp"></span>
<span id="LC20" class="line" lang="csharp"><span class="k">namespace</span> <span class="nn">Q1.LuckyCat.Service.Controllers</span></span>
<span id="LC21" class="line" lang="csharp"><span class="p">{</span></span>
<span id="LC22" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC23" class="line" lang="csharp"> <span class="c1">/// 我的分享(冰川通行证认证)</span></span>
<span id="LC24" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC25" class="line" lang="csharp"> <span class="p">[</span><span class="nf">Route</span><span class="p">(</span><span class="s">"api/share"</span><span class="p">)]</span></span>
<span id="LC26" class="line" lang="csharp"> <span class="p">[</span><span class="n">ApiController</span><span class="p">]</span></span>
<span id="LC27" class="line" lang="csharp"> <span class="k">public</span> <span class="k">class</span> <span class="nc">ShareController</span> <span class="p">:</span> <span class="n">BaseController</span><span class="p"><</span><span class="n">ShareController</span><span class="p">></span></span>
<span id="LC28" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC29" class="line" lang="csharp"> <span class="k">private</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">MY_QRCODE_WIDTH</span> <span class="p">=</span> <span class="m">410</span><span class="p">;</span></span>
<span id="LC30" class="line" lang="csharp"> <span class="k">private</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">MY_QRCODE_HEIGHT</span> <span class="p">=</span> <span class="m">392</span><span class="p">;</span></span>
<span id="LC31" class="line" lang="csharp"> <span class="k">private</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">POSTER_QRCODE_POSX</span> <span class="p">=</span> <span class="m">132</span><span class="p">;</span></span>
<span id="LC32" class="line" lang="csharp"> <span class="k">private</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">POSTER_QRCODE_POSY</span> <span class="p">=</span> <span class="m">445</span><span class="p">;</span></span>
<span id="LC33" class="line" lang="csharp"> <span class="k">private</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">POSTER_QRCODE_WIDTH</span> <span class="p">=</span> <span class="m">490</span><span class="p">;</span></span>
<span id="LC34" class="line" lang="csharp"> <span class="k">private</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">POSTER_QRCODE_HEIGHT</span> <span class="p">=</span> <span class="m">475</span><span class="p">;</span></span>
<span id="LC35" class="line" lang="csharp"></span>
<span id="LC36" class="line" lang="csharp"> <span class="k">public</span> <span class="nf">ShareController</span><span class="p">(</span><span class="n">ICache</span> <span class="n">cache</span><span class="p">,</span> <span class="n">IMongoLib</span> <span class="n">database</span><span class="p">,</span> <span class="n">ILogger</span><span class="p"><</span><span class="n">ShareController</span><span class="p">></span> <span class="n">logger</span><span class="p">,</span> <span class="n">IHostingEnvironment</span> <span class="n">env</span><span class="p">)</span></span>
<span id="LC37" class="line" lang="csharp"> <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">cache</span><span class="p">,</span> <span class="n">database</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span></span>
<span id="LC38" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC39" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC40" class="line" lang="csharp"></span>
<span id="LC41" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC42" class="line" lang="csharp"> <span class="c1">/// 召回用户-访问分享链接下载游戏(匿名访问)</span></span>
<span id="LC43" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC44" class="line" lang="csharp"> <span class="c1">/// <param name="shareId"></param></span></span>
<span id="LC45" class="line" lang="csharp"> <span class="c1">/// <response code="200">返回游戏下载包地址</response></span></span>
<span id="LC46" class="line" lang="csharp"> <span class="p">[</span><span class="nf">HttpGet</span><span class="p">(</span><span class="s">"{shareId}/olduser"</span><span class="p">)]</span></span>
<span id="LC47" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="m">200</span><span class="p">)]</span></span>
<span id="LC48" class="line" lang="csharp"> <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="n">IActionResult</span><span class="p">></span> <span class="nf">OldUserDownload</span><span class="p">([</span><span class="n">FromRoute</span><span class="p">]</span><span class="n">Guid</span> <span class="n">shareId</span><span class="p">)</span></span>
<span id="LC49" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC50" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">share</span> <span class="p">=</span> <span class="p">(</span><span class="k">await</span> <span class="n">_db</span><span class="p">.</span><span class="n">Get</span><span class="p"><</span><span class="n">DataEntity</span><span class="p">.</span><span class="n">UserShare</span><span class="p">>(</span><span class="n">s</span> <span class="p">=></span> <span class="n">s</span><span class="p">.</span><span class="n">Id</span> <span class="p">==</span> <span class="n">shareId</span><span class="p">)).</span><span class="nf">SingleOrDefault</span><span class="p">();</span></span>
<span id="LC51" class="line" lang="csharp"> <span class="k">if</span> <span class="p">(</span><span class="n">share</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="k">return</span> <span class="nf">Q1NotFound</span><span class="p">(</span><span class="s">"分享链接不存在"</span><span class="p">);</span></span>
<span id="LC52" class="line" lang="csharp"></span>
<span id="LC53" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">gameSetting</span> <span class="p">=</span> <span class="n">Settings</span><span class="p">.</span><span class="n">GameSettings</span><span class="p">.</span><span class="nf">Where</span><span class="p">(</span><span class="n">g</span> <span class="p">=></span> <span class="n">g</span><span class="p">.</span><span class="n">Id</span> <span class="p">==</span> <span class="n">share</span><span class="p">.</span><span class="n">GameId</span><span class="p">).</span><span class="nf">SingleOrDefault</span><span class="p">();</span></span>
<span id="LC54" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">gameDownloadUrl</span> <span class="p">=</span> <span class="n">gameSetting</span> <span class="p">!=</span> <span class="k">null</span> <span class="p">?</span> <span class="n">gameSetting</span><span class="p">.</span><span class="n">OldUserDownloadUrl</span> <span class="p">:</span> <span class="s">"https://www.q1.com/"</span><span class="p">;</span></span>
<span id="LC55" class="line" lang="csharp"></span>
<span id="LC56" class="line" lang="csharp"> <span class="k">return</span> <span class="nf">Q1Ok</span><span class="p">(</span><span class="n">gameDownloadUrl</span><span class="p">);</span></span>
<span id="LC57" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC58" class="line" lang="csharp"></span>
<span id="LC59" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC60" class="line" lang="csharp"> <span class="c1">/// 新用户-访问分享链接下载游戏(匿名访问)</span></span>
<span id="LC61" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC62" class="line" lang="csharp"> <span class="c1">/// <param name="shareId"></param></span></span>
<span id="LC63" class="line" lang="csharp"> <span class="c1">/// <response code="200">返回游戏下载包地址</response></span></span>
<span id="LC64" class="line" lang="csharp"> <span class="p">[</span><span class="nf">HttpGet</span><span class="p">(</span><span class="s">"{shareId}/newuser"</span><span class="p">)]</span></span>
<span id="LC65" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="m">200</span><span class="p">)]</span></span>
<span id="LC66" class="line" lang="csharp"> <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="n">IActionResult</span><span class="p">></span> <span class="nf">NewUserDownload</span><span class="p">([</span><span class="n">FromRoute</span><span class="p">]</span><span class="n">Guid</span> <span class="n">shareId</span><span class="p">)</span></span>
<span id="LC67" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC68" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">share</span> <span class="p">=</span> <span class="p">(</span><span class="k">await</span> <span class="n">_db</span><span class="p">.</span><span class="n">Get</span><span class="p"><</span><span class="n">DataEntity</span><span class="p">.</span><span class="n">UserShare</span><span class="p">>(</span><span class="n">s</span> <span class="p">=></span> <span class="n">s</span><span class="p">.</span><span class="n">Id</span> <span class="p">==</span> <span class="n">shareId</span><span class="p">)).</span><span class="nf">SingleOrDefault</span><span class="p">();</span></span>
<span id="LC69" class="line" lang="csharp"> <span class="k">if</span> <span class="p">(</span><span class="n">share</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="k">return</span> <span class="nf">Q1NotFound</span><span class="p">(</span><span class="s">"分享链接不存在"</span><span class="p">);</span></span>
<span id="LC70" class="line" lang="csharp"></span>
<span id="LC71" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">gameSetting</span> <span class="p">=</span> <span class="n">Settings</span><span class="p">.</span><span class="n">GameSettings</span><span class="p">.</span><span class="nf">Where</span><span class="p">(</span><span class="n">g</span> <span class="p">=></span> <span class="n">g</span><span class="p">.</span><span class="n">Id</span> <span class="p">==</span> <span class="n">share</span><span class="p">.</span><span class="n">GameId</span><span class="p">).</span><span class="nf">SingleOrDefault</span><span class="p">();</span></span>
<span id="LC72" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">gameDownloadUrl</span> <span class="p">=</span> <span class="n">gameSetting</span> <span class="p">!=</span> <span class="k">null</span> <span class="p">?</span> <span class="n">gameSetting</span><span class="p">.</span><span class="n">NewUserDownloadUrl</span> <span class="p">:</span> <span class="s">"https://www.q1.com/"</span><span class="p">;</span></span>
<span id="LC73" class="line" lang="csharp"></span>
<span id="LC74" class="line" lang="csharp"> <span class="k">return</span> <span class="nf">Q1Ok</span><span class="p">(</span><span class="n">gameDownloadUrl</span><span class="p">);</span></span>
<span id="LC75" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC76" class="line" lang="csharp"></span>
<span id="LC77" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC78" class="line" lang="csharp"> <span class="c1">/// 生成当前用户的游戏邀请二维码</span></span>
<span id="LC79" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC80" class="line" lang="csharp"> <span class="c1">/// <response code="200">Content-Type: image/png, 返回用户二维码图片</response></span></span>
<span id="LC81" class="line" lang="csharp"> <span class="c1">/// <response code="403">拒绝访问 - 未绑定手机号或未初始化首页</response></span></span>
<span id="LC82" class="line" lang="csharp"> <span class="p">[</span><span class="nf">HttpGet</span><span class="p">(</span><span class="s">"qrcode"</span><span class="p">)]</span></span>
<span id="LC83" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="m">200</span><span class="p">)]</span></span>
<span id="LC84" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Q1Response</span><span class="p"><</span><span class="kt">string</span><span class="p">>),</span> <span class="m">403</span><span class="p">)]</span></span>
<span id="LC85" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">ClientContextValidationAttribute</span><span class="p">))]</span></span>
<span id="LC86" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">HomeAccessValidateAttribute</span><span class="p">))]</span></span>
<span id="LC87" class="line" lang="csharp"> <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="n">IActionResult</span><span class="p">></span> <span class="nf">GetMyQRCode</span><span class="p">()</span></span>
<span id="LC88" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC89" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">client</span> <span class="p">=</span> <span class="n">ClientContext</span><span class="p">;</span></span>
<span id="LC90" class="line" lang="csharp"></span>
<span id="LC91" class="line" lang="csharp"> <span class="kt">string</span> <span class="n">content</span> <span class="p">=</span> <span class="k">await</span> <span class="nf">GetQRContent</span><span class="p">(</span><span class="n">client</span><span class="p">.</span><span class="n">GameId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">ServerId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">UserId</span><span class="p">,</span> <span class="n">ActivityPosterType</span><span class="p">.</span><span class="n">Invitation</span><span class="p">);</span></span>
<span id="LC92" class="line" lang="csharp"> <span class="kt">string</span> <span class="n">qrcode</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span></span>
<span id="LC93" class="line" lang="csharp"></span>
<span id="LC94" class="line" lang="csharp"> <span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">stream</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">MemoryStream</span><span class="p">())</span></span>
<span id="LC95" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC96" class="line" lang="csharp"> <span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">qrImage</span> <span class="p">=</span> <span class="nf">GenerateQRCode</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">MY_QRCODE_WIDTH</span><span class="p">,</span> <span class="n">MY_QRCODE_HEIGHT</span><span class="p">))</span></span>
<span id="LC97" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC98" class="line" lang="csharp"> <span class="n">qrImage</span><span class="p">.</span><span class="nf">Save</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="n">ImageFormat</span><span class="p">.</span><span class="n">Png</span><span class="p">);</span></span>
<span id="LC99" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC100" class="line" lang="csharp"></span>
<span id="LC101" class="line" lang="csharp"> <span class="n">qrcode</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="nf">ToBase64String</span><span class="p">(</span><span class="n">stream</span><span class="p">.</span><span class="nf">ToArray</span><span class="p">());</span></span>
<span id="LC102" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC103" class="line" lang="csharp"></span>
<span id="LC104" class="line" lang="csharp"> <span class="k">return</span> <span class="nf">Q1Ok</span><span class="p">(</span><span class="n">qrcode</span><span class="p">);</span></span>
<span id="LC105" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC106" class="line" lang="csharp"></span>
<span id="LC107" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC108" class="line" lang="csharp"> <span class="c1">/// 生成当前用户的游戏邀请二维码海报</span></span>
<span id="LC109" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC110" class="line" lang="csharp"> <span class="c1">/// <response code="200">response.body属性返回Base64格式的海报图片</response></span></span>
<span id="LC111" class="line" lang="csharp"> <span class="c1">/// <response code="403">拒绝访问 - 未绑定手机号或未初始化首页</response></span></span>
<span id="LC112" class="line" lang="csharp"> <span class="p">[</span><span class="nf">HttpGet</span><span class="p">(</span><span class="s">"invite"</span><span class="p">)]</span></span>
<span id="LC113" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Q1Response</span><span class="p"><</span><span class="kt">string</span><span class="p">>),</span> <span class="m">200</span><span class="p">)]</span></span>
<span id="LC114" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Q1Response</span><span class="p"><</span><span class="kt">string</span><span class="p">>),</span> <span class="m">403</span><span class="p">)]</span></span>
<span id="LC115" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">ClientContextValidationAttribute</span><span class="p">))]</span></span>
<span id="LC116" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">HomeAccessValidateAttribute</span><span class="p">))]</span></span>
<span id="LC117" class="line" lang="csharp"> <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="n">IActionResult</span><span class="p">></span> <span class="nf">GetInvitePoster</span><span class="p">()</span></span>
<span id="LC118" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC119" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">client</span> <span class="p">=</span> <span class="n">ClientContext</span><span class="p">;</span></span>
<span id="LC120" class="line" lang="csharp"></span>
<span id="LC121" class="line" lang="csharp"> <span class="k">return</span> <span class="k">await</span> <span class="nf">GetPosterQRCode</span><span class="p">(</span><span class="n">client</span><span class="p">.</span><span class="n">GameId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">ServerId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">UserId</span><span class="p">,</span> <span class="n">ActivityPosterType</span><span class="p">.</span><span class="n">Invitation</span><span class="p">);</span></span>
<span id="LC122" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC123" class="line" lang="csharp"></span>
<span id="LC124" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC125" class="line" lang="csharp"> <span class="c1">/// 生成当前用户的好友提醒二维码海报</span></span>
<span id="LC126" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC127" class="line" lang="csharp"> <span class="c1">/// <response code="200">response.body属性返回Base64格式的海报图片</response></span></span>
<span id="LC128" class="line" lang="csharp"> <span class="c1">/// <response code="403">拒绝访问 - 未绑定手机号或未初始化首页</response></span></span>
<span id="LC129" class="line" lang="csharp"> <span class="p">[</span><span class="nf">HttpGet</span><span class="p">(</span><span class="s">"reminder"</span><span class="p">)]</span></span>
<span id="LC130" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Q1Response</span><span class="p"><</span><span class="kt">string</span><span class="p">>),</span> <span class="m">200</span><span class="p">)]</span></span>
<span id="LC131" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Q1Response</span><span class="p"><</span><span class="kt">string</span><span class="p">>),</span> <span class="m">403</span><span class="p">)]</span></span>
<span id="LC132" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">ClientContextValidationAttribute</span><span class="p">))]</span></span>
<span id="LC133" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">HomeAccessValidateAttribute</span><span class="p">))]</span></span>
<span id="LC134" class="line" lang="csharp"> <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="n">IActionResult</span><span class="p">></span> <span class="nf">GetReminderPoster</span><span class="p">()</span></span>
<span id="LC135" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC136" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">client</span> <span class="p">=</span> <span class="n">ClientContext</span><span class="p">;</span></span>
<span id="LC137" class="line" lang="csharp"></span>
<span id="LC138" class="line" lang="csharp"> <span class="k">return</span> <span class="k">await</span> <span class="nf">GetPosterQRCode</span><span class="p">(</span><span class="n">client</span><span class="p">.</span><span class="n">GameId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">ServerId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">UserId</span><span class="p">,</span> <span class="n">ActivityPosterType</span><span class="p">.</span><span class="n">Reminder</span><span class="p">);</span></span>
<span id="LC139" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC140" class="line" lang="csharp"></span>
<span id="LC141" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC142" class="line" lang="csharp"> <span class="c1">/// 生成当前用户的好友唤醒二维码海报</span></span>
<span id="LC143" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC144" class="line" lang="csharp"> <span class="c1">/// <response code="200">response.body属性返回Base64格式的海报图片</response></span></span>
<span id="LC145" class="line" lang="csharp"> <span class="c1">/// <response code="403">拒绝访问 - 未绑定手机号或未初始化首页</response></span></span>
<span id="LC146" class="line" lang="csharp"> <span class="p">[</span><span class="nf">HttpGet</span><span class="p">(</span><span class="s">"awaken"</span><span class="p">)]</span></span>
<span id="LC147" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Q1Response</span><span class="p"><</span><span class="kt">string</span><span class="p">>),</span> <span class="m">200</span><span class="p">)]</span></span>
<span id="LC148" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Q1Response</span><span class="p"><</span><span class="kt">string</span><span class="p">>),</span> <span class="m">403</span><span class="p">)]</span></span>
<span id="LC149" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">ClientContextValidationAttribute</span><span class="p">))]</span></span>
<span id="LC150" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">HomeAccessValidateAttribute</span><span class="p">))]</span></span>
<span id="LC151" class="line" lang="csharp"> <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="n">IActionResult</span><span class="p">></span> <span class="nf">GetAwakenPoster</span><span class="p">()</span></span>
<span id="LC152" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC153" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">client</span> <span class="p">=</span> <span class="n">ClientContext</span><span class="p">;</span></span>
<span id="LC154" class="line" lang="csharp"></span>
<span id="LC155" class="line" lang="csharp"> <span class="k">return</span> <span class="k">await</span> <span class="nf">GetPosterQRCode</span><span class="p">(</span><span class="n">client</span><span class="p">.</span><span class="n">GameId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">ServerId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">UserId</span><span class="p">,</span> <span class="n">ActivityPosterType</span><span class="p">.</span><span class="n">Awaken</span><span class="p">);</span></span>
<span id="LC156" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC157" class="line" lang="csharp"></span>
<span id="LC158" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC159" class="line" lang="csharp"> <span class="c1">/// 生成当前用户的晒收入二维码海报</span></span>
<span id="LC160" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC161" class="line" lang="csharp"> <span class="c1">/// <response code="200">response.body属性返回Base64格式的海报图片</response></span></span>
<span id="LC162" class="line" lang="csharp"> <span class="c1">/// <response code="403">拒绝访问 - 未绑定手机号或未初始化首页</response></span></span>
<span id="LC163" class="line" lang="csharp"> <span class="p">[</span><span class="nf">HttpGet</span><span class="p">(</span><span class="s">"showincome"</span><span class="p">)]</span></span>
<span id="LC164" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Q1Response</span><span class="p"><</span><span class="kt">string</span><span class="p">>),</span> <span class="m">200</span><span class="p">)]</span></span>
<span id="LC165" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ProducesResponseType</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Q1Response</span><span class="p"><</span><span class="kt">string</span><span class="p">>),</span> <span class="m">403</span><span class="p">)]</span></span>
<span id="LC166" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">ClientContextValidationAttribute</span><span class="p">))]</span></span>
<span id="LC167" class="line" lang="csharp"> <span class="p">[</span><span class="nf">ServiceFilter</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">HomeAccessValidateAttribute</span><span class="p">))]</span></span>
<span id="LC168" class="line" lang="csharp"> <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="n">IActionResult</span><span class="p">></span> <span class="nf">GetShowIncomePoster</span><span class="p">()</span></span>
<span id="LC169" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC170" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">client</span> <span class="p">=</span> <span class="n">ClientContext</span><span class="p">;</span></span>
<span id="LC171" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="k">await</span> <span class="nf">GetPosterQRCode</span><span class="p">(</span><span class="n">client</span><span class="p">.</span><span class="n">GameId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">ServerId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">UserId</span><span class="p">,</span> <span class="n">ActivityPosterType</span><span class="p">.</span><span class="n">ShowIncome</span><span class="p">);</span></span>
<span id="LC172" class="line" lang="csharp"></span>
<span id="LC173" class="line" lang="csharp"> <span class="k">try</span></span>
<span id="LC174" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC175" class="line" lang="csharp"> <span class="kt">bool</span> <span class="n">inWithdrawOnlyStage</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span></span>
<span id="LC176" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">activity</span> <span class="p">=</span> <span class="nf">GetCurrentActivity</span><span class="p">(</span><span class="n">client</span><span class="p">.</span><span class="n">GameId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">ServerId</span><span class="p">,</span> <span class="k">out</span> <span class="n">inWithdrawOnlyStage</span><span class="p">);</span></span>
<span id="LC177" class="line" lang="csharp"> <span class="k">if</span> <span class="p">(</span><span class="n">activity</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nf">Exception</span><span class="p">(</span><span class="s">"活动暂未开始"</span><span class="p">);</span></span>
<span id="LC178" class="line" lang="csharp"></span>
<span id="LC179" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">userProfile</span> <span class="p">=</span> <span class="k">await</span> <span class="nf">GetUserProfile</span><span class="p">(</span><span class="n">client</span><span class="p">.</span><span class="n">GameId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">UserId</span><span class="p">);</span></span>
<span id="LC180" class="line" lang="csharp"></span>
<span id="LC181" class="line" lang="csharp"> <span class="k">if</span> <span class="p">(!</span><span class="n">inWithdrawOnlyStage</span><span class="p">)</span></span>
<span id="LC182" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC183" class="line" lang="csharp"> <span class="c1">//用户已完成的所有晒收入任务</span></span>
<span id="LC184" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">completedShowIncomeTasks</span> <span class="p">=</span> <span class="k">await</span> <span class="n">_db</span><span class="p">.</span><span class="n">Get</span><span class="p"><</span><span class="n">DataEntity</span><span class="p">.</span><span class="n">TaskRecord</span><span class="p">>(</span><span class="n">r</span></span>
<span id="LC185" class="line" lang="csharp"> <span class="p">=></span> <span class="n">r</span><span class="p">.</span><span class="n">Valid</span></span>
<span id="LC186" class="line" lang="csharp"> <span class="p">&&</span> <span class="n">r</span><span class="p">.</span><span class="n">GameId</span> <span class="p">==</span> <span class="n">client</span><span class="p">.</span><span class="n">GameId</span></span>
<span id="LC187" class="line" lang="csharp"> <span class="p">&&</span> <span class="n">r</span><span class="p">.</span><span class="n">UserId</span> <span class="p">==</span> <span class="n">client</span><span class="p">.</span><span class="n">UserId</span></span>
<span id="LC188" class="line" lang="csharp"> <span class="p">&&</span> <span class="n">r</span><span class="p">.</span><span class="n">ActivityId</span> <span class="p">==</span> <span class="n">activity</span><span class="p">.</span><span class="n">Id</span></span>
<span id="LC189" class="line" lang="csharp"> <span class="p">&&</span> <span class="n">r</span><span class="p">.</span><span class="n">TaskId</span> <span class="p">==</span> <span class="n">Tasks</span><span class="p">.</span><span class="n">P004_ShowIncome</span></span>
<span id="LC190" class="line" lang="csharp"> <span class="p">&&</span> <span class="n">r</span><span class="p">.</span><span class="n">TaskType</span> <span class="p">==</span> <span class="n">TaskType</span><span class="p">.</span><span class="n">Platform</span><span class="p">);</span></span>
<span id="LC191" class="line" lang="csharp"></span>
<span id="LC192" class="line" lang="csharp"> <span class="c1">//用户当日已完成的晒收入任务</span></span>
<span id="LC193" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">todayCompletedShowIncomeTasks</span> <span class="p">=</span> <span class="n">completedShowIncomeTasks</span><span class="p">.</span><span class="nf">Where</span><span class="p">(</span><span class="n">r</span> <span class="p">=></span> <span class="nf">IsTheSameDayInEast8</span><span class="p">(</span><span class="n">r</span><span class="p">.</span><span class="n">CompleteTime</span><span class="p">.</span><span class="nf">ToUniversalTime</span><span class="p">(),</span> <span class="n">DateTime</span><span class="p">.</span><span class="n">UtcNow</span><span class="p">));</span></span>
<span id="LC194" class="line" lang="csharp"></span>
<span id="LC195" class="line" lang="csharp"> <span class="k">if</span> <span class="p">(!</span><span class="n">todayCompletedShowIncomeTasks</span><span class="p">.</span><span class="nf">Any</span><span class="p">())</span></span>
<span id="LC196" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC197" class="line" lang="csharp"> <span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">mongoSession</span> <span class="p">=</span> <span class="n">_db</span><span class="p">.</span><span class="nf">StartSession</span><span class="p">())</span></span>
<span id="LC198" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC199" class="line" lang="csharp"> <span class="k">try</span></span>
<span id="LC200" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC201" class="line" lang="csharp"> <span class="nf">RunTransactionWithRetry</span><span class="p">((</span><span class="n">session</span><span class="p">,</span> <span class="n">logger</span><span class="p">)</span> <span class="p">=></span></span>
<span id="LC202" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC203" class="line" lang="csharp"> <span class="c1">// 确保Transaction Retry幂等</span></span>
<span id="LC204" class="line" lang="csharp"></span>
<span id="LC205" class="line" lang="csharp"> <span class="n">session</span><span class="p">.</span><span class="nf">StartTransaction</span><span class="p">(</span><span class="n">MongoDB_TransactionOptions</span><span class="p">);</span></span>
<span id="LC206" class="line" lang="csharp"></span>
<span id="LC207" class="line" lang="csharp"> <span class="nf">TriggerTemplateTask</span><span class="p">(</span><span class="n">activity</span><span class="p">,</span> <span class="n">Tasks</span><span class="p">.</span><span class="n">P004_ShowIncome</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">UserId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">GameId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">ServerId</span><span class="p">,</span> <span class="n">client</span><span class="p">.</span><span class="n">RoleId</span><span class="p">,</span> <span class="k">true</span><span class="p">,</span> <span class="n">session</span><span class="p">).</span><span class="nf">Wait</span><span class="p">();</span></span>
<span id="LC208" class="line" lang="csharp"></span>
<span id="LC209" class="line" lang="csharp"> <span class="nf">CommitTransactionWithRetry</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">logger</span><span class="p">);</span></span>
<span id="LC210" class="line" lang="csharp"> <span class="p">},</span> <span class="n">mongoSession</span><span class="p">,</span> <span class="n">_logger</span><span class="p">);</span></span>
<span id="LC211" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC212" class="line" lang="csharp"> <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span></span>
<span id="LC213" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC214" class="line" lang="csharp"> <span class="n">mongoSession</span><span class="p">.</span><span class="nf">AbortTransaction</span><span class="p">();</span></span>
<span id="LC215" class="line" lang="csharp"> <span class="n">_logger</span><span class="p">.</span><span class="nf">LogError</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s">"晒收入收益失败"</span><span class="p">);</span></span>
<span id="LC216" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC217" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC218" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC219" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC220" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC221" class="line" lang="csharp"> <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span></span>
<span id="LC222" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC223" class="line" lang="csharp"> <span class="n">_logger</span><span class="p">.</span><span class="nf">LogError</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s">"触发晒收入任务失败"</span><span class="p">);</span></span>
<span id="LC224" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC225" class="line" lang="csharp"></span>
<span id="LC226" class="line" lang="csharp"> <span class="k">return</span> <span class="n">result</span><span class="p">;</span></span>
<span id="LC227" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC228" class="line" lang="csharp"></span>
<span id="LC229" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC230" class="line" lang="csharp"> <span class="c1">/// 生成二维码海报</span></span>
<span id="LC231" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC232" class="line" lang="csharp"> <span class="c1">/// <param name="gameId">游戏ID</param></span></span>
<span id="LC233" class="line" lang="csharp"> <span class="c1">/// <param name="serverId">区服ID</param></span></span>
<span id="LC234" class="line" lang="csharp"> <span class="c1">/// <param name="userId">冰川账户ID</param></span></span>
<span id="LC235" class="line" lang="csharp"> <span class="c1">/// <param name="type">类别 1 - 邀请海报, 2 - 提醒海报, 3 - 唤醒海报</param></span></span>
<span id="LC236" class="line" lang="csharp"> <span class="c1">/// <returns></returns></span></span>
<span id="LC237" class="line" lang="csharp"> <span class="k">private</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="n">IActionResult</span><span class="p">></span> <span class="nf">GetPosterQRCode</span><span class="p">(</span><span class="kt">int</span> <span class="n">gameId</span><span class="p">,</span> <span class="kt">int</span> <span class="n">serverId</span><span class="p">,</span> <span class="kt">int</span> <span class="n">userId</span><span class="p">,</span> <span class="n">ActivityPosterType</span> <span class="n">type</span><span class="p">)</span></span>
<span id="LC238" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC239" class="line" lang="csharp"> <span class="c1">// 只要是提现周期内都可以生成海报</span></span>
<span id="LC240" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">activity</span> <span class="p">=</span> <span class="k">await</span> <span class="nf">GetCurrentWithdrawableActivity</span><span class="p">(</span><span class="n">gameId</span><span class="p">,</span> <span class="n">serverId</span><span class="p">);</span></span>
<span id="LC241" class="line" lang="csharp"> <span class="k">if</span> <span class="p">(</span><span class="n">activity</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="k">return</span> <span class="nf">Q1BadRequest</span><span class="p">(</span><span class="s">"活动暂未开始"</span><span class="p">);</span></span>
<span id="LC242" class="line" lang="csharp"></span>
<span id="LC243" class="line" lang="csharp"> <span class="kt">string</span> <span class="n">content</span> <span class="p">=</span> <span class="k">await</span> <span class="nf">GetQRContent</span><span class="p">(</span><span class="n">gameId</span><span class="p">,</span> <span class="n">serverId</span><span class="p">,</span> <span class="n">userId</span><span class="p">,</span> <span class="n">type</span><span class="p">);</span></span>
<span id="LC244" class="line" lang="csharp"> <span class="kt">string</span> <span class="n">poster</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span></span>
<span id="LC245" class="line" lang="csharp"></span>
<span id="LC246" class="line" lang="csharp"> <span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">stream</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">MemoryStream</span><span class="p">())</span></span>
<span id="LC247" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC248" class="line" lang="csharp"> <span class="kt">byte</span><span class="p">[]</span> <span class="n">posterImage</span> <span class="p">=</span> <span class="k">await</span> <span class="nf">GetPosterImage</span><span class="p">(</span><span class="n">activity</span><span class="p">.</span><span class="n">Id</span><span class="p">,</span> <span class="n">type</span><span class="p">);</span></span>
<span id="LC249" class="line" lang="csharp"></span>
<span id="LC250" class="line" lang="csharp"> <span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">posterStream</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">MemoryStream</span><span class="p">(</span><span class="n">posterImage</span><span class="p">))</span></span>
<span id="LC251" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC252" class="line" lang="csharp"> <span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">bgImage</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Bitmap</span><span class="p">(</span><span class="n">posterStream</span><span class="p">))</span></span>
<span id="LC253" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC254" class="line" lang="csharp"> <span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">qrImage</span> <span class="p">=</span> <span class="nf">GenerateQRCode</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">POSTER_QRCODE_WIDTH</span><span class="p">,</span> <span class="n">POSTER_QRCODE_HEIGHT</span><span class="p">))</span></span>
<span id="LC255" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC256" class="line" lang="csharp"> <span class="k">using</span> <span class="p">(</span><span class="n">Graphics</span> <span class="n">graph</span> <span class="p">=</span> <span class="n">Graphics</span><span class="p">.</span><span class="nf">FromImage</span><span class="p">(</span><span class="n">bgImage</span><span class="p">))</span></span>
<span id="LC257" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC258" class="line" lang="csharp"> <span class="n">graph</span><span class="p">.</span><span class="nf">DrawImage</span><span class="p">(</span></span>
<span id="LC259" class="line" lang="csharp"> <span class="n">qrImage</span><span class="p">,</span></span>
<span id="LC260" class="line" lang="csharp"> <span class="n">POSTER_QRCODE_POSX</span><span class="p">,</span></span>
<span id="LC261" class="line" lang="csharp"> <span class="n">POSTER_QRCODE_POSY</span><span class="p">,</span></span>
<span id="LC262" class="line" lang="csharp"> <span class="n">qrImage</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span></span>
<span id="LC263" class="line" lang="csharp"> <span class="n">qrImage</span><span class="p">.</span><span class="n">Height</span><span class="p">);</span></span>
<span id="LC264" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC265" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC266" class="line" lang="csharp"></span>
<span id="LC267" class="line" lang="csharp"> <span class="n">bgImage</span><span class="p">.</span><span class="nf">Save</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="n">ImageFormat</span><span class="p">.</span><span class="n">Png</span><span class="p">);</span></span>
<span id="LC268" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC269" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC270" class="line" lang="csharp"></span>
<span id="LC271" class="line" lang="csharp"> <span class="n">poster</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="nf">ToBase64String</span><span class="p">(</span><span class="n">stream</span><span class="p">.</span><span class="nf">ToArray</span><span class="p">());</span></span>
<span id="LC272" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC273" class="line" lang="csharp"></span>
<span id="LC274" class="line" lang="csharp"> <span class="k">return</span> <span class="nf">Q1Ok</span><span class="p">(</span><span class="n">poster</span><span class="p">);</span></span>
<span id="LC275" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC276" class="line" lang="csharp"></span>
<span id="LC277" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC278" class="line" lang="csharp"> <span class="c1">/// 生成二维码内容链接</span></span>
<span id="LC279" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC280" class="line" lang="csharp"> <span class="c1">/// <param name="gameId">游戏ID</param></span></span>
<span id="LC281" class="line" lang="csharp"> <span class="c1">/// <param name="serverId">区服ID</param></span></span>
<span id="LC282" class="line" lang="csharp"> <span class="c1">/// <param name="userId">冰川账户ID</param></span></span>
<span id="LC283" class="line" lang="csharp"> <span class="c1">/// <param name="type">类别 1 - 邀请链接, 2 - 回归链接</param></span></span>
<span id="LC284" class="line" lang="csharp"> <span class="c1">/// <returns></returns></span></span>
<span id="LC285" class="line" lang="csharp"> <span class="k">private</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="kt">string</span><span class="p">></span> <span class="nf">GetQRContent</span><span class="p">(</span><span class="kt">int</span> <span class="n">gameId</span><span class="p">,</span> <span class="kt">int</span> <span class="n">serverId</span><span class="p">,</span> <span class="kt">int</span> <span class="n">userId</span><span class="p">,</span> <span class="n">ActivityPosterType</span> <span class="n">type</span><span class="p">)</span></span>
<span id="LC286" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC287" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">share</span> <span class="p">=</span> <span class="p">(</span><span class="k">await</span> <span class="n">_db</span><span class="p">.</span><span class="n">Get</span><span class="p"><</span><span class="n">DataEntity</span><span class="p">.</span><span class="n">UserShare</span><span class="p">>(</span><span class="n">q</span></span>
<span id="LC288" class="line" lang="csharp"> <span class="p">=></span> <span class="n">q</span><span class="p">.</span><span class="n">UserId</span> <span class="p">==</span> <span class="n">userId</span></span>
<span id="LC289" class="line" lang="csharp"> <span class="p">&&</span> <span class="n">q</span><span class="p">.</span><span class="n">GameId</span> <span class="p">==</span> <span class="n">gameId</span><span class="p">)).</span><span class="nf">FirstOrDefault</span><span class="p">();</span></span>
<span id="LC290" class="line" lang="csharp"></span>
<span id="LC291" class="line" lang="csharp"> <span class="n">Guid</span> <span class="n">shareId</span><span class="p">;</span></span>
<span id="LC292" class="line" lang="csharp"></span>
<span id="LC293" class="line" lang="csharp"> <span class="k">if</span> <span class="p">(</span><span class="n">share</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span></span>
<span id="LC294" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC295" class="line" lang="csharp"> <span class="n">shareId</span> <span class="p">=</span> <span class="n">share</span><span class="p">.</span><span class="n">Id</span><span class="p">;</span></span>
<span id="LC296" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC297" class="line" lang="csharp"> <span class="k">else</span></span>
<span id="LC298" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC299" class="line" lang="csharp"> <span class="n">shareId</span> <span class="p">=</span> <span class="n">Guid</span><span class="p">.</span><span class="nf">NewGuid</span><span class="p">();</span></span>
<span id="LC300" class="line" lang="csharp"> <span class="k">await</span> <span class="n">_db</span><span class="p">.</span><span class="nf">Insert</span><span class="p">(</span><span class="k">new</span> <span class="n">DataEntity</span><span class="p">.</span><span class="nf">UserShare</span><span class="p">()</span></span>
<span id="LC301" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC302" class="line" lang="csharp"> <span class="n">Id</span> <span class="p">=</span> <span class="n">shareId</span><span class="p">,</span></span>
<span id="LC303" class="line" lang="csharp"> <span class="n">UserId</span> <span class="p">=</span> <span class="n">userId</span><span class="p">,</span></span>
<span id="LC304" class="line" lang="csharp"> <span class="n">GameId</span> <span class="p">=</span> <span class="n">gameId</span><span class="p">,</span></span>
<span id="LC305" class="line" lang="csharp"> <span class="n">ServerId</span> <span class="p">=</span> <span class="n">serverId</span></span>
<span id="LC306" class="line" lang="csharp"> <span class="p">});</span></span>
<span id="LC307" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC308" class="line" lang="csharp"></span>
<span id="LC309" class="line" lang="csharp"> <span class="kt">string</span> <span class="n">path</span> <span class="p">=</span> <span class="p">(</span><span class="n">type</span> <span class="p">==</span> <span class="n">ActivityPosterType</span><span class="p">.</span><span class="n">Invitation</span> <span class="p">||</span> <span class="n">type</span> <span class="p">==</span> <span class="n">ActivityPosterType</span><span class="p">.</span><span class="n">ShowIncome</span><span class="p">)</span> <span class="p">?</span> <span class="s">"poster/invite"</span> <span class="p">:</span> <span class="s">"poster/awaken"</span><span class="p">;</span></span>
<span id="LC310" class="line" lang="csharp"> <span class="k">return</span> <span class="s">$"</span><span class="p">{</span><span class="n">Settings</span><span class="p">.</span><span class="n">MobWebDeployUrl</span><span class="p">.</span><span class="nf">TrimEnd</span><span class="p">(</span><span class="sc">'/'</span><span class="p">)}</span><span class="s">/</span><span class="p">{</span><span class="n">path</span><span class="p">}</span><span class="s">/</span><span class="p">{</span><span class="n">shareId</span><span class="p">.</span><span class="nf">ToString</span><span class="p">(</span><span class="s">"N"</span><span class="p">)}</span><span class="s">"</span><span class="p">;</span></span>
<span id="LC311" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC312" class="line" lang="csharp"></span>
<span id="LC313" class="line" lang="csharp"> <span class="c1">/// <summary></span></span>
<span id="LC314" class="line" lang="csharp"> <span class="c1">/// 生成二维码位图</span></span>
<span id="LC315" class="line" lang="csharp"> <span class="c1">/// </summary></span></span>
<span id="LC316" class="line" lang="csharp"> <span class="c1">/// <param name="content">二维码内容</param></span></span>
<span id="LC317" class="line" lang="csharp"> <span class="c1">/// <param name="width">宽度</param></span></span>
<span id="LC318" class="line" lang="csharp"> <span class="c1">/// <param name="height">高度</param></span></span>
<span id="LC319" class="line" lang="csharp"> <span class="c1">/// <returns></returns></span></span>
<span id="LC320" class="line" lang="csharp"> <span class="k">private</span> <span class="n">Bitmap</span> <span class="nf">GenerateQRCode</span><span class="p">(</span><span class="kt">string</span> <span class="n">content</span><span class="p">,</span> <span class="kt">int</span> <span class="n">width</span><span class="p">,</span> <span class="kt">int</span> <span class="n">height</span><span class="p">)</span></span>
<span id="LC321" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC322" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">qrWriter</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">BarcodeWriterPixelData</span><span class="p">()</span></span>
<span id="LC323" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC324" class="line" lang="csharp"> <span class="n">Format</span> <span class="p">=</span> <span class="n">BarcodeFormat</span><span class="p">.</span><span class="n">QR_CODE</span><span class="p">,</span></span>
<span id="LC325" class="line" lang="csharp"> <span class="n">Options</span> <span class="p">=</span> <span class="k">new</span> <span class="n">QrCodeEncodingOptions</span> <span class="p">{</span> <span class="n">Width</span> <span class="p">=</span> <span class="n">width</span><span class="p">,</span> <span class="n">Height</span> <span class="p">=</span> <span class="n">height</span><span class="p">,</span> <span class="n">Margin</span> <span class="p">=</span> <span class="m">0</span> <span class="p">}</span></span>
<span id="LC326" class="line" lang="csharp"> <span class="p">};</span></span>
<span id="LC327" class="line" lang="csharp"></span>
<span id="LC328" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">pixelData</span> <span class="p">=</span> <span class="n">qrWriter</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="n">content</span><span class="p">);</span></span>
<span id="LC329" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">qrImage</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Bitmap</span><span class="p">(</span><span class="n">pixelData</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span> <span class="n">pixelData</span><span class="p">.</span><span class="n">Height</span><span class="p">,</span> <span class="n">PixelFormat</span><span class="p">.</span><span class="n">Format32bppRgb</span><span class="p">);</span></span>
<span id="LC330" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">qrData</span> <span class="p">=</span> <span class="n">qrImage</span><span class="p">.</span><span class="nf">LockBits</span><span class="p">(</span></span>
<span id="LC331" class="line" lang="csharp"> <span class="k">new</span> <span class="nf">Rectangle</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">pixelData</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span> <span class="n">pixelData</span><span class="p">.</span><span class="n">Height</span><span class="p">),</span></span>
<span id="LC332" class="line" lang="csharp"> <span class="n">ImageLockMode</span><span class="p">.</span><span class="n">WriteOnly</span><span class="p">,</span></span>
<span id="LC333" class="line" lang="csharp"> <span class="n">PixelFormat</span><span class="p">.</span><span class="n">Format32bppRgb</span><span class="p">);</span></span>
<span id="LC334" class="line" lang="csharp"></span>
<span id="LC335" class="line" lang="csharp"> <span class="k">try</span></span>
<span id="LC336" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC337" class="line" lang="csharp"> <span class="n">Marshal</span><span class="p">.</span><span class="nf">Copy</span><span class="p">(</span><span class="n">pixelData</span><span class="p">.</span><span class="n">Pixels</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">qrData</span><span class="p">.</span><span class="n">Scan0</span><span class="p">,</span> <span class="n">pixelData</span><span class="p">.</span><span class="n">Pixels</span><span class="p">.</span><span class="n">Length</span><span class="p">);</span></span>
<span id="LC338" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC339" class="line" lang="csharp"> <span class="k">finally</span></span>
<span id="LC340" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC341" class="line" lang="csharp"> <span class="n">qrImage</span><span class="p">.</span><span class="nf">UnlockBits</span><span class="p">(</span><span class="n">qrData</span><span class="p">);</span></span>
<span id="LC342" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC343" class="line" lang="csharp"></span>
<span id="LC344" class="line" lang="csharp"> <span class="k">return</span> <span class="n">qrImage</span><span class="p">;</span></span>
<span id="LC345" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC346" class="line" lang="csharp"></span>
<span id="LC347" class="line" lang="csharp"> <span class="k">private</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="kt">byte</span><span class="p">[</span><span class="k">]></span> <span class="nf">GetPosterImage</span><span class="p">(</span><span class="n">Guid</span> <span class="n">activityId</span><span class="p">,</span> <span class="n">ActivityPosterType</span> <span class="n">type</span><span class="p">)</span></span>
<span id="LC348" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC349" class="line" lang="csharp"> <span class="kt">var</span> <span class="n">poster</span> <span class="p">=</span> <span class="p">(</span><span class="k">await</span> <span class="n">_db</span><span class="p">.</span><span class="n">Get</span><span class="p"><</span><span class="n">DataEntity</span><span class="p">.</span><span class="n">ActivityPoster</span><span class="p">>(</span><span class="n">i</span></span>
<span id="LC350" class="line" lang="csharp"> <span class="p">=></span> <span class="n">i</span><span class="p">.</span><span class="n">ActivityId</span> <span class="p">==</span> <span class="n">activityId</span></span>
<span id="LC351" class="line" lang="csharp"> <span class="p">&&</span> <span class="n">i</span><span class="p">.</span><span class="n">Type</span> <span class="p">==</span> <span class="n">type</span><span class="p">)).</span><span class="nf">SingleOrDefault</span><span class="p">();</span></span>
<span id="LC352" class="line" lang="csharp"></span>
<span id="LC353" class="line" lang="csharp"> <span class="k">if</span> <span class="p">(</span><span class="n">poster</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span></span>
<span id="LC354" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC355" class="line" lang="csharp"> <span class="k">return</span> <span class="n">poster</span><span class="p">.</span><span class="n">Image</span><span class="p">;</span></span>
<span id="LC356" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC357" class="line" lang="csharp"> <span class="k">else</span></span>
<span id="LC358" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC359" class="line" lang="csharp"> <span class="k">return</span> <span class="n">Settings</span><span class="p">.</span><span class="n">DefaultPosterImage</span><span class="p">;</span></span>
<span id="LC360" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC361" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC362" class="line" lang="csharp"></span>
<span id="LC363" class="line" lang="csharp"> <span class="k">private</span> <span class="k">async</span> <span class="n">Task</span><span class="p"><</span><span class="kt">bool</span><span class="p">></span> <span class="nf">ValidateMobBinding</span><span class="p">(</span><span class="kt">int</span> <span class="n">userId</span><span class="p">,</span> <span class="kt">int</span> <span class="n">gameId</span><span class="p">)</span></span>
<span id="LC364" class="line" lang="csharp"> <span class="p">{</span></span>
<span id="LC365" class="line" lang="csharp"> <span class="k">return</span> <span class="p">(</span><span class="k">await</span> <span class="nf">GetUserMobBinding</span><span class="p">(</span><span class="n">gameId</span><span class="p">,</span> <span class="n">userId</span><span class="p">))</span> <span class="p">!=</span> <span class="k">null</span><span class="p">;</span></span>
<span id="LC366" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC367" class="line" lang="csharp"> <span class="p">}</span></span>
<span id="LC368" class="line" lang="csharp"><span class="p">}</span></span>