-
Notifications
You must be signed in to change notification settings - Fork 0
/
Global.asax.cs
152 lines (148 loc) · 7.43 KB
/
Global.asax.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Auction.Controllers;
using System.Threading;
using Auction.Models;
using System.Threading.Tasks;
using System.Data.Entity;
using Exchange = Microsoft.Exchange.WebServices.Data;
using System.Net;
namespace Auction
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
int num = 0;
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//Устанавливаем метод обратного вызова
TimerCallback tm = new TimerCallback(ReloadItem);
//Устанавливаем время, через которое должен сработать таймер
TimeSpan start = AppSettings.Start - DateTime.Now;
//Устанавливаем таймер
Timer timer = new Timer(tm, num, start, AppSettings.Period);
}
protected void Application_Error(object sender, EventArgs e)
{
//Отлавливаем ошибки
var exception = Server.GetLastError();
var httpException = exception as HttpException;
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Error";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
Response.StatusCode = 500;
if (httpException != null)
{
Response.StatusCode = httpException.GetHttpCode();
switch (Response.StatusCode)
{
case 403:
routeData.Values["action"] = "Http403";
break;
case 404:
routeData.Values["action"] = "Http404";
break;
}
}
Response.TrySkipIisCustomErrors = true;
IController errorsController = new ErrorController();
HttpContextWrapper wrapper = new HttpContextWrapper(Context);
var rc = new RequestContext(wrapper, routeData);
errorsController.Execute(rc);
}
public static void ReloadItem(object obj)
{
lock(HomeController._padLock)
using (AuctionContext db = new AuctionContext())
{
//Получаем список товаров, которые должны обновляться каждый час
List<Item> tItems = db.Items.Where(t => t.Reload == "true").ToList();
if(tItems.Count != 0)
{
//Если такие товары есть, обновляем их
foreach (var item in tItems)
{
if (item.TimeOut <= DateTime.Now)
{
//Если их время вышло, меняем таймер
item.Timer = "http://megatimer.ru/s/ed67c6f0fab237c3ca2b7335c90a68b2.js";
}
else if (item.LastBet > item.DefaultBet)
{
//Если время не вышло и последняя ставка не равна ставке по умолчанию, то вычитаем из количества товара единицу
item.Quantity -= 1;
//Последнюю ставку приравниваем к ставке по умолчанию
item.LastBet = item.DefaultBet;
//Устанавливаем пользователя сделавшего последнюю ставку
item.LastUser = "Empty";
//Добавляем победителя
Winner win = new Winner() { ItemId = item.Id, ItemName = item.Name, User = item.LastUser };
db.Winners.Add(win);
//Получаем его Email
string Email = db.Users.FirstOrDefault(t => t.Login == win.User).Email;
//Отправляем сообщение победителю
SendEmail(Email, item.Name);
}
else
{
//Если время не вышло но последняя ставка равна ставке по умолчанию, то продливаем товар на один час
item.TimeOut += new TimeSpan(1, 0, 0);
}
//Изменяем данные товара
db.Entry(item).State = EntityState.Modified;
}
//Сохраняем изменения
db.SaveChanges();
}
if (AppSettings.End <= DateTime.Now)
{
List<Item> fItems = db.Items.Where(t => t.Reload == "false").ToList();
List<Winner> winners = db.Winners.ToList();
if (fItems.Count != 0)
{
foreach (var item in fItems)
{
if(!winners.Any(t => t.ItemId == item.Id))
{
//Добавляем победителя
Winner win = new Winner() { ItemId = item.Id, ItemName = item.Name, User = item.LastUser };
db.Winners.Add(win);
//Получаем его Email
string Email = db.Users.FirstOrDefault(t => t.Login == win.User).Email;
//Отправляем сообщение победителю
SendEmail(Email, item.Name);
}
}
db.SaveChanges();
}
}
}
}
//Функция отправки сообщений на Email
public static Task SendEmail(string GetEmail, string itemName)
{
return Task.Run(() =>
{
Exchange.ExchangeService service = new Exchange.ExchangeService();
service.Credentials = new NetworkCredential(AppSettings.SendEmail, AppSettings.SendEmailPassword);
service.AutodiscoverUrl(AppSettings.SendEmail);
Exchange.EmailMessage emailMessage = new Exchange.EmailMessage(service);
emailMessage.Subject = "Аукцион #ProКачка - Вы выиграли приз!";
emailMessage.Body = new Exchange.MessageBody("Поздравляем, вы выиграли " + itemName + " на нашем аукционе #ProКачка.");
emailMessage.ToRecipients.Add(GetEmail);
emailMessage.Send();
});
}
}
}